<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Marc Nuri - Blogging about business and technology</title>
        <link>https://blog.marcnuri.com</link>
        <description>Blogging about business and technology</description>
        <lastBuildDate>Wed, 07 Oct 2026 05:14:57 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>www.marcnuri.com</generator>
        <language>en-US</language>
        <atom:link href="https://blog.marcnuri.com/feed.xml" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Fabric8 Kubernetes Client 8.0 is now available!]]></title>
            <link>https://blog.marcnuri.com/fabric8-kubernetes-client-8-0</link>
            <guid isPermaLink="false">https://blog.marcnuri.com/fabric8-kubernetes-client-8-0</guid>
            <pubDate>Fri, 25 Sep 2026 06:30:00 GMT</pubDate>
            <description><![CDATA[Fabric8 Kubernetes Client 8.0 is available! Check out the major changes and learn how you can contribute.]]></description>
            <content:encoded><![CDATA[
    <div><a href="https://blog.marcnuri.com/fabric8-kubernetes-client-8-0">Original post</a></div>
    <p>On behalf of the <a href="/kubernetes-client-java-fabric8-introduction" class="post-link " title="Kubernetes Client for Java: Fabric8 introduction">Fabric8</a>
team and everyone who has contributed, I&#x27;m happy to announce that the Fabric8 Kubernetes Client <code>8.0.0</code> has been
<a href="https://github.com/fabric8io/kubernetes-client/releases/tag/v8.0.0" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client/releases/tag/v8.0.0" aria-label="released" target="_blank">released</a> and is now available from
<a href="https://repo1.maven.org/maven2/io/fabric8/kubernetes-client/8.0.0/" rel="noopener" title="Link to https://repo1.maven.org/maven2/io/fabric8/kubernetes-client/8.0.0/" aria-label="Maven Central" target="_blank">Maven Central</a> 🎉.</p>
<p>This marks the eighth major release of the Fabric8 Kubernetes Client.
As we anticipated in the <a href="/fabric8-kubernetes-client-7-9" class="post-link " title="Fabric8 Kubernetes Client 7.9 is now available!">7.9 announcement</a>, it raises the Java baseline, moves the serialization stack to Jackson 3, and switches the default HTTP client to Vert.x 5.
To assist you with the transition, we&#x27;ve prepared a
<a href="https://github.com/fabric8io/kubernetes-client/blob/main/doc/MIGRATION-v8.md" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client/blob/main/doc/MIGRATION-v8.md" aria-label="migration guide" target="_blank">migration guide</a>
to help you update your code to this new version.</p>
<p>Thanks to all of you who have contributed with issue reports, pull requests, feedback, and spreading the word with blogs, videos, comments, and so on.
We really appreciate your help, keep it up!</p>
<h2 class="heading"><span id="whats-new"></span>What&#x27;s new?<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-8-0#whats-new" aria-label="whats-new permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>Without further ado, let&#x27;s have a look at the most significant updates:</p>
<ul>
<li><a href="/fabric8-kubernetes-client-8-0#java-17" class="post-link " title="Link to the Java 17 section">Java 17 as the minimum supported version</a></li>
<li><a href="/fabric8-kubernetes-client-8-0#jackson-3" class="post-link " title="Link to the Jackson 3 section">Jackson 3</a></li>
<li><a href="/fabric8-kubernetes-client-8-0#http-clients" class="post-link " title="Link to the HTTP clients section">Vert.x 5 as the default HttpClient, Jetty 12, and proxy fixes</a></li>
<li><a href="/fabric8-kubernetes-client-8-0#crd-generator" class="post-link " title="Link to the CRD Generator section">CRD Generator: v1 removed and schemas that match what the client writes</a></li>
<li><a href="/fabric8-kubernetes-client-8-0#dsl-and-model-updates" class="post-link " title="Link to the typed DSL and model updates section">Typed DSL and model updates</a></li>
<li>🐛 Many other bug fixes and minor improvements</li>
</ul>
<p>You can find the full changelog for this version in our GitHub <a href="https://github.com/fabric8io/kubernetes-client/releases/tag/v8.0.0" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client/releases/tag/v8.0.0" aria-label="release page" target="_blank">release page</a>.</p>
<p>Be sure to check out the <a href="https://github.com/fabric8io/kubernetes-client/blob/main/doc/MIGRATION-v8.md" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client/blob/main/doc/MIGRATION-v8.md" aria-label="migration guide" target="_blank">migration guide</a> for a smooth upgrade.</p>
<h3 class="heading"><span id="java-17"></span>Java 17 as the minimum supported version<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-8-0#java-17" aria-label="java-17 permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h3>
<p>Starting with this release, the Fabric8 Kubernetes Client no longer supports Java 11.
The minimum supported version is now <strong>Java 17</strong>, the oldest release that still receives broad support across vendors.</p>
<p>The new baseline applies to the build too, not only to the runtime.
The Maven plugins, the Gradle plugin, and the annotation processor now require a Java 17+ JVM to run your build, and the OSGi bundles declare <code>osgi.ee=JavaSE 17</code>.
If you deploy on Karaf, note that the <code>kubernetes-karaf</code> feature repository no longer defines its own <code>scr</code> feature and relies on the one provided by the Karaf distribution instead.</p>
<h3 class="heading"><span id="jackson-3"></span>Jackson 3<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-8-0#jackson-3" aria-label="jackson-3 permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h3>
<p>The client has moved from Jackson 2.x to Jackson 3 (<code>3.2.1</code>), which means the new <code>tools.jackson</code> Maven coordinates and Java packages.
If your code only deals with the Kubernetes model and the client DSL, you shouldn&#x27;t notice the change.
The default serialization keeps the Jackson 2 behavior for your custom types, so the resources you send to the cluster look the same as they did in 7.x.</p>
<p>If your code uses Jackson directly (custom serializers and deserializers, annotations on your custom resource classes, or mappers you build yourself), you&#x27;ll need to update it.
Jackson 3 relocates several annotations and renames <code>JsonSerializer</code> and <code>JsonDeserializer</code> to <code>ValueSerializer</code> and <code>ValueDeserializer</code>.
For mappers you build yourself, the migration guide explains how to keep the 7.x wire format for types such as <code>Year</code>, <code>Month</code>, <code>java.sql.Date</code>, and <code>Locale</code> with the new <code>Jackson2JdkTypesModule</code>.</p>
<p>Please, check the <a href="https://github.com/fabric8io/kubernetes-client/blob/main/doc/MIGRATION-v8.md#jackson-3" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client/blob/main/doc/MIGRATION-v8.md#jackson-3" aria-label="Jackson 3 section of the migration guide" target="_blank">Jackson 3 section of the migration guide</a> for the details.</p>
<h3 class="heading"><span id="http-clients"></span>Vert.x 5 as the default HttpClient, Jetty 12, and proxy fixes<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-8-0#http-clients" aria-label="http-clients permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h3>
<p>The <code>kubernetes-client</code> and <code>openshift-client</code> artifacts now default to the Vert.x 5 HttpClient implementation (<code>kubernetes-httpclient-vertx-5</code>) instead of the Vert.x 4 one.
For most users, this change should be seamless.
If you need to stay on Vert.x 4 for now, you can exclude <code>kubernetes-httpclient-vertx-5</code>, add <code>kubernetes-httpclient-vertx</code>, and pin the Vert.x artifacts to 4.x, as described in the <a href="https://github.com/fabric8io/kubernetes-client/blob/main/doc/MIGRATION-v8.md#vertx4-httpclient" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client/blob/main/doc/MIGRATION-v8.md#vertx4-httpclient" aria-label="migration guide" target="_blank">migration guide</a>.</p>
<p>The optional <code>kubernetes-httpclient-jetty</code> module has moved from Jetty 11 to Jetty 12.1.
Since Jetty 12 can&#x27;t coexist with earlier Jetty versions on the classpath, check the <a href="https://github.com/fabric8io/kubernetes-client/blob/main/doc/MIGRATION-v8.md#jetty-12" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client/blob/main/doc/MIGRATION-v8.md#jetty-12" aria-label="Jetty 12 section" target="_blank">Jetty 12 section</a> if your application depends on Jetty too.</p>
<p>This release also brings a round of fixes across the HttpClient implementations:</p>
<ul>
<li>Proxy credentials are sent only to the proxy.
In several combinations of HttpClient implementation and request type (HTTPS, WebSocket, or SOCKS), they could travel through the proxy tunnel and reach the API server.</li>
<li>Proxy passwords containing a colon, proxy URLs with a user and no password, and SOCKS5 proxy credentials are now handled correctly.</li>
<li>The Vert.x, Jetty, and JDK clients now send a WebSocket ping every <code>Config#websocketPingInterval</code> (30 seconds by default), like OkHttp already did, so load balancers that close idle connections no longer drop quiet watches.</li>
<li>Requests no longer hang when a retry action, a retry decision, or the response cleanup throws an exception.</li>
</ul>
<h3 class="heading"><span id="crd-generator"></span>CRD Generator: v1 removed and schemas that match what the client writes<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-8-0#crd-generator" aria-label="crd-generator permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h3>
<p>The CRD Generator v1 (<code>crd-generator-api</code> and <code>crd-generator-apt</code>), deprecated since 7.0, has been removed.
If you are still using it, migrate to the CRD Generator v2 with the Maven plugin, the CLI tool, or the Gradle build script recipe.
The <a href="https://github.com/fabric8io/kubernetes-client/blob/main/doc/CRD-generator-migration-v2.md" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client/blob/main/doc/CRD-generator-migration-v2.md" aria-label="CRD Generator v2 migration guide" target="_blank">CRD Generator v2 migration guide</a> walks you through the process.
Beware: dropping the dependency without adding a replacement fails silently, since an absent annotation processor produces no compiler diagnostic.</p>
<p>The generated schemas have also been aligned with what the client actually writes, so the API server no longer prunes or rejects your data:</p>
<ul>
<li><code>Object</code>, raw <code>Map</code>, <code>List&lt;Object&gt;</code>, raw collection, <code>@JsonUnwrapped</code>, and polymorphic properties keep their content.</li>
<li>Date and time types only declare a format their values match.</li>
<li><code>byte[]</code>, <code>ByteBuffer</code>, <code>char[]</code>, <code>Year</code>, and <code>java.sql.Date</code> get schemas that match their serialized form.</li>
<li><code>int</code>/<code>Integer</code> and <code>long</code>/<code>Long</code> properties get <code>format: int32</code> and <code>format: int64</code>, like controller-gen.</li>
</ul>
<p>Since the generated CRDs change, review them before applying them to your clusters.
The <a href="https://github.com/fabric8io/kubernetes-client/blob/main/doc/MIGRATION-v8.md#jackson-3-crd-generator" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client/blob/main/doc/MIGRATION-v8.md#jackson-3-crd-generator" aria-label="Generated CRDs section" target="_blank">Generated CRDs section</a> of the migration guide lists what&#x27;s different.</p>
<h3 class="heading"><span id="dsl-and-model-updates"></span>Typed DSL and model updates<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-8-0#dsl-and-model-updates" aria-label="dsl-and-model-updates permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h3>
<p>The client DSL now provides typed entry points for the resources added in Kubernetes 1.37, such as <code>certificates().v1().podCertificateRequests()</code>, <code>dynamicResourceAllocation().v1().deviceTaintRules()</code>, <code>storageMigration().v1().storageVersionMigrations()</code>, and the <code>scheduling().v1beta1()</code> <code>podGroups()</code> and <code>workloads()</code>.</p>
<p>The unversioned <code>runtimeClasses()</code> and <code>network().ingresses()</code> entry points now use the <code>v1</code> models instead of the <code>v1beta1</code> ones that Kubernetes no longer serves.</p>
<p>The shard selector support introduced in 7.8 gains a typed <code>ShardSelector</code>, so you no longer need to write the <code>shardRange(...)</code> CEL expression and its hexadecimal bounds by hand:</p>
<div class="code" style="background:#232323"><pre style="display:block;overflow-x:auto;padding:0.5em;background:#232323;color:#e6e1dc"><code class="language-java" style="white-space:pre"><span>client.pods()
</span><span>  .withShardSelector(ShardSelector.builder().addShard(</span><span style="color:#a5c261">0</span><span>, </span><span style="color:#a5c261">4</span><span>).addShard(</span><span style="color:#a5c261">2</span><span>, </span><span style="color:#a5c261">4</span><span>).build())
</span>  .list();</code></pre></div>
<p>As a consequence, a literal <code>withShardSelector(null)</code> no longer compiles; cast it to <code>(String) null</code> instead.</p>
<p>Finally, the bundled extension models follow their upstream projects, and some of these upgrades bring breaking changes of their own.
If you use the OpenShift, Open Cluster Management, Tekton, or Knative models, check the breaking changes in the <a href="https://github.com/fabric8io/kubernetes-client/releases/tag/v8.0.0" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client/releases/tag/v8.0.0" aria-label="release page" target="_blank">release page</a>.</p>
<h2 class="heading"><span id="using-this-release"></span>Using this release<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-8-0#using-this-release" aria-label="using-this-release permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>If your project is based on Maven, you just need to add the Fabric8 Kubernetes Client to your Maven dependencies:</p>
<div class="code" style="background:#232323"><pre style="display:block;overflow-x:auto;padding:0.5em;background:#232323;color:#e6e1dc"><code class="language-xml" style="white-space:pre"><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">dependency</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span>  </span><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">groupId</span><span style="color:#e8bf6a">&gt;</span><span>io.fabric8</span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">groupId</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span>  </span><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">artifactId</span><span style="color:#e8bf6a">&gt;</span><span>kubernetes-client</span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">artifactId</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span>  </span><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">version</span><span style="color:#e8bf6a">&gt;</span><span>8.0.0</span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">version</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span></span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">dependency</span><span style="color:#e8bf6a">&gt;</span></code></pre></div>
<p>If your project is based on Gradle, you just need to add the Fabric8 Kubernetes Client to your Gradle dependencies:</p>
<div class="code" style="background:#232323"><pre style="display:block;overflow-x:auto;padding:0.5em;background:#232323;color:#e6e1dc"><code class="language-groovy" style="white-space:pre"><span>dependencies {
</span><span>  api </span><span style="color:#a5c261">&quot;io.fabric8:kubernetes-client:8.0.0&quot;</span><span>
</span>}</code></pre></div>
<p>Once your project is ready, you can create a new instance of the client to perform operations.
In the following code snippet, I show you how to instantiate the client and retrieve a list of Pods:</p>
<div class="code" style="background:#232323"><pre style="display:block;overflow-x:auto;padding:0.5em;background:#232323;color:#e6e1dc"><code class="language-java" style="white-space:pre"><span style="color:#c26230">try</span><span> (KubernetesClient client = </span><span style="color:#c26230">new</span><span> KubernetesClientBuilder().build()) {
</span>  client.pods().list().getItems().forEach(p -&gt; System.out.println(p.getMetadata().getName()));
}</code></pre></div>
<h2 class="heading"><span id="how-can-you-help"></span>How can you help?<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-8-0#how-can-you-help" aria-label="how-can-you-help permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>If you&#x27;re interested in helping out and are a first-time contributor, check out
the <a href="https://github.com/fabric8io/kubernetes-client/labels/good%20first%20issue" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client/labels/good%20first%20issue" aria-label="&quot;good first issue&quot;" target="_blank">&quot;good first issue&quot;</a> tag in the issue repository.
We&#x27;ve tagged extremely easy issues so that you can get started contributing to Open Source.</p>
<p>We&#x27;re also excited to read articles and posts mentioning our project and sharing the user experience.
Giving a star to the project, and spreading the word in general, helps us reach more users and broaden the
feedback. Feedback is the only way to improve.</p>
<p><a href="https://github.com/fabric8io/kubernetes-client" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client" aria-label="Project Page" target="_blank">Project Page</a> |
<a href="https://github.com/fabric8io/kubernetes-client/issues" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client/issues" aria-label="Issues" target="_blank">Issues</a> |
<a href="https://github.com/fabric8io/kubernetes-client/discussions" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client/discussions" aria-label="Discussions" target="_blank">Discussions</a> |
<a href="https://gitter.im/fabric8io/kubernetes-client" rel="noopener" title="Link to https://gitter.im/fabric8io/kubernetes-client" aria-label="Gitter" target="_blank">Gitter</a> |
<a href="https://stackoverflow.com/questions/tagged/fabric8" rel="noopener" title="Link to https://stackoverflow.com/questions/tagged/fabric8" aria-label="Stack Overflow" target="_blank">Stack Overflow</a></p>
<span class="post-image__pusher "></span><figure class="post-image "><span class="post-image__scrim"></span><a href="/assets/fabric8-logo.Df3cxiZJ_Z1lh3K4.png" class="post-image__link" title="The logo of Fabric8 Kubernetes Client"><span class="post-image__image-container"><picture><source type="image/webp" srcset="https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_253Alb.webp 269w,https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_Z2lDHOW.webp 539w,https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_o2X4Q.webp 1077w" sizes="(min-width: 1077px) 1077px, 100vw"><img sizes="(min-width: 1077px) 1077px, 100vw" decoding="async" loading="lazy" src="https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_Z1lh3K4.png" srcset="https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_qRUEO.png 269w,https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_Z2p4VEM.png 539w,https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_Z1lh3K4.png 1077w" alt="The logo of Fabric8 Kubernetes Client" style="aspect-ratio:1077 / 361;--image-width:1077px"></picture></span></a></figure>
  ]]></content:encoded>
            <category>Cloud Native</category>
            <enclosure url="https://blog.marcnuri.com/assets/fabric8.B0BQP5Cf_j0pJB.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Fabric8 Kubernetes Client 7.9 is now available!]]></title>
            <link>https://blog.marcnuri.com/fabric8-kubernetes-client-7-9</link>
            <guid isPermaLink="false">https://blog.marcnuri.com/fabric8-kubernetes-client-7-9</guid>
            <pubDate>Mon, 07 Sep 2026 08:30:00 GMT</pubDate>
            <description><![CDATA[Fabric8 Kubernetes Client 7.9 is available! Check out the major changes and learn how you can contribute.]]></description>
            <content:encoded><![CDATA[
    <div><a href="https://blog.marcnuri.com/fabric8-kubernetes-client-7-9">Original post</a></div>
    <div class="admonition admonition__note"><p class="admonition-title"><i class="admonition-title-icon fa-solid fa-circle-info"></i>Note</p><div class="admonition-content">A newer version of Fabric8 Kubernetes Client is available, jump to <a href="/fabric8-kubernetes-client-8-0" class="post-link " title="Fabric8 Kubernetes Client 8.0 is now available!">Fabric8 Kubernetes Client 8.0 announcement</a>.</div></div>
<p>On behalf of the <a href="/kubernetes-client-java-fabric8-introduction" class="post-link " title="Kubernetes Client for Java: Fabric8 introduction">Fabric8</a>
team and everyone who has contributed, I&#x27;m happy to announce that the Fabric8 Kubernetes Client <code>7.9.0</code> has been
<a href="https://github.com/fabric8io/kubernetes-client/releases/tag/v7.9.0" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client/releases/tag/v7.9.0" aria-label="released" target="_blank">released</a> and is now available from
<a href="https://repo1.maven.org/maven2/io/fabric8/kubernetes-client/7.9.0/" rel="noopener" title="Link to https://repo1.maven.org/maven2/io/fabric8/kubernetes-client/7.9.0/" aria-label="Maven Central" target="_blank">Maven Central</a> 🎉.</p>
<p>This marks the ninth minor release of the Fabric8 Kubernetes Client 7, bringing new features, bug fixes, and improvements while keeping the breaking changes minimal.</p>
<p>Thanks to all of you who have contributed with issue reports, pull requests, feedback, and spreading the word with blogs, videos, comments, and so on.
We really appreciate your help, keep it up!</p>
<h2 class="heading"><span id="looking-ahead"></span>Looking ahead to 8.0<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-7-9#looking-ahead" aria-label="looking-ahead permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<div class="admonition admonition__important"><p class="admonition-title"><i class="admonition-title-icon fa-solid fa-exclamation-circle"></i>Important</p><div class="admonition-content">
<p>This is expected to be the last minor release in the 7.x line. From now on, version 7 moves to best-effort support: we&#x27;ll keep addressing bug reports and security issues, but new features and enhancements will land only in 8.0.</p>
</div></div>
<p>With 7.x settling into maintenance, we&#x27;re shifting our focus to the next major version, Fabric8 Kubernetes Client 8.0.
The three headline changes we&#x27;re planning are:</p>
<ul>
<li>A new JDK baseline: the minimum required version moves up to Java 17, so Java 11 will no longer be supported.</li>
<li>A migration to Jackson 3.x, replacing the current Jackson 2.x serialization stack.</li>
<li>A new default HTTP client: the transport switches from Vert.x 4 to Vert.x 5.</li>
</ul>
<p>We&#x27;ll share more details as 8.0 takes shape, so keep an eye out and start planning your upgrade path if any of these changes affect your setup.</p>
<h2 class="heading"><span id="whats-new"></span>What&#x27;s new?<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-7-9#whats-new" aria-label="whats-new permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>Without further ado, let&#x27;s have a look at the most significant updates:</p>
<ul>
<li><a href="/fabric8-kubernetes-client-7-9#kubernetes-137" class="post-link " title="Link to the Kubernetes 1.37 section">Kubernetes 1.37 support (Garhwal)</a></li>
<li><a href="/fabric8-kubernetes-client-7-9#gateway-api" class="post-link " title="Link to the Gateway API section">Gateway API 1.6 with TCPRoute and UDPRoute</a></li>
<li><a href="/fabric8-kubernetes-client-7-9#websocket-reliability" class="post-link " title="Link to the WebSocket reliability section">WebSocket reliability on the Vert.x 5 and Jetty HTTP clients</a></li>
<li><a href="/fabric8-kubernetes-client-7-9#java-generator-hardening" class="post-link " title="Link to the Java generator section">Java generator hardened against code injection</a></li>
<li>🐛 Many other bug fixes and minor improvements</li>
</ul>
<p>You can find the full changelog for this version in our GitHub <a href="https://github.com/fabric8io/kubernetes-client/releases/tag/v7.9.0" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client/releases/tag/v7.9.0" aria-label="release page" target="_blank">release page</a>.</p>
<h3 class="heading"><span id="kubernetes-137"></span>Kubernetes 1.37 support (Garhwal)<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-7-9#kubernetes-137" aria-label="kubernetes-137 permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h3>
<p>This release adds support for Kubernetes v1.37.0 (Garhwal), keeping the client&#x27;s model in sync with the latest Kubernetes API.</p>
<p>Along with the new APIs, several API versions that were removed upstream in Kubernetes v1.37.0 are no longer available in the client:</p>
<ul>
<li><code>certificates.k8s.io/v1alpha1/ClusterTrustBundle</code>; use <code>certificates.k8s.io/v1</code> or <code>v1beta1</code></li>
<li><code>networking.k8s.io/v1beta1/IPAddress</code> and <code>ServiceCIDR</code>; use <code>networking.k8s.io/v1</code></li>
<li><code>storage.k8s.io/v1beta1/VolumeAttributesClass</code>; use <code>storage.k8s.io/v1</code></li>
<li><code>scheduling.k8s.io/v1alpha2</code> (the entire API version, 28 types); use <code>v1alpha3</code> or <code>v1beta1</code></li>
</ul>
<p>The canonical <code>VolumeMount</code> constructor signature has also changed to accommodate the new <code>bindMountOptions</code> field.
If you build your resources with the fluent builders (<code>new VolumeMountBuilder()...</code>), you are unaffected; only direct calls to the canonical constructor need updating.</p>
<div class="admonition admonition__note"><p class="admonition-title"><i class="admonition-title-icon fa-solid fa-circle-info"></i>Note</p><div class="admonition-content">
<p>Please note that you can still access newer Kubernetes clusters with <strong>older</strong> versions of the Fabric8 client.</p>
<p>The client provides a GenericKubernetesResources class to interact with resources that are not yet supported by the client.
We do recommend always using the <strong>latest</strong> version of the client to benefit from the latest features and bug fixes, but it&#x27;s not mandatory.</p>
</div></div>
<h3 class="heading"><span id="gateway-api"></span>Gateway API 1.6 with TCPRoute and UDPRoute<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-7-9#gateway-api" aria-label="gateway-api permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h3>
<p>The bundled Gateway API model has been updated from 1.5.1 to 1.6.1.
As a result, <code>v1.TCPRoute</code> and <code>v1.UDPRoute</code> are now available, both having graduated from <code>v1alpha2</code> upstream in Gateway API v1.6.0.
The <code>v1alpha2</code> types remain available, but upstream has deprecated them and plans to remove them in a future release, so new code should prefer the <code>v1</code> types.</p>
<p>Note that <code>v1.SessionPersistence</code> no longer exposes <code>idleTimeout</code>, which was removed upstream in Gateway API v1.6.0.
There is no runtime data loss: the class keeps its <code>additionalProperties</code>, so any YAML or JSON that still carries <code>idleTimeout</code> continues to deserialize and re-serialize intact.</p>
<h3 class="heading"><span id="websocket-reliability"></span>WebSocket reliability on the Vert.x 5 and Jetty HTTP clients<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-7-9#websocket-reliability" aria-label="websocket-reliability permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h3>
<p>A couple of important fixes land for WebSocket operations (<code>exec</code>, <code>attach</code>, <code>portForward</code>, and WebSocket-backed watches) on the optional <code>kubernetes-httpclient-vertx-5</code> and <code>kubernetes-httpclient-jetty</code> modules.</p>
<p>On the Vert.x 5 client, derived clients (those produced internally, for example, when adapting to an <code>OpenShiftClient</code> or refreshing an OAuth token) were creating a brand-new WebSocket client with no configuration, discarding the cluster trust material and the configured frame and message size limits.
Derived clients now reuse the original client&#x27;s WebSocket transport, so TLS is verified against the configured cluster CA and the limits are honored.</p>
<p>Both the Vert.x 5 and Jetty clients now also route WebSocket connections through the configured proxy, instead of connecting straight to the API server and bypassing a mandated egress proxy.
On the Vert.x 5 client, the configured connect timeout is now applied to WebSocket connections as well.</p>
<p>Note that the default bundled <code>kubernetes-httpclient-vertx</code> (Vert.x 4), OkHttp, and JDK modules were never affected, since they serve WebSockets from the same client they use for regular HTTP.</p>
<h3 class="heading"><span id="java-generator-hardening"></span>Java generator hardened against code injection<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-7-9#java-generator-hardening" aria-label="java-generator-hardening permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h3>
<p>The <code>java-generator</code> now emits all schema-controlled values (enum values, the CRD group/version/names, property names, descriptions, and defaults) as fully escaped Java string literals, so a malicious CRD schema can no longer inject executable code into the generated sources.
As a defense-in-depth measure, each generated class is also re-parsed and structurally validated before it is written, aborting generation on any residual mismatch.</p>
<h2 class="heading"><span id="using-this-release"></span>Using this release<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-7-9#using-this-release" aria-label="using-this-release permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>If your project is based on Maven, you just need to add the Fabric8 Kubernetes Client to your Maven dependencies:</p>
<div class="code" style="background:#232323"><pre style="display:block;overflow-x:auto;padding:0.5em;background:#232323;color:#e6e1dc"><code class="language-xml" style="white-space:pre"><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">dependency</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span>  </span><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">groupId</span><span style="color:#e8bf6a">&gt;</span><span>io.fabric8</span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">groupId</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span>  </span><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">artifactId</span><span style="color:#e8bf6a">&gt;</span><span>kubernetes-client</span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">artifactId</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span>  </span><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">version</span><span style="color:#e8bf6a">&gt;</span><span>7.9.0</span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">version</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span></span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">dependency</span><span style="color:#e8bf6a">&gt;</span></code></pre></div>
<p>If your project is based on Gradle, you just need to add the Fabric8 Kubernetes Client to your Gradle dependencies:</p>
<div class="code" style="background:#232323"><pre style="display:block;overflow-x:auto;padding:0.5em;background:#232323;color:#e6e1dc"><code class="language-groovy" style="white-space:pre"><span>dependencies {
</span><span>  api </span><span style="color:#a5c261">&quot;io.fabric8:kubernetes-client:7.9.0&quot;</span><span>
</span>}</code></pre></div>
<p>Once your project is ready, you can create a new instance of the client to perform operations.
In the following code snippet, I show you how to instantiate the client and retrieve a list of Pods:</p>
<div class="code" style="background:#232323"><pre style="display:block;overflow-x:auto;padding:0.5em;background:#232323;color:#e6e1dc"><code class="language-java" style="white-space:pre"><span style="color:#c26230">try</span><span> (KubernetesClient client = </span><span style="color:#c26230">new</span><span> KubernetesClientBuilder().build()) {
</span>  client.pods().list().getItems().forEach(p -&gt; System.out.println(p.getMetadata().getName()));
}</code></pre></div>
<h2 class="heading"><span id="how-can-you-help"></span>How can you help?<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-7-9#how-can-you-help" aria-label="how-can-you-help permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>If you&#x27;re interested in helping out and are a first-time contributor, check out
the <a href="https://github.com/fabric8io/kubernetes-client/labels/good%20first%20issue" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client/labels/good%20first%20issue" aria-label="&quot;good first issue&quot;" target="_blank">&quot;good first issue&quot;</a> tag in the issue repository.
We&#x27;ve tagged extremely easy issues so that you can get started contributing to Open Source.</p>
<p>We&#x27;re also excited to read articles and posts mentioning our project and sharing the user experience.
Giving a star to the project, and spreading the word in general, helps us reach more users and broaden the
feedback. Feedback is the only way to improve.</p>
<p><a href="https://github.com/fabric8io/kubernetes-client" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client" aria-label="Project Page" target="_blank">Project Page</a> |
<a href="https://github.com/fabric8io/kubernetes-client/issues" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client/issues" aria-label="Issues" target="_blank">Issues</a> |
<a href="https://github.com/fabric8io/kubernetes-client/discussions" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client/discussions" aria-label="Discussions" target="_blank">Discussions</a> |
<a href="https://gitter.im/fabric8io/kubernetes-client" rel="noopener" title="Link to https://gitter.im/fabric8io/kubernetes-client" aria-label="Gitter" target="_blank">Gitter</a> |
<a href="https://stackoverflow.com/questions/tagged/fabric8" rel="noopener" title="Link to https://stackoverflow.com/questions/tagged/fabric8" aria-label="Stack Overflow" target="_blank">Stack Overflow</a></p>
<span class="post-image__pusher "></span><figure class="post-image "><span class="post-image__scrim"></span><a href="/assets/fabric8-logo.Df3cxiZJ_Z1lh3K4.png" class="post-image__link" title="The logo of Fabric8 Kubernetes Client"><span class="post-image__image-container"><picture><source type="image/webp" srcset="https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_253Alb.webp 269w,https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_Z2lDHOW.webp 539w,https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_o2X4Q.webp 1077w" sizes="(min-width: 1077px) 1077px, 100vw"><img sizes="(min-width: 1077px) 1077px, 100vw" decoding="async" loading="lazy" src="https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_Z1lh3K4.png" srcset="https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_qRUEO.png 269w,https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_Z2p4VEM.png 539w,https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_Z1lh3K4.png 1077w" alt="The logo of Fabric8 Kubernetes Client" style="aspect-ratio:1077 / 361;--image-width:1077px"></picture></span></a></figure>
  ]]></content:encoded>
            <category>Cloud Native</category>
            <enclosure url="https://blog.marcnuri.com/assets/fabric8.B0BQP5Cf_j0pJB.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Eclipse JKube 1.20 is now available!]]></title>
            <link>https://blog.marcnuri.com/eclipse-jkube-1-20</link>
            <guid isPermaLink="false">https://blog.marcnuri.com/eclipse-jkube-1-20</guid>
            <pubDate>Wed, 22 Jul 2026 09:00:00 GMT</pubDate>
            <description><![CDATA[Eclipse JKube 1.20 is available! Check out the major changes and learn how you can contribute.]]></description>
            <content:encoded><![CDATA[
    <div><a href="https://blog.marcnuri.com/eclipse-jkube-1-20">Original post</a></div>
    <p>On behalf of the <a href="/eclipse-jkube-introduction-kubernetes-openshift" class="post-link " title="Eclipse JKube introduction: Java tools and plugins for Kubernetes and OpenShift">Eclipse JKube</a>
team and everyone who has contributed, I&#x27;m happy to announce that Eclipse JKube <code>1.20.0</code> has been
<a href="https://github.com/eclipse-jkube/jkube/releases/tag/v1.20.0" rel="noopener" title="Link to https://github.com/eclipse-jkube/jkube/releases/tag/v1.20.0" aria-label="released" target="_blank">released</a> and is now available from
<a href="https://repo1.maven.org/maven2/org/eclipse/jkube/kubernetes-maven-plugin/1.20.0/" rel="noopener" title="Link to https://repo1.maven.org/maven2/org/eclipse/jkube/kubernetes-maven-plugin/1.20.0/" aria-label="Maven Central" target="_blank">Maven Central</a> 🎉.</p>
<p>Thanks to all of you who have contributed with issue reports, pull requests, feedback, and spreading the word
with blogs, videos, comments, and so on.
We really appreciate your help, keep it up!</p>
<h2 class="heading"><span id="whats-new"></span>What&#x27;s new?<a href="https://blog.marcnuri.com/eclipse-jkube-1-20#whats-new" aria-label="whats-new permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>Without further ado, let&#x27;s have a look at the most significant updates:</p>
<ul>
<li><a href="/eclipse-jkube-1-20#jetty12" class="post-link " title="Link to the Jetty 12 section">Jetty 12 is now the default web application server</a></li>
<li><a href="/eclipse-jkube-1-20#jdk-selection" class="post-link " title="Link to the JDK selection section">Explicit JDK selection for Java generators</a></li>
<li><a href="/eclipse-jkube-1-20#image-pull-policy" class="post-link " title="Link to the image pull policy section">Fine-grained image pull policy control</a></li>
<li><a href="/eclipse-jkube-1-20#maven-compatibility" class="post-link " title="Link to the Maven compatibility section">Compatibility with Maven 3.9.13 and newer</a></li>
<li><a href="/eclipse-jkube-1-20#workload-redeploy" class="post-link " title="Link to the workload redeployment section">StatefulSet and DaemonSet redeployment fixes</a></li>
<li>Spring Boot DevTools now wires up in the Gradle <code>k8sWatch</code>/<code>ocWatch</code> tasks</li>
<li>🐛 Many other bug-fixes and minor improvements</li>
</ul>
<h3 class="heading"><span id="jetty12"></span>Jetty 12 is now the default web application server<a href="https://blog.marcnuri.com/eclipse-jkube-1-20#jetty12" aria-label="jetty12 permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h3>
<p>Web application (WAR) projects now build on top of the <code>jkube-jetty12</code> base image by default, replacing the
older <code>jkube-jetty9</code> image. Jetty 12 brings support for the Jakarta EE namespaces (<code>jakarta.*</code>) and keeps your
containers running on an actively maintained server.</p>
<p>The legacy <code>jkube-jetty9</code> image is now deprecated. If your project is a legacy Java EE web application that still
relies on the <code>javax.*</code> namespaces, you can opt back in to Jetty 9 by setting the
<code>jkube.generator.webapp.server=jetty9</code> property. Bear in mind this switch is potentially breaking for those
legacy applications, so make sure to test your deployment after upgrading.</p>
<p>On top of the new default, hot deployment now works with Jetty 12 when using <code>k8s:watch</code>/<code>oc:watch</code> in copy mode,
so you can keep iterating on your web application without rebuilding the whole image.</p>
<h3 class="heading"><span id="jdk-selection"></span>Explicit JDK selection for Java generators<a href="https://blog.marcnuri.com/eclipse-jkube-1-20#jdk-selection" aria-label="jdk-selection permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h3>
<p>You can now explicitly select the JDK version used by the base image for Java generators through the new
<code>jkube.java.version</code> property. Previously the JDK was inferred automatically, which sometimes led to a base image
that didn&#x27;t match the version you were targeting. With this property you can pin the exact JDK your workload needs.</p>
<h3 class="heading"><span id="image-pull-policy"></span>Fine-grained image pull policy control<a href="https://blog.marcnuri.com/eclipse-jkube-1-20#image-pull-policy" aria-label="image-pull-policy permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h3>
<p>Image pull policy handling is now more consistent and flexible:</p>
<ul>
<li>A per-image <code>imagePullPolicy</code> set in the build configuration now correctly overrides the global pull policy,
so you can fine-tune the behavior on an image-by-image basis.</li>
<li>The Buildpacks build service now honors the global <code>imagePullPolicy</code> when no per-image policy is set, aligning
its behavior with the other build strategies.</li>
</ul>
<h3 class="heading"><span id="maven-compatibility"></span>Compatibility with Maven 3.9.13 and newer<a href="https://blog.marcnuri.com/eclipse-jkube-1-20#maven-compatibility" aria-label="maven-compatibility permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h3>
<p>The Kubernetes Maven Plugin is now compatible with the <code>SecDispatcher</code> changes introduced in Maven 3.9.13. Registry
and Helm passwords are decrypted using Maven&#x27;s <code>SettingsDecrypter</code>, which is the standard, supported mechanism for
handling encrypted credentials.</p>
<p>As a result, the <code>&lt;helm&gt;&lt;security&gt;</code> configuration and the <code>jkube.helm.security</code> property are now deprecated in favor
of the standard <code>-Dsettings.security</code> setting.</p>
<h3 class="heading"><span id="workload-redeploy"></span>StatefulSet and DaemonSet redeployment fixes<a href="https://blog.marcnuri.com/eclipse-jkube-1-20#workload-redeploy" aria-label="workload-redeploy permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h3>
<p>Generated <code>StatefulSet</code> and <code>DaemonSet</code> resources no longer include the version label in their
<code>selector.matchLabels</code>. Because the selector is an immutable field, keeping a version label there prevented these
workloads from being redeployed after a version bump. With this fix, you can bump your application version and
redeploy <code>StatefulSet</code> and <code>DaemonSet</code> workloads without running into update errors.</p>
<h2 class="heading"><span id="using-this-release"></span>Using this release<a href="https://blog.marcnuri.com/eclipse-jkube-1-20#using-this-release" aria-label="using-this-release permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>If your project is based on Maven, you just need to add the Kubernetes Maven plugin or the OpenShift Maven
plugin to your plugin dependencies:</p>
<div class="code" style="background:#232323"><pre style="display:block;overflow-x:auto;padding:0.5em;background:#232323;color:#e6e1dc"><code class="language-xml" style="white-space:pre"><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">plugin</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span>  </span><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">groupId</span><span style="color:#e8bf6a">&gt;</span><span>org.eclipse.jkube</span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">groupId</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span>  </span><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">artifactId</span><span style="color:#e8bf6a">&gt;</span><span>kubernetes-maven-plugin</span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">artifactId</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span>  </span><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">version</span><span style="color:#e8bf6a">&gt;</span><span>1.20.0</span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">version</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span></span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">plugin</span><span style="color:#e8bf6a">&gt;</span></code></pre></div>
<p>If your project is based on Gradle, you just need to add the Kubernetes Gradle plugin or the OpenShift Gradle
plugin to your plugin dependencies:</p>
<div class="code" style="background:#232323"><pre style="display:block;overflow-x:auto;padding:0.5em;background:#232323;color:#e6e1dc"><code class="language-groovy" style="white-space:pre"><span>plugins {
</span><span>  id </span><span style="color:#a5c261">&#x27;org.eclipse.jkube.kubernetes&#x27;</span><span> version </span><span style="color:#a5c261">&#x27;1.20.0&#x27;</span><span>
</span>}</code></pre></div>
<h2 class="heading"><span id="how-can-you-help"></span>How can you help?<a href="https://blog.marcnuri.com/eclipse-jkube-1-20#how-can-you-help" aria-label="how-can-you-help permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>If you&#x27;re interested in helping out and are a first-time contributor, check out the
<a href="https://github.com/eclipse-jkube/jkube/labels/first-timers-only" rel="noopener" title="Link to https://github.com/eclipse-jkube/jkube/labels/first-timers-only" aria-label="&quot;first-timers-only&quot;" target="_blank">&quot;first-timers-only&quot;</a>
tag in the issue repository.
We&#x27;ve tagged extremely easy issues so that you can get started contributing to Open Source and the Eclipse organization.</p>
<p>If you are a more experienced developer or have already contributed to JKube, check the
<a href="https://github.com/eclipse-jkube/jkube/labels/help%20wanted" rel="noopener" title="Link to https://github.com/eclipse-jkube/jkube/labels/help%20wanted" aria-label="&quot;help wanted&quot;" target="_blank">&quot;help wanted&quot;</a> tag.</p>
<p>We&#x27;re also excited to read articles and posts mentioning our project and sharing the user experience.
Feedback is the only way to improve.</p>
<p><a href="https://www.eclipse.org/jkube" rel="noopener" title="Link to https://www.eclipse.org/jkube" aria-label="Project Page" target="_blank">Project Page</a> |
<a href="https://github.com/eclipse-jkube/jkube" rel="noopener" title="Link to https://github.com/eclipse-jkube/jkube" aria-label="GitHub" target="_blank">GitHub</a> |
<a href="https://github.com/eclipse-jkube/jkube/issues" rel="noopener" title="Link to https://github.com/eclipse-jkube/jkube/issues" aria-label="Issues" target="_blank">Issues</a> |
<a href="https://gitter.im/eclipse/jkube" rel="noopener" title="Link to https://gitter.im/eclipse/jkube" aria-label="Gitter" target="_blank">Gitter</a> |
<a href="https://accounts.eclipse.org/mailing-list/jkube-dev" rel="noopener" title="Link to https://accounts.eclipse.org/mailing-list/jkube-dev" aria-label="Mailing list" target="_blank">Mailing list</a> |
<a href="https://stackoverflow.com/questions/tagged/jkube" rel="noopener" title="Link to https://stackoverflow.com/questions/tagged/jkube" aria-label="Stack Overflow" target="_blank">Stack Overflow</a></p>
<span class="post-image__pusher "></span><figure class="post-image "><span class="post-image__scrim"></span><a href="/assets/JKube-blog-banner.BoskBw6N_Z2u9zOP.jpg" class="post-image__link" title="The logo of Eclipse JKube"><span class="post-image__image-container"><picture><source type="image/webp" srcset="https://blog.marcnuri.com/assets/JKube-blog-banner.BoskBw6N_ZkqzRz.webp 200w,https://blog.marcnuri.com/assets/JKube-blog-banner.BoskBw6N_ZA0cS5.webp 400w,https://blog.marcnuri.com/assets/JKube-blog-banner.BoskBw6N_kPQAT.webp 800w" sizes="(min-width: 800px) 800px, 100vw"><img sizes="(min-width: 800px) 800px, 100vw" decoding="async" loading="lazy" src="https://blog.marcnuri.com/assets/JKube-blog-banner.BoskBw6N_Z2u9zOP.jpg" srcset="https://blog.marcnuri.com/assets/JKube-blog-banner.BoskBw6N_1TK6uC.jpg 200w,https://blog.marcnuri.com/assets/JKube-blog-banner.BoskBw6N_1Ebtu7.jpg 400w,https://blog.marcnuri.com/assets/JKube-blog-banner.BoskBw6N_Z2u9zOP.jpg 800w" alt="The logo of Eclipse JKube" style="aspect-ratio:800 / 750;--image-width:800px"></picture></span></a></figure>
  ]]></content:encoded>
            <category>Cloud Native</category>
            <enclosure url="https://blog.marcnuri.com/assets/JKube-blog-banner.BoskBw6N_Z2u9zOP.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Project, Agent, Person: The Missing Axis of AI Coding Tools]]></title>
            <link>https://blog.marcnuri.com/project-agent-person-centric-ai-coding-tools</link>
            <guid isPermaLink="false">https://blog.marcnuri.com/project-agent-person-centric-ai-coding-tools</guid>
            <pubDate>Mon, 06 Jul 2026 09:00:00 GMT</pubDate>
            <description><![CDATA[Everyone ranks AI coding tools by how autonomous they are. The axis that predicts the gaps is what they're built around: the project, the agent, or you.]]></description>
            <content:encoded><![CDATA[
    <div><a href="https://blog.marcnuri.com/project-agent-person-centric-ai-coding-tools">Original post</a></div>
    <h2 class="heading"><span id="introduction"></span>Introduction<a href="https://blog.marcnuri.com/project-agent-person-centric-ai-coding-tools#introduction" aria-label="introduction permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>A few months ago I wrote about <a href="/missing-levels-ai-assisted-development" class="post-link " title="The Missing Levels of AI-Assisted Development: From Agent Chaos to Orchestration">the missing levels between juggling coding agents and building your own orchestrator</a>.
That post ended on an uncomfortable note: at some point the tooling runs out, and you are told to build the orchestrator yourself.</p>
<p>This post is about why.
Why, with dozens of well-funded <a href="/category/ai" class="category-link " title="Artificial Intelligence: Everything related to artificial intelligence (AI) and machine learning (ML)" aria-label="AI coding tools">AI coding tools</a> shipping every month, the one that would coordinate your work across every project, machine, and inbox is the one you still assemble by hand.</p>
<p>The reason has little to do with the market lagging.
Almost every tool is built around something other than you: the project, or the session, and rarely the person.</p>
<h2 class="heading"><span id="the-autonomy-axis"></span>Autonomous vs assistive AI coding agents: the axis everyone measures<a href="https://blog.marcnuri.com/project-agent-person-centric-ai-coding-tools#the-autonomy-axis" aria-label="the-autonomy-axis permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>Almost every framework for AI coding tools measures the same thing: how autonomous is it?</p>
<p><a href="https://newsletter.pragmaticengineer.com/p/steve-yegge-on-ai-agents-and-the" rel="noopener" title="Link to https://newsletter.pragmaticengineer.com/p/steve-yegge-on-ai-agents-and-the" aria-label="Steve Yegge&#x27;s eight levels" target="_blank">Steve Yegge&#x27;s eight levels</a> run from no AI at all to a custom orchestrator.
Dan Shapiro&#x27;s five go from <a href="https://www.danshapiro.com/blog/2026/01/the-five-levels-from-spicy-autocomplete-to-the-software-factory/" rel="noopener" title="Link to https://www.danshapiro.com/blog/2026/01/the-five-levels-from-spicy-autocomplete-to-the-software-factory/" aria-label="spicy autocomplete to the Dark Factory" target="_blank">spicy autocomplete to the Dark Factory</a>.
Sourcegraph and <a href="https://www.swarmia.com/blog/five-levels-ai-agent-autonomy/" rel="noopener" title="Link to https://www.swarmia.com/blog/five-levels-ai-agent-autonomy/" aria-label="Swarmia" target="_blank">Swarmia</a> each ship their own.
<a href="https://addyo.substack.com/p/agentic-autonomy-levels" rel="noopener" title="Link to https://addyo.substack.com/p/agentic-autonomy-levels" aria-label="Addy Osmani" target="_blank">Addy Osmani</a> recently split the ladder into two axes. But both, as I will come back to, are still about autonomy.</p>
<p>I am not going to re-teach the ladder here.
My <a href="/missing-levels-ai-assisted-development" class="post-link " title="The Missing Levels of AI-Assisted Development: From Agent Chaos to Orchestration">previous post</a> tried to fill in its missing rungs, and the ladder itself is real, useful, and thoroughly mapped.
It answers one question well: how much can I trust the tool to do on its own?</p>
<p>That is not the only question worth asking.</p>
<h2 class="heading"><span id="center-of-gravity"></span>The axis nobody names: a tool&#x27;s center of gravity<a href="https://blog.marcnuri.com/project-agent-person-centric-ai-coding-tools#center-of-gravity" aria-label="center-of-gravity permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>Here is a second question the ladders never ask: what is the tool built around?</p>
<p>Not how autonomous it is, but what sits at the center: the thing every feature is quietly designed to serve.
I think of it as a tool&#x27;s <strong>center of gravity</strong>, and three answers keep showing up.
Sorted that way, AI coding tools fall into three kinds: project-centric, agent-centric, and person-centric.</p>
<ul>
<li><strong>Project-centric</strong>: the unit is the repository and the issue. You hand over a task and an agent works autonomously toward a pull request.</li>
<li><strong>Agent-centric</strong>: the unit is the session. You live inside one tool&#x27;s cockpit and run your agents from there.</li>
<li><strong>Person-centric</strong>: the unit is you. The tool coordinates your work across the repositories, trackers, and machines your name touches.</li>
</ul>
<p>Two clarifications first.</p>
<p>This is a different &quot;agent-centric&quot; than you may have met elsewhere.
It is not Sonar&#x27;s Agent-Centric Development Cycle, a code-quality governance loop, and it is not UX&#x27;s user-centered design.
Here it means one thing: the tool is built around the agent session as the place you live, and the cockpit is the product.</p>
<p>And these are centers of gravity, not boxes.
Real tools straddle.
GitHub&#x27;s Copilot coding agent is a project-centric workhorse that also ships a personal dashboard; Cursor is an agent-centric cockpit that also runs background jobs.
I am naming what each tool leans toward, not sorting them into sealed compartments.
The mappings that follow are my own analytical lens, not how these vendors describe themselves.</p>
<p>One caveat on that word &quot;missing&quot;: it is missing from how we usually talk about these tools, not from the market.
Autonomy gets all the frameworks; center of gravity gets almost none.
And the two are not the same measure in a different coat.
A dependency-bump bot that opens one small, pre-approved kind of pull request is deeply project-centric and barely autonomous.
Autonomy and center of gravity tend to travel together, but nothing forces them to.
Set autonomy aside and sort tools by their center of gravity, and the space takes on a shape of its own: three worlds side by side, with one corner still conspicuously empty.</p>
<span class="post-image__pusher "></span><figure class="post-image "><span class="post-image__scrim"></span><a href="/assets/three-centers-of-gravity.x2yGCuCA_Z2fMe94.png" class="post-image__link" title="Isometric diagram of three platforms side by side: a project-centric factory floor of worker-drones turning issues into pull requests, an agent-centric cockpit pod with a single robot at a laptop, and an empty person-centric platform showing only the dashed blueprint of an unbuilt control tower"><span class="post-image__image-container"><picture><source type="image/webp" srcset="https://blog.marcnuri.com/assets/three-centers-of-gravity.x2yGCuCA_1H7kLs.webp 418w,https://blog.marcnuri.com/assets/three-centers-of-gravity.x2yGCuCA_Z13EhRm.webp 836w,https://blog.marcnuri.com/assets/three-centers-of-gravity.x2yGCuCA_1t2ML2.webp 1672w" sizes="(min-width: 1672px) 1672px, 100vw"><img sizes="(min-width: 1672px) 1672px, 100vw" decoding="async" loading="lazy" src="https://blog.marcnuri.com/assets/three-centers-of-gravity.x2yGCuCA_Z2fMe94.png" srcset="https://blog.marcnuri.com/assets/three-centers-of-gravity.x2yGCuCA_qIgKb.png 418w,https://blog.marcnuri.com/assets/three-centers-of-gravity.x2yGCuCA_Z2k3lSD.png 836w,https://blog.marcnuri.com/assets/three-centers-of-gravity.x2yGCuCA_Z2fMe94.png 1672w" alt="Isometric diagram of three platforms side by side: a project-centric factory floor of worker-drones turning issues into pull requests, an agent-centric cockpit pod with a single robot at a laptop, and an empty person-centric platform showing only the dashed blueprint of an unbuilt control tower" style="aspect-ratio:1672 / 941;--image-width:1672px"></picture></span></a></figure>
<h2 class="heading"><span id="project-centric"></span>Project-centric: the repository is the unit<a href="https://blog.marcnuri.com/project-agent-person-centric-ai-coding-tools#project-centric" aria-label="project-centric permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>The most crowded, best-funded corner is project-centric.</p>
<p>The pattern is familiar: you describe a change as an issue, an agent picks it up in the cloud, and a pull request appears for you to review.
<a href="https://devin.ai/" rel="noopener" title="Link to https://devin.ai/" aria-label="Devin" target="_blank">Devin</a> is the flagship. Cognition has marketed fleets of them migrating repositories in parallel, and in 2025 it bought the Windsurf IDE, one project-centric vendor absorbing an agent-centric one.
<a href="https://jules.google/" rel="noopener" title="Link to https://jules.google/" aria-label="Google&#x27;s Jules" target="_blank">Google&#x27;s Jules</a>, <a href="https://openai.com/index/introducing-codex/" rel="noopener" title="Link to https://openai.com/index/introducing-codex/" aria-label="OpenAI&#x27;s Codex cloud agent" target="_blank">OpenAI&#x27;s Codex cloud agent</a>, and <a href="https://github.blog/news-insights/company-news/welcome-home-agents/" rel="noopener" title="Link to https://github.blog/news-insights/company-news/welcome-home-agents/" aria-label="GitHub&#x27;s Copilot coding agent" target="_blank">GitHub&#x27;s Copilot coding agent</a> all run the same play, with Factory&#x27;s <a href="https://github.com/Factory-AI-Droids" rel="noopener" title="Link to https://github.com/Factory-AI-Droids" aria-label="Droids" target="_blank">Droids</a> and the open-source <a href="https://github.com/OpenHands/openhands" rel="noopener" title="Link to https://github.com/OpenHands/openhands" aria-label="OpenHands" target="_blank">OpenHands</a> rounding it out.</p>
<p>This is the vendor-built road to the top of the autonomy ladder, and it is genuinely good.
For bounded, well-specified, high-volume, team-owned work, made of dependency bumps, CVE patches, and mechanical migrations, it is the right answer; a human in the loop is friction, not safety.</p>
<p>The momentum is real enough that I see it inside <a href="/tag/red-hat" class="tag-link " title="Red Hat" aria-label="my own company">my own company</a>.
<a href="https://github.com/fullsend-ai/fullsend" rel="noopener" title="Link to https://github.com/fullsend-ai/fullsend" aria-label="fullsend" target="_blank">fullsend</a> is a public design-doc exploration of fully autonomous engineering: triage, implement, review, and merge, with a human pulled in only for the risky changes.
It is an effort from engineers I know at Red Hat, where I also work, an independent open-source exploration, not a Red Hat product or roadmap.
I mention it because this direction is not a fringe bet; it is where serious people are pointing.</p>
<p>Some argue this is the only corner that will matter.
OpenAI&#x27;s Thibault Sottiaux calls scaffolding &quot;coping, not scaling,&quot; and a lot of the money is behind it.
It is a bet, though, not a settled result: across teams, the bottleneck has moved to verification, and context, coordination, and oversight still gate what raw autonomy delivers.</p>
<h2 class="heading"><span id="agent-centric"></span>Agent-centric: the session is the unit<a href="https://blog.marcnuri.com/project-agent-person-centric-ai-coding-tools#agent-centric" aria-label="agent-centric permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>Start with what this corner gets right.</p>
<p>A single, opinionated cockpit is the best environment we have for focused work.
Claude Code in a terminal, Cursor in an editor, Sourcegraph&#x27;s Amp: deep in one hard change, living inside a single well-designed tool beats hopping between five.
The local orchestrators built on top of this, like <a href="https://www.conductor.build/" rel="noopener" title="Link to https://www.conductor.build/" aria-label="Conductor" target="_blank">Conductor</a>, <a href="https://github.com/smtg-ai/claude-squad" rel="noopener" title="Link to https://github.com/smtg-ai/claude-squad" aria-label="Claude Squad" target="_blank">Claude Squad</a>, and Vibe Kanban, inherit the same virtue.
Each agent gets its own git worktree, and you conduct them all from one place: the one machine they run on.
The tell of the category is that coordination happens around the agent.</p>
<p>Cursor is multi-model (Claude, GPT, Gemini), so the lock-in was never really about the model.
It was about the cockpit.
The same gravity that makes a cockpit great also draws it toward a closed edge: the more a tool optimizes for the session you live in, the more it wants to be the only session you live in.
Read one way, you can watch that edge harden.
When the third-party client opencode tried to use Claude subscription credentials, it got back <code>This credential is only authorized for use with Claude Code and cannot be used for other API requests.</code> Anthropic had restricted those credentials to its own tool, pushing other clients toward a metered API key.
Cognition buying Windsurf is the same physics at a larger scale.</p>
<p>None of this is villainy.
It is what happens when the session is the center of gravity: the tool is the product, and the product wants you inside it.</p>
<h2 class="heading"><span id="person-centric"></span>Person-centric: you are the unit<a href="https://blog.marcnuri.com/project-agent-person-centric-ai-coding-tools#person-centric" aria-label="person-centric permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>This brings us to the empty corner.
I should be upfront here: I build a tool that lives in this corner, so if the case only works because it flatters my own project, it does not work.
I have tried to write the version that survives deleting it.</p>
<p>A person-centric AI coding tool takes you as the unit of coordination.
Not this repository, not that session, but you, and the whole spread of work that carries your name: repositories across several orgs, issues in two trackers, a review waiting in Slack, agents on a laptop and a workstation.
The center is the person, not the project or the platform.
Acting on your behalf is a trait that follows from that, not the axis itself.</p>
<p>Two properties make it categorically different.
It is <strong>cross-surface</strong>: it reaches past any single repo, IDE, or platform into your actual working day.
And it is <strong>rooted in your environment</strong>: it coordinates whatever agents you run, Claude Code or anything else, wherever you run them, not only the ones a vendor hosts inside its walls.
It is the corner the human-as-operator camp keeps pointing at, from Willison&#x27;s &quot;agentic engineering&quot; to Swarmia&#x27;s caution that higher autonomy is not always better, usually with no developer-grade tool to name.</p>
<p>So, to put the claim in a way you can push back on: person-centric coding tools are not unserved, but they are badly underserved.
Consumer assistants already act on a person&#x27;s behalf across their messaging apps, and &quot;AI chief of staff&quot; tools do it for knowledge work, but none of them touches code, repositories, or CI.
The closest thing in our world is GitHub&#x27;s Agent HQ, whose mission-control view already gathers agents from several vendors into one pane.
But it orchestrates only the agents GitHub hosts, on GitHub&#x27;s own surfaces.
It does not reach the sessions you run on your own hardware, or the work that spills into your inbox and your other trackers.
Others feel the same pull.
Cursor gathers its own agents into one window, and a few small cross-brand tools route agent approvals to your phone; the first is a single vendor&#x27;s garden, and the second is a thin slice of the job.
As of July 2026 I still cannot find a professional-grade tool that is vendor-neutral, spans your projects and surfaces, keeps you as the operator, and coordinates the actual work rather than one seam of it.
A few of the tools inching toward that corner are not mine, and I would genuinely like to be wrong here.
If you know one that already qualifies, point me to it and I will add it.</p>
<p>That empty corner is the shape I am building toward with <a href="https://github.com/manusa/ai-beacon" rel="noopener" title="Link to https://github.com/manusa/ai-beacon" aria-label="ai-beacon" target="_blank">ai-beacon</a>: the agents on all your machines in one web view you can reach from anywhere, Claude Code and opencode alike.
It grew out of the <a href="/ai-coding-agent-dashboard" class="post-link " title="AI Coding Agent Dashboard: Orchestrating Claude Code Across Devices">coding-agent dashboard I wrote about earlier this year</a>, and it is early and experimental.
The category matters more than my attempt at it.</p>
<p>The plumbing for this corner is half-built.
There is a standard for each seam: <a href="/model-context-protocol-mcp-introduction" class="post-link " title="Introduction to the Model Context Protocol (MCP): The Future of AI Integration">Model Context Protocol (MCP)</a> between agents and tools, <a href="/agent-client-protocol-acp-introduction" class="post-link " title="Agent Client Protocol (ACP): The LSP for AI Coding Agents Explained">Agent Client Protocol (ACP)</a> between editors and agents, A2A between agents, AG-UI between agents and interfaces.
What none of them provides alone is the cross-context layer that would tie your work together above all of them.
That layer is missing precisely because no vendor is incentivized to center it on you.</p>
<p>The person-centric approach has a real weakness of its own.
It lives at the mercy of the very boundaries it crosses.
A control layer that rides on top of every vendor inherits none of their guardrails: no CI, no review gates.
And any vendor can starve it with a credential restriction, the closed edge from before.
That is not a reason the category should not exist.
It is the reason it is hard.</p>
<h2 class="heading"><span id="prior-art"></span>What is new here, and what isn&#x27;t<a href="https://blog.marcnuri.com/project-agent-person-centric-ai-coding-tools#prior-art" aria-label="prior-art permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>Let me be careful about what I am and am not claiming, because the prior art deserves credit.
The project-versus-agent distinction is not new; it relabels things people already say.
<a href="https://openhands.dev/blog/20251202-agents-in-the-outer-loop" rel="noopener" title="Link to https://openhands.dev/blog/20251202-agents-in-the-outer-loop" aria-label="OpenHands has written about" target="_blank">OpenHands has written about</a> the inner loop versus the outer loop, accelerating the individual versus handling whole tasks over Slack and Jira, which maps almost exactly onto agent-centric versus project-centric, though OpenHands straddles both.
Osmani&#x27;s two-axis model splits autonomy into agency and orchestration, but his second axis is how many agents you run, which is still a question about autonomy.</p>
<p>What is actually new is small but load-bearing.
It is choosing center of gravity, what the tool is built around, as the axis, instead of the degree of autonomy, and then naming the person-centric category, at professional developer grade, as the one that is missing.
Neither Osmani&#x27;s orchestration axis nor OpenHands&#x27; outer loop leaves a seat for the person.
That seat is the whole point.</p>
<h2 class="heading"><span id="composing"></span>How to choose between project-, agent-, and person-centric tools<a href="https://blog.marcnuri.com/project-agent-person-centric-ai-coding-tools#composing" aria-label="composing permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>None of this is a fight to the death.
The future I expect is a composition, with a clear boundary between the parts: a control tower over a factory floor.
The factory floor is project-centric: many autonomous agents turning well-specified issues into pull requests while you sleep.
The control tower is person-centric: one person&#x27;s single pane of glass over all of it, across projects, surfaces, and machines.
They are not rivals; they are different altitudes of the same operation.</p>
<p>That leaves a decision rule I can use day to day.</p>
<ul>
<li>When the work is depth on a single change, reach for the cockpit (agent-centric).</li>
<li>When it is a specced unit you can hand off and walk away from, reach for the factory (project-centric).</li>
<li>When it spans projects, surfaces, or machines and needs your judgment routed across all of them, reach for the control tower (person-centric).</li>
</ul>
<p>The uncomfortable part is that the third tool is the one the market is least likely to hand you.
My previous post said you would probably have to build your own orchestrator.
I now think the deeper reason is structural.
Every vendor&#x27;s center of gravity is the project or the platform, because that is where the business is.
Almost none of it is you.
AI coding tools differ less by how autonomous they are than by what they are built around, and the human is the one center nobody has quite built for yet.</p>
<p>If you are somewhere on this map, I would like to know which corner.
I am collecting notes in the <a href="https://github.com/manusa/ai-beacon/discussions" rel="noopener" title="Link to https://github.com/manusa/ai-beacon/discussions" aria-label="ai-beacon discussions" target="_blank">ai-beacon discussions</a>, the same place as last time.
Thanks, too, to my colleague Václav Vančura, whose UX thinking helped sharpen how I see all of this.
The more corners we compare, the sharper the map gets.</p>
  ]]></content:encoded>
            <category>Artificial Intelligence</category>
            <enclosure url="https://blog.marcnuri.com/assets/project-agent-person-centric-ai-coding-tools.JDDMB1KB_4ErP3.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Fabric8 Kubernetes Client 7.8 is now available!]]></title>
            <link>https://blog.marcnuri.com/fabric8-kubernetes-client-7-8</link>
            <guid isPermaLink="false">https://blog.marcnuri.com/fabric8-kubernetes-client-7-8</guid>
            <pubDate>Mon, 29 Jun 2026 18:00:00 GMT</pubDate>
            <description><![CDATA[Fabric8 Kubernetes Client 7.8 is available! Check out the major changes and learn how you can contribute.]]></description>
            <content:encoded><![CDATA[
    <div><a href="https://blog.marcnuri.com/fabric8-kubernetes-client-7-8">Original post</a></div>
    <div class="admonition admonition__note"><p class="admonition-title"><i class="admonition-title-icon fa-solid fa-circle-info"></i>Note</p><div class="admonition-content">A newer version of Fabric8 Kubernetes Client is available, jump to <a href="/fabric8-kubernetes-client-8-0" class="post-link " title="Fabric8 Kubernetes Client 8.0 is now available!">Fabric8 Kubernetes Client 8.0 announcement</a>.</div></div>
<p>On behalf of the <a href="/kubernetes-client-java-fabric8-introduction" class="post-link " title="Kubernetes Client for Java: Fabric8 introduction">Fabric8</a>
team and everyone who has contributed, I&#x27;m happy to announce that the Fabric8 Kubernetes Client <code>7.8.0</code> has been
<a href="https://github.com/fabric8io/kubernetes-client/releases/tag/v7.8.0" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client/releases/tag/v7.8.0" aria-label="released" target="_blank">released</a> and is now available from
<a href="https://repo1.maven.org/maven2/io/fabric8/kubernetes-client/7.8.0/" rel="noopener" title="Link to https://repo1.maven.org/maven2/io/fabric8/kubernetes-client/7.8.0/" aria-label="Maven Central" target="_blank">Maven Central</a> 🎉.</p>
<p>This marks the eighth minor release of the Fabric8 Kubernetes Client 7, bringing new features, bug fixes, and improvements while keeping the breaking changes minimal.</p>
<p>Thanks to all of you who have contributed with issue reports, pull requests, feedback, and spreading the word with blogs, videos, comments, and so on.
We really appreciate your help, keep it up!</p>
<h2 class="heading"><span id="whats-new"></span>What&#x27;s new?<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-7-8#whats-new" aria-label="whats-new permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>Without further ado, let&#x27;s have a look at the most significant updates:</p>
<ul>
<li><a href="/fabric8-kubernetes-client-7-8#shard-selectors" class="post-link " title="Link to the shard selectors section">Shard selectors for list, watch and informers</a></li>
<li><a href="/fabric8-kubernetes-client-7-8#tls-warmup" class="post-link " title="Link to the TLS warm-up section">Opt-in TLS warm-up for the Vert.x HTTP client</a></li>
<li><a href="/fabric8-kubernetes-client-7-8#crd-improvements" class="post-link " title="Link to the CRD improvements section">CRD generator: class-level descriptions via @JsonClassDescription</a></li>
<li>🐛 Many other bug fixes and minor improvements</li>
</ul>
<p>You can find the full changelog for this version in our GitHub <a href="https://github.com/fabric8io/kubernetes-client/releases/tag/v7.8.0" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client/releases/tag/v7.8.0" aria-label="release page" target="_blank">release page</a>.</p>
<h3 class="heading"><span id="shard-selectors"></span>Shard selectors for list, watch and informers<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-7-8#shard-selectors" aria-label="shard-selectors permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h3>
<p>List and watch operations, including informers, now support shard selectors through the new <code>withShardSelector</code> method.
This lets you partition a large set of resources across multiple consumers, so each instance only lists and watches the slice it is responsible for.
It&#x27;s a handy building block when you need to scale controllers or operators horizontally and distribute the watch load, instead of having every instance receive every event.</p>
<p>A shard selector is a CEL expression, typically a <code>shardRange(...)</code> over the resource UID, that you attach to any list, watch, inform or delete operation:</p>
<div class="code" style="background:#232323"><pre style="display:block;overflow-x:auto;padding:0.5em;background:#232323;color:#e6e1dc"><code class="language-java" style="white-space:pre"><span style="color:#c26230">try</span><span> (KubernetesClient client = </span><span style="color:#c26230">new</span><span> KubernetesClientBuilder().build()) {
</span><span>  </span><span style="color:#bc9458;font-style:italic">// This instance only sees the first half of the UID space</span><span>
</span><span>  String shard = </span><span style="color:#a5c261">&quot;shardRange(object.metadata.uid, &#x27;0x0000000000000000&#x27;, &#x27;0x8000000000000000&#x27;)&quot;</span><span>;
</span>  client.configMaps()
    .withShardSelector(shard)
    .inform(handler);
}</code></pre></div>
<p>Note that this relies on the server-side sharded list and watch support, an alpha Kubernetes feature, so the corresponding feature gate must be enabled on your cluster.
The initial support was rounded out with a few follow-ups to smooth out the rough edges.</p>
<h3 class="heading"><span id="tls-warmup"></span>Opt-in TLS warm-up for the Vert.x HTTP client<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-7-8#tls-warmup" aria-label="tls-warmup permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h3>
<p>The Vert.x HTTP client factories (<code>Vertx5HttpClientFactory</code> and <code>VertxHttpClientFactory</code>) now expose a <code>setTlsWarmup(TlsWarmup)</code> method with three modes: <code>OFF</code>, <code>CONTEXT</code> (the default, with unchanged behaviour) and <code>FULL</code>.</p>
<p>When set to <code>FULL</code>, the client performs a synchronous, once-per-JVM, throwaway loopback TLS handshake off the event loop when it&#x27;s built.
This pays the one-time cost of JDK/Netty TLS class loading up front, so the first real connection no longer blocks the event loop on it.
It&#x27;s specifically aimed at users running on cold or hard CPU-throttled JVMs who were hitting first-connection stalls or timeouts.</p>
<p>You opt in by configuring the warm-up mode on the HTTP client factory and passing it to the builder:</p>
<div class="code" style="background:#232323"><pre style="display:block;overflow-x:auto;padding:0.5em;background:#232323;color:#e6e1dc"><code class="language-java" style="white-space:pre"><span>Vertx5HttpClientFactory factory = </span><span style="color:#c26230">new</span><span> Vertx5HttpClientFactory();
</span>factory.setTlsWarmup(TlsWarmup.FULL);
<span></span><span style="color:#c26230">try</span><span> (KubernetesClient client = </span><span style="color:#c26230">new</span><span> KubernetesClientBuilder()
</span>    .withHttpClientFactory(factory)
    .build()) {
<span>  </span><span style="color:#bc9458;font-style:italic">// The first TLS connection no longer pays the class-loading cost on the event loop</span><span>
</span>}</code></pre></div>
<p>The default behaviour (<code>CONTEXT</code>) is unchanged, so you only opt in if you need it.</p>
<h3 class="heading"><span id="crd-improvements"></span>CRD generator: class-level descriptions via @JsonClassDescription<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-7-8#crd-improvements" aria-label="crd-improvements permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h3>
<p>The CRD generator now honors Jackson&#x27;s <code>@JsonClassDescription</code> annotation, allowing you to add descriptions to whole classes in the generated CRD schema.
This complements the existing field-level description support, so the documentation embedded in your CRDs can be more complete and closer to your source model.</p>
<h2 class="heading"><span id="using-this-release"></span>Using this release<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-7-8#using-this-release" aria-label="using-this-release permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>If your project is based on Maven, you just need to add the Fabric8 Kubernetes Client to your Maven dependencies:</p>
<div class="code" style="background:#232323"><pre style="display:block;overflow-x:auto;padding:0.5em;background:#232323;color:#e6e1dc"><code class="language-xml" style="white-space:pre"><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">dependency</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span>  </span><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">groupId</span><span style="color:#e8bf6a">&gt;</span><span>io.fabric8</span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">groupId</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span>  </span><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">artifactId</span><span style="color:#e8bf6a">&gt;</span><span>kubernetes-client</span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">artifactId</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span>  </span><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">version</span><span style="color:#e8bf6a">&gt;</span><span>7.8.0</span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">version</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span></span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">dependency</span><span style="color:#e8bf6a">&gt;</span></code></pre></div>
<p>If your project is based on Gradle, you just need to add the Fabric8 Kubernetes Client to your Gradle dependencies:</p>
<div class="code" style="background:#232323"><pre style="display:block;overflow-x:auto;padding:0.5em;background:#232323;color:#e6e1dc"><code class="language-groovy" style="white-space:pre"><span>dependencies {
</span><span>  api </span><span style="color:#a5c261">&quot;io.fabric8:kubernetes-client:7.8.0&quot;</span><span>
</span>}</code></pre></div>
<p>Once your project is ready, you can create a new instance of the client to perform operations.
In the following code snippet, I show you how to instantiate the client and retrieve a list of Pods:</p>
<div class="code" style="background:#232323"><pre style="display:block;overflow-x:auto;padding:0.5em;background:#232323;color:#e6e1dc"><code class="language-java" style="white-space:pre"><span style="color:#c26230">try</span><span> (KubernetesClient client = </span><span style="color:#c26230">new</span><span> KubernetesClientBuilder().build()) {
</span>  client.pods().list().getItems().forEach(p -&gt; System.out.println(p.getMetadata().getName()));
}</code></pre></div>
<h2 class="heading"><span id="how-can-you-help"></span>How can you help?<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-7-8#how-can-you-help" aria-label="how-can-you-help permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>If you&#x27;re interested in helping out and are a first-time contributor, check out
the <a href="https://github.com/fabric8io/kubernetes-client/labels/good%20first%20issue" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client/labels/good%20first%20issue" aria-label="&quot;good first issue&quot;" target="_blank">&quot;good first issue&quot;</a> tag in the issue repository.
We&#x27;ve tagged extremely easy issues so that you can get started contributing to Open Source.</p>
<p>We&#x27;re also excited to read articles and posts mentioning our project and sharing the user experience.
Giving a star to the project, and spreading the word in general, helps us reach more users and broaden the
feedback. Feedback is the only way to improve.</p>
<p><a href="https://github.com/fabric8io/kubernetes-client" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client" aria-label="Project Page" target="_blank">Project Page</a> |
<a href="https://github.com/fabric8io/kubernetes-client/issues" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client/issues" aria-label="Issues" target="_blank">Issues</a> |
<a href="https://github.com/fabric8io/kubernetes-client/discussions" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client/discussions" aria-label="Discussions" target="_blank">Discussions</a> |
<a href="https://gitter.im/fabric8io/kubernetes-client" rel="noopener" title="Link to https://gitter.im/fabric8io/kubernetes-client" aria-label="Gitter" target="_blank">Gitter</a> |
<a href="https://stackoverflow.com/questions/tagged/fabric8" rel="noopener" title="Link to https://stackoverflow.com/questions/tagged/fabric8" aria-label="Stack Overflow" target="_blank">Stack Overflow</a></p>
<span class="post-image__pusher "></span><figure class="post-image "><span class="post-image__scrim"></span><a href="/assets/fabric8-logo.Df3cxiZJ_Z1lh3K4.png" class="post-image__link" title="The logo of Fabric8 Kubernetes Client"><span class="post-image__image-container"><picture><source type="image/webp" srcset="https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_253Alb.webp 269w,https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_Z2lDHOW.webp 539w,https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_o2X4Q.webp 1077w" sizes="(min-width: 1077px) 1077px, 100vw"><img sizes="(min-width: 1077px) 1077px, 100vw" decoding="async" loading="lazy" src="https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_Z1lh3K4.png" srcset="https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_qRUEO.png 269w,https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_Z2p4VEM.png 539w,https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_Z1lh3K4.png 1077w" alt="The logo of Fabric8 Kubernetes Client" style="aspect-ratio:1077 / 361;--image-width:1077px"></picture></span></a></figure>
  ]]></content:encoded>
            <category>Cloud Native</category>
            <enclosure url="https://blog.marcnuri.com/assets/fabric8.B0BQP5Cf_j0pJB.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Fabric8 Kubernetes Client 7.7 is now available!]]></title>
            <link>https://blog.marcnuri.com/fabric8-kubernetes-client-7-7</link>
            <guid isPermaLink="false">https://blog.marcnuri.com/fabric8-kubernetes-client-7-7</guid>
            <pubDate>Tue, 12 May 2026 08:00:00 GMT</pubDate>
            <description><![CDATA[Fabric8 Kubernetes Client 7.7 is available! Check out the major changes and learn how you can contribute.]]></description>
            <content:encoded><![CDATA[
    <div><a href="https://blog.marcnuri.com/fabric8-kubernetes-client-7-7">Original post</a></div>
    <div class="admonition admonition__note"><p class="admonition-title"><i class="admonition-title-icon fa-solid fa-circle-info"></i>Note</p><div class="admonition-content">A newer version of Fabric8 Kubernetes Client is available, jump to <a href="/fabric8-kubernetes-client-8-0" class="post-link " title="Fabric8 Kubernetes Client 8.0 is now available!">Fabric8 Kubernetes Client 8.0 announcement</a>.</div></div>
<p>On behalf of the <a href="/kubernetes-client-java-fabric8-introduction" class="post-link " title="Kubernetes Client for Java: Fabric8 introduction">Fabric8</a>
team and everyone who has contributed, I&#x27;m happy to announce that the Fabric8 Kubernetes Client <code>7.7.0</code> has been
<a href="https://github.com/fabric8io/kubernetes-client/releases/tag/v7.7.0" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client/releases/tag/v7.7.0" aria-label="released" target="_blank">released</a> and is now available from
<a href="https://repo1.maven.org/maven2/io/fabric8/kubernetes-client/7.7.0/" rel="noopener" title="Link to https://repo1.maven.org/maven2/io/fabric8/kubernetes-client/7.7.0/" aria-label="Maven Central" target="_blank">Maven Central</a> 🎉.</p>
<p>This marks the seventh minor release of the Fabric8 Kubernetes Client 7, bringing new features, bug fixes, and improvements while keeping the breaking changes minimal.</p>
<p>Thanks to all of you who have contributed with issue reports, pull requests, feedback, and spreading the word with blogs, videos, comments, and so on.
We really appreciate your help, keep it up!</p>
<h2 class="heading"><span id="whats-new"></span>What&#x27;s new?<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-7-7#whats-new" aria-label="whats-new permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>Without further ado, let&#x27;s have a look at the most significant updates:</p>
<ul>
<li><a href="/fabric8-kubernetes-client-7-7#kubernetes-136" class="post-link " title="Link to the Kubernetes 1.36 section">Kubernetes 1.36 support (Haru)</a></li>
<li><a href="/fabric8-kubernetes-client-7-7#content-negotiation" class="post-link " title="Link to the content negotiation section">Server-side content negotiation (Table and PartialObjectMetadata)</a></li>
<li><a href="/fabric8-kubernetes-client-7-7#api-ergonomics" class="post-link " title="Link to the API ergonomics section">API ergonomics: isSameResource, subresource() and addOwnerReference</a></li>
<li><a href="/fabric8-kubernetes-client-7-7#stability-fixes" class="post-link " title="Link to the stability fixes section">Reliability fixes in leader election, informers and exec WebSockets</a></li>
<li>🐛 Many other bug fixes and minor improvements</li>
</ul>
<p>You can find the full changelog for this version in our GitHub <a href="https://github.com/fabric8io/kubernetes-client/releases/tag/v7.7.0" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client/releases/tag/v7.7.0" aria-label="release page" target="_blank">release page</a>.</p>
<h3 class="heading"><span id="kubernetes-136"></span>Kubernetes 1.36 support (Haru)<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-7-7#kubernetes-136" aria-label="kubernetes-136 permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h3>
<p>This release adds support for Kubernetes v1.36 (ハル / Haru), ensuring you have access to the latest API resources and CRDs.
Several upstream dependencies have also been bumped, including <code>k8s.io/apimachinery</code> to 0.36.0, Istio client-go to 1.29.1, Knative to 0.49, Gateway API to 1.5.0 and the Prometheus Operator model to 0.91.0.</p>
<p>Note that the <code>scheduling.k8s.io/v1alpha1</code> workload-scheduling model classes (<code>Workload</code>, <code>WorkloadList</code>, <code>PodGroup</code>, etc.) have been removed following the upstream KEP-5832 rearchitecture.</p>
<div class="admonition admonition__note"><p class="admonition-title"><i class="admonition-title-icon fa-solid fa-circle-info"></i>Note</p><div class="admonition-content">
<p>Please note that you can still access newer Kubernetes clusters with <strong>older</strong> versions of the Fabric8 client.</p>
<p>The client provides a GenericKubernetesResources class to interact with resources that are not yet supported by the client.
We do recommend always using the <strong>latest</strong> version of the client to benefit from the latest features and bug fixes, but it&#x27;s not mandatory.</p>
</div></div>
<h3 class="heading"><span id="content-negotiation"></span>Server-side content negotiation (Table and PartialObjectMetadata)<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-7-7#content-negotiation" aria-label="content-negotiation permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h3>
<p>The client now supports server-side content negotiation, allowing you to request <code>Table</code> and <code>PartialObjectMetadata</code> responses from the API server.
This is the same mechanism <code>kubectl get</code> uses to render its tabular output, and <code>PartialObjectMetadata</code> is particularly useful when you need to list large numbers of resources but only care about their metadata, drastically reducing the payload size and parsing cost.</p>
<h3 class="heading"><span id="api-ergonomics"></span>API ergonomics: isSameResource, subresource() and addOwnerReference<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-7-7#api-ergonomics" aria-label="api-ergonomics permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h3>
<p>A few targeted API additions make day-to-day code a bit nicer to write:</p>
<ul>
<li>A new <code>HasMetadata#isSameResource</code> helper lets you test whether two <code>HasMetadata</code> instances point to the same logical cluster resource, with an optional strict mode that also requires matching <code>kind</code> and <code>resourceVersion</code>.</li>
<li>The generic <code>subresource()</code> method has been expanded with broader support and enhanced documentation and examples, making it easier to interact with custom or less common subresources.</li>
<li><code>addOwnerReference</code> now has a variant that lets you set the <code>controller</code> and <code>blockOwnerDeletion</code> fields in a single call, which is handy when writing operators.</li>
<li>A new <code>ResourceEventHandler#onList</code> method has been added (deprecating <code>onNothing</code>), giving informer consumers a more meaningful hook to react to the initial list event.</li>
</ul>
<h3 class="heading"><span id="stability-fixes"></span>Reliability fixes in leader election, informers and exec WebSockets<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-7-7#stability-fixes" aria-label="stability-fixes permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h3>
<p>This release includes a notable batch of stability fixes that are worth calling out:</p>
<ul>
<li><strong>Leader election</strong>: fixed an improper callback timing that could lead to a dual-leader situation.</li>
<li><strong>Informers</strong>: <code>SerialExecutor.execute()</code> now returns immediately after shutdown, fixing a post-stop NPE race in <code>SharedProcessor.distribute(...)</code>, and ephemeral index entries are now properly removed from informer caches.</li>
<li><strong>Exec WebSockets</strong>: handshake failures with a non-null upgrade response no longer throw <code>IllegalStateException</code> synchronously, exit codes are no longer overwritten by peer-close exceptions, and pending stdout/stderr writes are flushed before the exit signal is delivered.</li>
<li><strong>MockWebServer</strong>: <code>shutdown()</code> is now idempotent and avoids the <code>RejectedExecutionException</code> that could appear in JUnit <code>@Nested</code> <code>afterAll</code> cascades, and chunked responses no longer send <code>Content-Length</code> together with <code>Transfer-Encoding</code>.</li>
</ul>
<h2 class="heading"><span id="using-this-release"></span>Using this release<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-7-7#using-this-release" aria-label="using-this-release permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>If your project is based on Maven, you just need to add the Fabric8 Kubernetes Client to your Maven dependencies:</p>
<div class="code" style="background:#232323"><pre style="display:block;overflow-x:auto;padding:0.5em;background:#232323;color:#e6e1dc"><code class="language-xml" style="white-space:pre"><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">dependency</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span>  </span><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">groupId</span><span style="color:#e8bf6a">&gt;</span><span>io.fabric8</span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">groupId</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span>  </span><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">artifactId</span><span style="color:#e8bf6a">&gt;</span><span>kubernetes-client</span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">artifactId</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span>  </span><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">version</span><span style="color:#e8bf6a">&gt;</span><span>7.7.0</span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">version</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span></span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">dependency</span><span style="color:#e8bf6a">&gt;</span></code></pre></div>
<p>If your project is based on Gradle, you just need to add the Fabric8 Kubernetes Client to your Gradle dependencies:</p>
<div class="code" style="background:#232323"><pre style="display:block;overflow-x:auto;padding:0.5em;background:#232323;color:#e6e1dc"><code class="language-groovy" style="white-space:pre"><span>dependencies {
</span><span>  api </span><span style="color:#a5c261">&quot;io.fabric8:kubernetes-client:7.7.0&quot;</span><span>
</span>}</code></pre></div>
<p>Once your project is ready, you can create a new instance of the client to perform operations.
In the following code snippet, I show you how to instantiate the client and retrieve a list of Pods:</p>
<div class="code" style="background:#232323"><pre style="display:block;overflow-x:auto;padding:0.5em;background:#232323;color:#e6e1dc"><code class="language-java" style="white-space:pre"><span style="color:#c26230">try</span><span> (KubernetesClient client = </span><span style="color:#c26230">new</span><span> KubernetesClientBuilder().build()) {
</span>  client.pods().list().getItems().forEach(p -&gt; System.out.println(p.getMetadata().getName()));
}</code></pre></div>
<h2 class="heading"><span id="how-can-you-help"></span>How can you help?<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-7-7#how-can-you-help" aria-label="how-can-you-help permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>If you&#x27;re interested in helping out and are a first-time contributor, check out
the <a href="https://github.com/fabric8io/kubernetes-client/labels/good%20first%20issue" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client/labels/good%20first%20issue" aria-label="&quot;good first issue&quot;" target="_blank">&quot;good first issue&quot;</a> tag in the issue repository.
We&#x27;ve tagged extremely easy issues so that you can get started contributing to Open Source.</p>
<p>We&#x27;re also excited to read articles and posts mentioning our project and sharing the user experience.
Giving a star to the project, and spreading the word in general, helps us reach more users and broaden the
feedback. Feedback is the only way to improve.</p>
<p><a href="https://github.com/fabric8io/kubernetes-client" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client" aria-label="Project Page" target="_blank">Project Page</a> |
<a href="https://github.com/fabric8io/kubernetes-client/issues" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client/issues" aria-label="Issues" target="_blank">Issues</a> |
<a href="https://github.com/fabric8io/kubernetes-client/discussions" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client/discussions" aria-label="Discussions" target="_blank">Discussions</a> |
<a href="https://gitter.im/fabric8io/kubernetes-client" rel="noopener" title="Link to https://gitter.im/fabric8io/kubernetes-client" aria-label="Gitter" target="_blank">Gitter</a> |
<a href="https://stackoverflow.com/questions/tagged/fabric8" rel="noopener" title="Link to https://stackoverflow.com/questions/tagged/fabric8" aria-label="Stack Overflow" target="_blank">Stack Overflow</a></p>
<span class="post-image__pusher "></span><figure class="post-image "><span class="post-image__scrim"></span><a href="/assets/fabric8-logo.Df3cxiZJ_Z1lh3K4.png" class="post-image__link" title="The logo of Fabric8 Kubernetes Client"><span class="post-image__image-container"><picture><source type="image/webp" srcset="https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_253Alb.webp 269w,https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_Z2lDHOW.webp 539w,https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_o2X4Q.webp 1077w" sizes="(min-width: 1077px) 1077px, 100vw"><img sizes="(min-width: 1077px) 1077px, 100vw" decoding="async" loading="lazy" src="https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_Z1lh3K4.png" srcset="https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_qRUEO.png 269w,https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_Z2p4VEM.png 539w,https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_Z1lh3K4.png 1077w" alt="The logo of Fabric8 Kubernetes Client" style="aspect-ratio:1077 / 361;--image-width:1077px"></picture></span></a></figure>
  ]]></content:encoded>
            <category>Cloud Native</category>
            <enclosure url="https://blog.marcnuri.com/assets/fabric8.B0BQP5Cf_j0pJB.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Superpowers: The Claude Code Skills Framework Shipped as Markdown]]></title>
            <link>https://blog.marcnuri.com/superpowers-claude-code-skills-framework</link>
            <guid isPermaLink="false">https://blog.marcnuri.com/superpowers-claude-code-skills-framework</guid>
            <pubDate>Fri, 01 May 2026 18:00:00 GMT</pubDate>
            <description><![CDATA[Superpowers is the Claude Code skills framework that ships TDD, planning, debugging, and verification as markdown across six AI coding agents.]]></description>
            <content:encoded><![CDATA[
    <div><a href="https://blog.marcnuri.com/superpowers-claude-code-skills-framework">Original post</a></div>
    <h2 class="heading"><span id="introduction"></span>Superpowers in One Paragraph<a href="https://blog.marcnuri.com/superpowers-claude-code-skills-framework#introduction" aria-label="introduction permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p><a href="https://github.com/obra/superpowers" rel="noopener" title="Link to https://github.com/obra/superpowers" aria-label="Superpowers" target="_blank">Superpowers</a> (from <code>obra/superpowers</code>) is the Claude Code plugin, and multi-host agentic skills framework, that ships an opinionated engineering culture as a folder of markdown files.
The same folder works across <a href="https://www.anthropic.com/claude-code" rel="noopener" title="Link to https://www.anthropic.com/claude-code" aria-label="Claude Code" target="_blank">Claude Code</a>, <a href="https://cursor.com" rel="noopener" title="Link to https://cursor.com" aria-label="Cursor" target="_blank">Cursor</a>, <a href="https://openai.com/codex/" rel="noopener" title="Link to https://openai.com/codex/" aria-label="OpenAI Codex" target="_blank">OpenAI Codex</a>, <a href="https://docs.github.com/copilot/github-copilot-cli" rel="noopener" title="Link to https://docs.github.com/copilot/github-copilot-cli" aria-label="GitHub Copilot CLI" target="_blank">GitHub Copilot CLI</a>, <a href="https://github.com/google-gemini/gemini-cli" rel="noopener" title="Link to https://github.com/google-gemini/gemini-cli" aria-label="Gemini CLI" target="_blank">Gemini CLI</a>, and <a href="https://opencode.ai" rel="noopener" title="Link to https://opencode.ai" aria-label="OpenCode" target="_blank">OpenCode</a>.
No fine-tuned model, no proprietary SDK, no agent platform.
Just a <code>skills/</code>, fourteen <code>SKILL.md</code> files, and a session hook that tells the <a href="/tag/ai-agent" class="tag-link " title="AI Agent" aria-label="agent">agent</a> to read them before doing anything else.</p>
<p>Created by <a href="https://blog.fsck.com" rel="noopener" title="Link to https://blog.fsck.com" aria-label="Jesse Vincent" target="_blank">Jesse Vincent</a> in <a href="https://blog.fsck.com/2025/10/09/superpowers/" rel="noopener" title="Link to https://blog.fsck.com/2025/10/09/superpowers/" aria-label="October 2025" target="_blank">October 2025</a>, the project has accumulated more than 174,000 GitHub stars in seven months and shipped as an <a href="https://claude.com/plugins/superpowers" rel="noopener" title="Link to https://claude.com/plugins/superpowers" aria-label="Anthropic marketplace plugin" target="_blank">Anthropic marketplace plugin</a> in early 2026.
The popularity is not what makes it interesting.
The real bet is that what AI coding agents are missing is not capability but <em>discipline</em>, and that discipline can be distributed as plain text.</p>
<h2 class="heading"><span id="why-an-agent-needs-this"></span>Why an Agent Needs This<a href="https://blog.marcnuri.com/superpowers-claude-code-skills-framework#why-an-agent-needs-this" aria-label="why-an-agent-needs-this permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>A modern coding agent is impressively capable.
It also fails in remarkably consistent ways:</p>
<ul>
<li>It writes the code first, then the test, then forgets to run it.</li>
<li>It declares the bug fixed because the failing example <em>now seems to work</em>.</li>
<li>It patches the symptom and never investigates the root cause.</li>
<li>It claims the build passes without ever running the build.</li>
<li>And when called out, it knows perfectly well it should have done otherwise.</li>
</ul>
<p>These are not knowledge gaps. The agent already has the right concepts in its training. Ask it to lecture you on <a href="/tag/tdd" class="tag-link " title="Test-Driven Development (TDD)" aria-label="TDD">TDD</a> and it will.
What it lacks is a mechanism that holds it to those concepts when shortcuts are easier.
That is the hole Superpowers tries to fill.</p>
<h2 class="heading"><span id="what-superpowers-is"></span>What the Superpowers Skills Framework Is<a href="https://blog.marcnuri.com/superpowers-claude-code-skills-framework#what-superpowers-is" aria-label="what-superpowers-is permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>Superpowers is unusually small.
It consists of three pieces:</p>
<ol>
<li>A directory of fourteen <em>skills</em>, each a single <code>SKILL.md</code> file with YAML frontmatter and a few hundred words of instructions for one engineering practice: TDD, debugging, brainstorming, writing plans, code review, verification before completion.</li>
<li>A session-start hook that injects a short bootstrap document, reportedly under two thousand tokens, telling the agent to invoke a relevant skill before it does anything else.</li>
<li>Per-host plugin manifests that let each agent host discover the same skills in its own way.</li>
</ol>
<p>That is the entire payload.
Engineering culture, distributed as a <a href="/tag/git" class="tag-link " title="Git" aria-label="git">git</a> repository you can skim in an hour.</p>
<h2 class="heading"><span id="methodology-cycle"></span>The Methodology in One Cycle<a href="https://blog.marcnuri.com/superpowers-claude-code-skills-framework#methodology-cycle" aria-label="methodology-cycle permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>A typical task moves through brainstorming, a <a href="https://git-scm.com/docs/git-worktree" rel="noopener" title="Link to https://git-scm.com/docs/git-worktree" aria-label="git worktree" target="_blank">git worktree</a>, a written plan, subagent-driven implementation with TDD inside, a code-review pass from a fresh agent, and a finishing step that closes out the branch.
Each phase has its own skill, and the next phase will not begin until the previous one is done.
The <a href="/tag/workflow" class="tag-link " title="Workflow" aria-label="workflow">workflow</a> is the skills, in order.</p>
<p>This is the discipline layer for <em>one task at a time</em>.
What gets layered on top once you are running many such cycles in parallel is a separate climb, which I outlined in <a href="/missing-levels-ai-assisted-development" class="post-link " title="The Missing Levels of AI-Assisted Development: From Agent Chaos to Orchestration">the missing levels of AI-assisted development</a>.</p>
<span class="post-image__pusher "></span><figure class="post-image "><span class="post-image__scrim"></span><a href="/assets/methodology-cycle.Pzf_pwFz_Z2x2T6Y.png" class="post-image__link" title="Superpowers Claude Code skills framework lifecycle diagram: brainstorm, worktree, plan, subagent development, TDD, review, finish, arranged as a clockwise loop of glowing 3D nodes on a dark background"><span class="post-image__image-container"><picture><source type="image/webp" srcset="https://blog.marcnuri.com/assets/methodology-cycle.Pzf_pwFz_2ncftQ.webp 314w,https://blog.marcnuri.com/assets/methodology-cycle.Pzf_pwFz_YPXd4.webp 627w,https://blog.marcnuri.com/assets/methodology-cycle.Pzf_pwFz_Z12tas1.webp 1254w" sizes="(min-width: 1254px) 1254px, 100vw"><img sizes="(min-width: 1254px) 1254px, 100vw" decoding="async" loading="lazy" src="https://blog.marcnuri.com/assets/methodology-cycle.Pzf_pwFz_Z2x2T6Y.png" srcset="https://blog.marcnuri.com/assets/methodology-cycle.Pzf_pwFz_1Ul5Sx.png 314w,https://blog.marcnuri.com/assets/methodology-cycle.Pzf_pwFz_wYNBK.png 627w,https://blog.marcnuri.com/assets/methodology-cycle.Pzf_pwFz_Z2x2T6Y.png 1254w" alt="Superpowers Claude Code skills framework lifecycle diagram: brainstorm, worktree, plan, subagent development, TDD, review, finish, arranged as a clockwise loop of glowing 3D nodes on a dark background" style="aspect-ratio:1254 / 1254;--image-width:1254px"></picture></span></a></figure>
<h2 class="heading"><span id="representative-skills"></span>A Tour of Representative Skills<a href="https://blog.marcnuri.com/superpowers-claude-code-skills-framework#representative-skills" aria-label="representative-skills permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>The repository ships fourteen skills.
Six of them carry most of the weight:</p>
<ul>
<li><strong><code>brainstorming</code></strong>: refuses to write code until the agent has asked clarifying questions and proposed a design you can accept.</li>
<li><strong><code>writing-plans</code></strong>: breaks a feature into two-to-five-minute tasks, with file paths and tests written down before any code is touched.</li>
<li><strong><code>test-driven-development</code></strong>: enforces classic red/green/refactor and treats <em>I&#x27;ll write the test after</em> as grounds to delete the implementation and start over.</li>
<li><strong><code>systematic-debugging</code></strong>: a four-phase process that explicitly forbids fixing what you have not understood.</li>
<li><strong><code>subagent-driven-development</code></strong>: dispatches the actual implementation to a fresh subagent that has only the plan and the tests, then sends a second agent to review the result.</li>
<li><strong><code>verification-before-completion</code></strong>: requires the agent to run the verification command itself and read the output before claiming anything is done.</li>
</ul>
<p>The remaining eight cover git worktrees, executing plans, requesting and receiving code review, parallel agent dispatch, finishing branches, the bootstrap <code>using-superpowers</code> skill itself, and the meta-skill of authoring new skills.</p>
<h2 class="heading"><span id="multi-host"></span>Multi-Host Skills: Not Just Claude Code<a href="https://blog.marcnuri.com/superpowers-claude-code-skills-framework#multi-host" aria-label="multi-host permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>Although Anthropic&#x27;s plugin marketplace is the most visible distribution channel, Superpowers is not a Claude-only project.
The same <code>skills/</code> directory powers Cursor, OpenAI Codex (CLI and app), GitHub Copilot CLI, Gemini CLI (via extension), and the open-source <a href="https://opencode.ai" rel="noopener" title="Link to https://opencode.ai" aria-label="OpenCode" target="_blank">OpenCode</a> harness.
Each host gets a thin manifest such as <code>.claude-plugin/</code>, <code>.cursor-plugin/</code>, <code>.codex-plugin/</code>, <code>.opencode/</code>, or <code>gemini-extension.json</code> that points its own discovery mechanism at the same markdown.
The skills themselves are host-agnostic. Superpowers is portable engineering <a href="/category/ai" class="category-link " title="Artificial Intelligence: Everything related to artificial intelligence (AI) and machine learning (ML)" aria-label="culture">culture</a>, not a feature of any single agent.</p>
<span class="post-image__pusher "></span><figure class="post-image "><span class="post-image__scrim"></span><a href="/assets/multi-host.fbYEHMh__KXLd1.png" class="post-image__link" title="Superpowers multi-host AI agent skills illustration: one glowing markdown file at the center radiates six luminous streams to six terminal windows labeled Claude Code, Cursor, Codex, Copilot CLI, Gemini CLI, and OpenCode"><span class="post-image__image-container"><picture><source type="image/webp" srcset="https://blog.marcnuri.com/assets/multi-host.fbYEHMh__1vERvX.webp 314w,https://blog.marcnuri.com/assets/multi-host.fbYEHMh__Z2cga1Q.webp 627w,https://blog.marcnuri.com/assets/multi-host.fbYEHMh__2viN2V.webp 1254w" sizes="(min-width: 1254px) 1254px, 100vw"><img sizes="(min-width: 1254px) 1254px, 100vw" decoding="async" loading="lazy" src="https://blog.marcnuri.com/assets/multi-host.fbYEHMh__KXLd1.png" srcset="https://blog.marcnuri.com/assets/multi-host.fbYEHMh__Z7uM9o.png 314w,https://blog.marcnuri.com/assets/multi-host.fbYEHMh__1eKj6I.png 627w,https://blog.marcnuri.com/assets/multi-host.fbYEHMh__KXLd1.png 1254w" alt="Superpowers multi-host AI agent skills illustration: one glowing markdown file at the center radiates six luminous streams to six terminal windows labeled Claude Code, Cursor, Codex, Copilot CLI, Gemini CLI, and OpenCode" style="aspect-ratio:1254 / 1254;--image-width:1254px"></picture></span></a></figure>
<h2 class="heading"><span id="iron-laws"></span>The Iron Laws: Discipline as Anti-Rationalization<a href="https://blog.marcnuri.com/superpowers-claude-code-skills-framework#iron-laws" aria-label="iron-laws permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>Read enough of the skill files and a pattern emerges.
Each rigid skill opens with a capitalized, non-negotiable rule, an <em>Iron Law</em>, followed by a table of <em>red flags</em>: the rationalizations the agent is most likely to use to skip the rule.</p>
<p>The TDD skill opens with:</p>
<blockquote>
<p><strong>NO PRODUCTION CODE WITHOUT A FAILING TEST FIRST</strong></p>
</blockquote>
<p>Verification&#x27;s Iron Law is:</p>
<blockquote>
<p><strong>NO COMPLETION CLAIMS WITHOUT FRESH VERIFICATION EVIDENCE</strong></p>
</blockquote>
<p>Debugging&#x27;s is:</p>
<blockquote>
<p><strong>NO FIXES WITHOUT ROOT CAUSE INVESTIGATION FIRST</strong></p>
</blockquote>
<p>The accompanying red flags are unsparing.
TDD flags <em>tests passing on first run</em>, <em>keeping deleted code as reference</em>, and the eternal <em>just this once</em>.
Verification flags the words <em>should</em>, <em>probably</em>, and <em>seems to</em>.</p>
<p>These are not motivational posters.
They read like a senior engineer&#x27;s code-review feedback codified into instructions.
The target is not <em>teaching</em> the agent, because it already knows the rules.
The target is preventing the agent from talking itself out of following them.</p>
<h2 class="heading"><span id="whats-next"></span>What to Watch Next<a href="https://blog.marcnuri.com/superpowers-claude-code-skills-framework#whats-next" aria-label="whats-next permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>Superpowers ships fast.
Vincent has published several follow-ups on his blog since the <a href="https://blog.fsck.com/2025/10/09/superpowers/" rel="noopener" title="Link to https://blog.fsck.com/2025/10/09/superpowers/" aria-label="origin post" target="_blank">origin post</a>, including a <a href="https://blog.fsck.com/2026/03/09/superpowers-5/" rel="noopener" title="Link to https://blog.fsck.com/2026/03/09/superpowers-5/" aria-label="fifth major release" target="_blank">fifth major release</a> in March 2026 and a candid post on the <a href="https://blog.fsck.com/2026/03/31/slop-prs/" rel="noopener" title="Link to https://blog.fsck.com/2026/03/31/slop-prs/" aria-label="Link to https://blog.fsck.com/2026/03/31/slop-prs/" target="_blank"><em>agentic slop PR</em></a> problem the project has exposed as it has scaled.</p>
<p>The interesting question is not whether the discipline approach can work.
The skill files strongly suggest that it can.
The more interesting question is which other parts of an engineering culture, such as code review style, on-call runbooks, security posture, or release management, turn out to be representable as markdown that a coding agent can be made to follow.
Once each agent runs with this kind of discipline, coordinating <em>many of them</em> becomes the next concern, which is exactly what the <a href="/ai-coding-agent-dashboard" class="post-link " title="AI Coding Agent Dashboard: Orchestrating Claude Code Across Devices">AI coding agent dashboard</a> was built for.</p>
  ]]></content:encoded>
            <category>Artificial Intelligence</category>
            <enclosure url="https://blog.marcnuri.com/assets/superpowers-claude-code-skills-framework.C0rW4I3s_18HN7H.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[The Missing Levels of AI-Assisted Development: From Agent Chaos to Orchestration]]></title>
            <link>https://blog.marcnuri.com/missing-levels-ai-assisted-development</link>
            <guid isPermaLink="false">https://blog.marcnuri.com/missing-levels-ai-assisted-development</guid>
            <pubDate>Tue, 21 Apr 2026 18:00:00 GMT</pubDate>
            <description><![CDATA[Steve Yegge's 8 levels of AI-assisted development skip the hardest climb: the five missing rungs between juggling coding agents and your own orchestrator.]]></description>
            <content:encoded><![CDATA[
    <div><a href="https://blog.marcnuri.com/missing-levels-ai-assisted-development">Original post</a></div>
    <h2 class="heading"><span id="introduction"></span>Introduction<a href="https://blog.marcnuri.com/missing-levels-ai-assisted-development#introduction" aria-label="introduction permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>A few months ago I wrote about <a href="/boosting-developer-productivity-ai-2025" class="post-link " title="Boosting My Developer Productivity with AI in 2025">shifting from AI implementer to AI orchestrator</a> and, shortly after, about <a href="/ai-coding-agent-dashboard" class="post-link " title="AI Coding Agent Dashboard: Orchestrating Claude Code Across Devices">the AI coding agent dashboard I built</a> to keep that orchestration from collapsing under its own weight.
The response surprised me.
The most common question was not <em>&quot;how do I get started?&quot;</em> but <em>&quot;how do I get past this?&quot;</em>.</p>
<p>Most developers I talk to can picture the first few steps up the <a href="/category/ai" class="category-link " title="Artificial Intelligence: Everything related to artificial intelligence (AI) and machine learning (ML)" aria-label="AI-assisted development">AI-assisted development</a> ladder.
Turn on autocomplete, let the agent edit files, trust it a little more every week.
What nobody seems to agree on is what happens once you have five, ten, or twenty agents running, and it has stopped feeling like productivity and started feeling like a second full-time job.</p>
<p>Steve Yegge has a useful framework for this.
His <a href="https://newsletter.pragmaticengineer.com/p/steve-yegge-on-ai-agents-and-the" rel="noopener" title="Link to https://newsletter.pragmaticengineer.com/p/steve-yegge-on-ai-agents-and-the" aria-label="8 levels of AI-assisted development, as described on The Pragmatic Engineer" target="_blank">8 levels of AI-assisted development, as described on The Pragmatic Engineer</a>, have become a common shorthand among people thinking seriously about <a href="/tag/ai-agent" class="tag-link " title="AI Agent" aria-label="coding agents">coding agents</a>.
The more I sit with it, the more I suspect Level 7 and Level 8 are not one step apart.
They are four or five.
This post is not a finished map.
It is my current sense of the rungs that seem to be there, based on my own climb so far.</p>
<h2 class="heading"><span id="yegges-ladder"></span>Steve Yegge&#x27;s 8 Levels of AI-Assisted Development<a href="https://blog.marcnuri.com/missing-levels-ai-assisted-development#yegges-ladder" aria-label="yegges-ladder permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>Steve Yegge&#x27;s 8 levels of AI-assisted development describe a developer&#x27;s progression from no AI assistance to building a custom agent orchestrator.
As described in his <a href="https://newsletter.pragmaticengineer.com/p/steve-yegge-on-ai-agents-and-the" rel="noopener" title="Link to https://newsletter.pragmaticengineer.com/p/steve-yegge-on-ai-agents-and-the" aria-label="Pragmatic Engineer interview" target="_blank">Pragmatic Engineer interview</a>:</p>
<ul>
<li><strong>Level 1</strong>: No AI.</li>
<li><strong>Level 2</strong>: IDE coding agent with permissions on.</li>
<li><strong>Level 3</strong>: IDE coding agent in YOLO mode.</li>
<li><strong>Level 4</strong>: Conversation over diff review.</li>
<li><strong>Level 5</strong>: CLI-first workflow; the IDE is no longer home.</li>
<li><strong>Level 6</strong>: Several parallel agents.</li>
<li><strong>Level 7</strong>: Ten-plus agents, coordinated by hand.</li>
<li><strong>Level 8</strong>: A custom agent orchestrator.</li>
</ul>
<p>Levels 1 through 5 are mostly about <strong>trust in one agent</strong>.
Level 6 is where parallelism starts to pay off.
Level 7 is the moment you realize you are not ready for parallelism.
Level 8 is the moment you decide to build your way out of the mess.</p>
<p>That is a good ladder.
It also has a very large missing rung.</p>
<h2 class="heading"><span id="the-gap"></span>The Gap Between Level 7 and Level 8<a href="https://blog.marcnuri.com/missing-levels-ai-assisted-development#the-gap" aria-label="the-gap permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>Read Yegge&#x27;s own description of the leap and something jumps out: there is no middle.
One paragraph you are texting the wrong agent by accident and misplacing work in tmux windows; the next paragraph you are writing an orchestrator in Go.
<a href="https://addyosmani.com/blog/code-agent-orchestra/" rel="noopener" title="Link to https://addyosmani.com/blog/code-agent-orchestra/" aria-label="Addy Osmani" target="_blank">Addy Osmani</a> captures the same transition in his &quot;Code Agent Orchestra&quot; piece with one of my favorite lines of the year:</p>
<blockquote>
<p>The bottleneck is no longer generation. It&#x27;s verification.</p>
</blockquote>
<p>That is exactly what breaks at Level 7.
You can produce more code than you can realistically review.
Specs silently drift between agents because each one is working from the prompt <em>you gave it</em>, not a shared source of truth.
Two agents edit overlapping files and neither knows.
You rubber-stamp pull requests that you would have rejected at Level 5.
And the cognitive cost of twelve parallel threads starts to erase the productivity you went looking for.</p>
<p>Jumping from there to <em>&quot;build your own orchestrator&quot;</em> is, for almost everyone, unrealistic.
Writing a task scheduler is not the hard part.
The hard part is figuring out <em>what</em> to schedule, <em>when</em> a human should intervene, and <em>how</em> to retain enough understanding of the system to stay the person in charge of it.</p>
<p>Those are not engineering problems.
They are workflow problems.
And they have rungs of their own.</p>
<h2 class="heading"><span id="the-missing-rungs"></span>The Missing Levels Between Agent Chaos and Orchestration<a href="https://blog.marcnuri.com/missing-levels-ai-assisted-development#the-missing-rungs" aria-label="the-missing-rungs permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>What follows is my current sense of the sequence between Yegge&#x27;s Level 7 and Level 8.
I have climbed some of these rungs.
Others I can only see from below.
Think of them as an agentic Software Development Lifecycle (SDLC) maturity model for the mid-game, where agent autonomy goes up but your visibility into the system has to go up with it.</p>
<span class="post-image__pusher "></span><figure class="post-image "><span class="post-image__scrim"></span><a href="/assets/missing-levels-diagram.7Qxklwur_ZXSsn9.png" class="post-image__link" title="Isometric staircase diagram showing the climb from Level 7 (ten-plus agents by hand) up through five intermediate rungs (7.1 See the swarm, 7.2 Decouple, 7.3 Delegate async, 7.4 Gate by blast radius, 7.5 Build primitives) to Level 8 (custom orchestrator)"><span class="post-image__image-container"><picture><source type="image/webp" srcset="https://blog.marcnuri.com/assets/missing-levels-diagram.7Qxklwur_i8UoE.webp 384w,https://blog.marcnuri.com/assets/missing-levels-diagram.7Qxklwur_Z1HTJvk.webp 768w,https://blog.marcnuri.com/assets/missing-levels-diagram.7Qxklwur_Z2kfzgY.webp 1536w" sizes="(min-width: 1536px) 1536px, 100vw"><img sizes="(min-width: 1536px) 1536px, 100vw" decoding="async" loading="lazy" src="https://blog.marcnuri.com/assets/missing-levels-diagram.7Qxklwur_ZXSsn9.png" srcset="https://blog.marcnuri.com/assets/missing-levels-diagram.7Qxklwur_ZynjUf.png 384w,https://blog.marcnuri.com/assets/missing-levels-diagram.7Qxklwur_2uK8XH.png 768w,https://blog.marcnuri.com/assets/missing-levels-diagram.7Qxklwur_ZXSsn9.png 1536w" alt="Isometric staircase diagram showing the climb from Level 7 (ten-plus agents by hand) up through five intermediate rungs (7.1 See the swarm, 7.2 Decouple, 7.3 Delegate async, 7.4 Gate by blast radius, 7.5 Build primitives) to Level 8 (custom orchestrator)" style="aspect-ratio:1536 / 1024;--image-width:1536px"></picture></span></a></figure>
<h3 class="heading"><span id="see-the-swarm"></span>7.1 See the swarm<a href="https://blog.marcnuri.com/missing-levels-ai-assisted-development#see-the-swarm" aria-label="see-the-swarm permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h3>
<p>The first thing that breaks at Level 7 is not the agents.
It is your memory of them.</p>
<p>You cannot coordinate what you cannot see, and at ten-plus concurrent sessions, tmux tabs and terminal windows stop being a mental model.
You start forgetting which coding agent is doing what, which branch it is on, which one is stalled waiting for permission, and which one finished an hour ago.
What fixed this for me was not a new agent or a better model.
It was externalizing the state of every session into one view I could glance at.</p>
<p>That is what the <a href="/ai-coding-agent-dashboard" class="post-link " title="AI Coding Agent Dashboard: Orchestrating Claude Code Across Devices">coding agent dashboard I built earlier this year</a> does.
It pulls the device, branch, model, context usage, status, and current task of every active session into one place.
You do not need my dashboard for this rung.
You need <em>a</em> dashboard.
A spreadsheet, a shell script, anything that externalizes what your working memory can no longer hold.</p>
<div style="max-width:480px;margin:0 auto"><span class="post-image__pusher "></span><figure class="post-image "><span class="post-image__scrim"></span><a href="/assets/see-the-swarm.C-FKuj1i_2dg4ni.png" class="post-image__link" title="Chaotic stack of terminal windows on the left, a single unified dashboard panel on the right, with a calm human figure in front of it"><span class="post-image__image-container"><picture><source type="image/webp" srcset="https://blog.marcnuri.com/assets/see-the-swarm.C-FKuj1i_ngMM0.webp 384w,https://blog.marcnuri.com/assets/see-the-swarm.C-FKuj1i_2xAOL.webp 768w,https://blog.marcnuri.com/assets/see-the-swarm.C-FKuj1i_amM43.webp 1536w" sizes="(min-width: 1536px) 1536px, 100vw"><img sizes="(min-width: 1536px) 1536px, 100vw" decoding="async" loading="lazy" src="https://blog.marcnuri.com/assets/see-the-swarm.C-FKuj1i_2dg4ni.png" srcset="https://blog.marcnuri.com/assets/see-the-swarm.C-FKuj1i_2hhrTO.png 384w,https://blog.marcnuri.com/assets/see-the-swarm.C-FKuj1i_1VyfWA.png 768w,https://blog.marcnuri.com/assets/see-the-swarm.C-FKuj1i_2dg4ni.png 1536w" alt="Chaotic stack of terminal windows on the left, a single unified dashboard panel on the right, with a calm human figure in front of it" style="aspect-ratio:1536 / 1024;--image-width:1536px"></picture></span></a></figure></div>
<h3 class="heading"><span id="decouple-from-the-machine"></span>7.2 Decouple from the machine<a href="https://blog.marcnuri.com/missing-levels-ai-assisted-development#decouple-from-the-machine" aria-label="decouple-from-the-machine permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h3>
<p>Once you can see all your agents, the next thing you want is to stop being chained to the machine they run on.</p>
<p>My daily setup involves a laptop and a Linux workstation.
Before this rung, agents were pinned to whichever machine I happened to start them on.
After it, I could spawn a session on the workstation from my laptop, attach to a session on the workstation from my phone, and kick off work from a tablet on the couch.
I did not want to work more hours.
I wanted to stop paying the friction of <em>&quot;is this the machine the agent is on?&quot;</em> every time I switched contexts.</p>
<p>There is more than one way up this rung.
A shared tmux server reachable over SSH gets you part of the way.
Tools like <a href="https://tmate.io/" rel="noopener" title="Link to https://tmate.io/" aria-label="tmate" target="_blank">tmate</a>, Tailscale, or any browser-accessible terminal close the gap further.
What matters is that the agent stops being pinned to a physical device and starts being reachable from wherever you happen to be.</p>
<p>This is where parallelism stops being a local trick and starts becoming a property of your workflow.
Cross-device visibility and control turn a group of parallel agents into something closer to a multi-agent team that happens to share your laptop.</p>
<div style="max-width:480px;margin:0 auto"><span class="post-image__pusher "></span><figure class="post-image "><span class="post-image__scrim"></span><a href="/assets/decouple-from-the-machine.B2tqOs89_ZNHQc2.png" class="post-image__link" title="Agents floating above a laptop, a phone, and a tablet, connected by luminous data streams to all three devices at once"><span class="post-image__image-container"><picture><source type="image/webp" srcset="https://blog.marcnuri.com/assets/decouple-from-the-machine.B2tqOs89_Z2ceaar.webp 314w,https://blog.marcnuri.com/assets/decouple-from-the-machine.B2tqOs89_31Gd.webp 627w,https://blog.marcnuri.com/assets/decouple-from-the-machine.B2tqOs89_ZAqBKW.webp 1254w" sizes="(min-width: 1254px) 1254px, 100vw"><img sizes="(min-width: 1254px) 1254px, 100vw" decoding="async" loading="lazy" src="https://blog.marcnuri.com/assets/decouple-from-the-machine.B2tqOs89_ZNHQc2.png" srcset="https://blog.marcnuri.com/assets/decouple-from-the-machine.B2tqOs89_Z11zNQ0.png 314w,https://blog.marcnuri.com/assets/decouple-from-the-machine.B2tqOs89_1aGn0E.png 627w,https://blog.marcnuri.com/assets/decouple-from-the-machine.B2tqOs89_ZNHQc2.png 1254w" alt="Agents floating above a laptop, a phone, and a tablet, connected by luminous data streams to all three devices at once" style="aspect-ratio:1254 / 1254;--image-width:1254px"></picture></span></a></figure></div>
<h3 class="heading"><span id="delegate-asynchronously"></span>7.3 Delegate asynchronously<a href="https://blog.marcnuri.com/missing-levels-ai-assisted-development#delegate-asynchronously" aria-label="delegate-asynchronously permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h3>
<p>Up to here, every agent is still waiting for <em>you</em>.
You start it, you watch it, you answer its questions.</p>
<p>The next rung is letting go of that loop.
<a href="/boosting-developer-productivity-ai-2025" class="post-link " title="Boosting My Developer Productivity with AI in 2025">GitHub Copilot coding agent workflows</a>, and similar <a href="/tag/github" class="tag-link " title="GitHub" aria-label="issue-to-pull-request agent workflows">issue-to-pull-request agent workflows</a>, change the unit of work from <em>&quot;a terminal session&quot;</em> to <em>&quot;a well-written issue and a pull request&quot;</em>.
You describe the change in prose, assign it, walk away, and review the result whenever you get to it.
Long-running tasks progress while you are on a call, on a train, or asleep.</p>
<p>This is the rung where the <strong>quality of your project</strong> starts to dominate the quality of your output.
Async delegation only works if the agent has enough context to succeed without you in the room: clear specs, strong test coverage, and well-scoped interfaces.
A well-structured codebase amplifies the agent.
A chaotic one amplifies the chaos.</p>
<div style="max-width:480px;margin:0 auto"><span class="post-image__pusher "></span><figure class="post-image "><span class="post-image__scrim"></span><a href="/assets/delegate-asynchronously.CNjDiNf__Z16jNyd.png" class="post-image__link" title="A developer drops an issue into an input slot on the left while another retrieves a completed pull request from an output slot on the right, with a glowing factory of agents processing work in between"><span class="post-image__image-container"><picture><source type="image/webp" srcset="https://blog.marcnuri.com/assets/delegate-asynchronously.CNjDiNf__Z2iqhai.webp 314w,https://blog.marcnuri.com/assets/delegate-asynchronously.CNjDiNf__Z23okB7.webp 627w,https://blog.marcnuri.com/assets/delegate-asynchronously.CNjDiNf__Z2gX9RE.webp 1254w" sizes="(min-width: 1254px) 1254px, 100vw"><img sizes="(min-width: 1254px) 1254px, 100vw" decoding="async" loading="lazy" src="https://blog.marcnuri.com/assets/delegate-asynchronously.CNjDiNf__Z16jNyd.png" srcset="https://blog.marcnuri.com/assets/delegate-asynchronously.CNjDiNf__1vmMCm.png 314w,https://blog.marcnuri.com/assets/delegate-asynchronously.CNjDiNf__1KoJbx.png 627w,https://blog.marcnuri.com/assets/delegate-asynchronously.CNjDiNf__Z16jNyd.png 1254w" alt="A developer drops an issue into an input slot on the left while another retrieves a completed pull request from an output slot on the right, with a glowing factory of agents processing work in between" style="aspect-ratio:1254 / 1254;--image-width:1254px"></picture></span></a></figure></div>
<h3 class="heading"><span id="gate-by-blast-radius"></span>7.4 Gate by blast radius<a href="https://blog.marcnuri.com/missing-levels-ai-assisted-development#gate-by-blast-radius" aria-label="gate-by-blast-radius permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h3>
<p>This is the rung I have not climbed yet.</p>
<p>At Level 7 I have more work flowing through more agents than I can possibly inspect line by line, and I still try to.
I review every pull request.
I open every diff.
It is exhausting, and I know it does not scale, but the alternative feels reckless.</p>
<p>I think the better move is to <strong>decide in advance</strong> which decisions deserve a human gate, instead of compensating for the volume with fear.
Not <em>&quot;does this need approval?&quot;</em>, because the honest answer is always <em>&quot;probably&quot;</em>.
The more useful question is <em>why</em> it would need approval:</p>
<ul>
<li>How big is the <strong>blast radius</strong>: one component, or a dozen services?</li>
<li>Is the change <strong>reversible</strong> in minutes, or would rolling it back take hours?</li>
<li>Does it <strong>commit</strong> the project to anything external, such as money, contracts, or third-party accounts?</li>
<li>Is it <strong>visible</strong> to users, customers, or stakeholders if it goes wrong?</li>
</ul>
<p>If all four are low, the agent could in theory proceed on its own and tell me after the fact.
If any one of them is high, the agent stops and waits for me.
This is not a new idea.
Incident response teams have lived on similar dimensions for years.
The hard part is encoding it into a workflow so it actually shapes what lands on my review queue, instead of just being a diagram on a slide.</p>
<p>A fifth, boring dimension deserves a mention here: <strong>cost</strong>.
Ten agents running continuously against a capable model is not free, and the bill grows quietly while you sleep.
Treating spend as just another gate, with per-session budgets and a hard ceiling, is the difference between an experiment and a surprise.</p>
<p>If I get this rung right, human time moves from <em>tasks</em> to <em>decisions</em>, which is where it actually belongs.
I am not there yet.
Most of the time I am still staring at diffs.</p>
<h3 class="heading"><span id="build-the-primitives"></span>7.5 Build the primitives<a href="https://blog.marcnuri.com/missing-levels-ai-assisted-development#build-the-primitives" aria-label="build-the-primitives permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h3>
<p>The last rung before a real orchestrator is where things stop being policies and start being code.</p>
<p>At some point the dashboard needs to know more than where your sessions are.
It needs to know which tasks are queued and which are in flight, so two agents do not grab the same issue.
The smallest version I have been sketching in my head is a shared list of open issues, a lightweight <em>&quot;claimed&quot;</em> flag, and an agent-side hook that checks before picking one up.
Barely a hundred lines of glue, and yet it seems like it would be the single biggest reduction in duplicated work I can imagine.</p>
<p>From there the primitives accumulate quickly.
Checkpointing long-running sessions so a crash does not lose an afternoon of work.
Scoped, short-lived credentials per session so <em>&quot;the agent has my credentials&quot;</em> stops being a sentence that keeps you up at night.
A way to feed spec updates back to an agent that was started twenty minutes ago.</p>
<p>None of that is a custom orchestrator yet.
But each of those primitives is what a custom orchestrator would be <em>made of</em>.
If they accumulate one at a time, Level 8 stops being a weekend project and becomes the natural conclusion of a pile of small, pragmatic tools.
This is the direction my tooling keeps pulling me in, even when I am not actively building for it.</p>
<h2 class="heading"><span id="beyond-level-8"></span>Beyond Level 8: Fully Autonomous Software Development<a href="https://blog.marcnuri.com/missing-levels-ai-assisted-development#beyond-level-8" aria-label="beyond-level-8 permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>Yegge&#x27;s Level 8 is <em>&quot;build your own orchestrator&quot;</em>, but it is not the end of the road.
<a href="https://www.danshapiro.com/blog/2026/01/the-five-levels-from-spicy-autocomplete-to-the-software-factory/" rel="noopener" title="Link to https://www.danshapiro.com/blog/2026/01/the-five-levels-from-spicy-autocomplete-to-the-software-factory/" aria-label="Dan Shapiro&#x27;s five levels from spicy autocomplete to the Dark Factory" target="_blank">Dan Shapiro&#x27;s five levels from spicy autocomplete to the Dark Factory</a> describe a very different endpoint: Level 5, the <strong>Dark Factory</strong>.
A software process that takes specifications in and ships software out, with no human writing or reviewing code.</p>
<p>It is no longer hypothetical.
<a href="https://simonwillison.net/2026/Feb/7/software-factory/" rel="noopener" title="Link to https://simonwillison.net/2026/Feb/7/software-factory/" aria-label="Simon Willison has documented" target="_blank">Simon Willison has documented</a> how StrongDM&#x27;s three-person team has been operating this way since mid-2025, shipping a codebase of around 32,000 lines of Rust, Go, and TypeScript under a rule that no human writes or reviews the code.
The questions it raises, about specification quality, the information barrier between builder and evaluator, and who is accountable for a codebase nobody has read, deserve a post of their own.</p>
<p>For now I am comfortable saying I am not there, and I am not sure I want to be.
The climb I am describing stops well short of that.</p>
<h2 class="heading"><span id="conclusion"></span>Conclusion<a href="https://blog.marcnuri.com/missing-levels-ai-assisted-development#conclusion" aria-label="conclusion permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>Frameworks like Yegge&#x27;s are useful because they let us talk about where we are and where we are trying to go.
But a ladder with a missing rung is not a ladder. It is a drop.
And the drop between <em>&quot;ten agents managed by hand&quot;</em> and <em>&quot;build your own orchestrator&quot;</em> has swallowed a lot of promising AI-assisted workflows.</p>
<p>The climb between them is not glamorous.
It is visibility, distribution, asynchrony, gating, and small primitives.
Five quiet rungs that together make Level 8 feasible and, much more importantly, make Level 7 survivable.</p>
<p>There is also a second question hiding beneath the whole climb: not how high you go, but <a href="/project-agent-person-centric-ai-coding-tools" class="post-link " title="Project, Agent, Person: The Missing Axis of AI Coding Tools">what the tools you are climbing with are built around</a>: the project, the agent, or you. It is a large part of why the orchestrator ends up being yours to build.</p>
<p>If you are somewhere on this climb, I would like to hear where.
I am tracking feedback and ideas on the <a href="https://github.com/manusa/ai-beacon/discussions" rel="noopener" title="Link to https://github.com/manusa/ai-beacon/discussions" aria-label="ai-beacon discussions" target="_blank">ai-beacon discussions</a> while I work on the tooling, so that is the best place to compare notes.
The more of them we share, the better the next version of the ladder will be.</p>
  ]]></content:encoded>
            <category>Artificial Intelligence</category>
            <enclosure url="https://blog.marcnuri.com/assets/missing-levels-ai-assisted-development.B3kpk2pX_1fOQQr.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Promoted to Senior Principal Software Engineer at Red Hat]]></title>
            <link>https://blog.marcnuri.com/promoted-senior-principal-software-engineer-red-hat</link>
            <guid isPermaLink="false">https://blog.marcnuri.com/promoted-senior-principal-software-engineer-red-hat</guid>
            <pubDate>Mon, 13 Apr 2026 18:00:00 GMT</pubDate>
            <description><![CDATA[Promoted to Senior Principal Software Engineer at Red Hat. Reflections on the Kubernetes MCP Server, AI-assisted development, and the people behind it.]]></description>
            <content:encoded><![CDATA[
    <div><a href="https://blog.marcnuri.com/promoted-senior-principal-software-engineer-red-hat">Original post</a></div>
    <p>On April 1, 2026, I was promoted to Senior Principal Software Engineer at <a href="/tag/red-hat" class="tag-link " title="Red Hat" aria-label="Red Hat">Red Hat</a>.</p>
<p>I don&#x27;t usually care much about job titles.
But given the uncertainty in the tech industry, the intensity of the past fourteen months, and everything that happened in between, this one hit differently.
It&#x27;s a milestone I genuinely needed.</p>
<h2 class="heading"><span id="the-road-here"></span>The road here<a href="https://blog.marcnuri.com/promoted-senior-principal-software-engineer-red-hat#the-road-here" aria-label="the-road-here permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>If you&#x27;ve read my <a href="/2025-year-in-review-the-year-of-ai" class="post-link " title="2025 Year in Review: The Year of AI">2025 year in review</a>, you know it was a pivotal but difficult year.
The transfer of Red Hat&#x27;s middleware teams to IBM shook me.
<a href="/tag/redhattiversary" class="tag-link " title="RedHattiversary" aria-label="Being a Red Hatter">Being a Red Hatter</a> has always been more than a job for me, it&#x27;s an identity tied to the free software values I&#x27;ve admired since I first started using Linux as a teenager.</p>
<p>But difficult years have a way of producing unexpected opportunities.
In hindsight, I think the work that came out of 2025 is what ultimately led to this promotion.</p>
<h2 class="heading"><span id="the-kubernetes-mcp-server"></span>The Kubernetes MCP Server<a href="https://blog.marcnuri.com/promoted-senior-principal-software-engineer-red-hat#the-kubernetes-mcp-server" aria-label="the-kubernetes-mcp-server permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>In early 2025, I built a proof of concept for a <a href="/model-context-protocol-mcp-introduction" class="post-link " title="Introduction to the Model Context Protocol (MCP): The Future of AI Integration">Model Context Protocol (MCP)</a> server to manage <a href="/tag/kubernetes" class="tag-link " title="Kubernetes" aria-label="Kubernetes">Kubernetes</a> clusters, originally based on the <a href="/tag/fabric8" class="tag-link " title="Fabric8" aria-label="Fabric8 Kubernetes Client">Fabric8 Kubernetes Client</a>.
The first time I saw an AI agent autonomously deploy and manage applications on Kubernetes, I knew this was something special.</p>
<p>I demoed it internally at Red Hat, and the response made it clear this could grow into something much bigger.
Seeing the potential, I made a bet: port it to <a href="/tag/go" class="tag-link " title="Go" aria-label="Go">Go</a>.
Most of the Kubernetes ecosystem is built in Go, and Kubernetes developers are far more comfortable with it.
It turned out to be the right call.</p>
<p>The project grew fast.
People from across Red Hat reached out to collaborate.
The repository <a href="/kubernetes-mcp-server-containers-organization" class="post-link " title="Kubernetes MCP Server Joins the Containers Organization!">joined the Containers organization</a> on GitHub, alongside tools like Podman and Buildah.
Today, the <a href="https://github.com/containers/kubernetes-mcp-server" rel="noopener" title="Kubernetes MCP Server GitHub repository" aria-label="Kubernetes MCP Server" target="_blank">Kubernetes MCP Server</a> has a thriving upstream community with many active contributors and a healthy ecosystem of forks.</p>
<p>It&#x27;s also being productized as the <a href="https://catalog.redhat.com/en/software/container-stacks/detail/69a94fac9956d5da803edd1a" rel="noopener" title="MCP server for Red Hat OpenShift on the Red Hat Ecosystem Catalog" aria-label="MCP server for Red Hat OpenShift" target="_blank">MCP server for Red Hat OpenShift</a>, with a dedicated team at Red Hat working on it.
I actively collaborate with this team, and without them the project wouldn&#x27;t be where it is today.
I feel extremely lucky to be working with such talented people.</p>
<h2 class="heading"><span id="ai-assisted-development"></span>AI-assisted development<a href="https://blog.marcnuri.com/promoted-senior-principal-software-engineer-red-hat#ai-assisted-development" aria-label="ai-assisted-development permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>The MCP server wasn&#x27;t the only way AI reshaped my work.
I also restructured my entire development workflow around <a href="/tag/ai-agent" class="tag-link " title="AI Agent" aria-label="AI coding agents">AI coding agents</a>.
I wrote about this in <a href="/boosting-developer-productivity-ai-2025" class="post-link " title="Boosting My Developer Productivity with AI in 2025">Boosting My Developer Productivity with AI in 2025</a>, and later built an <a href="/ai-coding-agent-dashboard" class="post-link " title="AI Coding Agent Dashboard: Orchestrating Claude Code Across Devices">AI Coding Agent Dashboard</a> to orchestrate multiple agent sessions across devices in real time.</p>
<p>This wasn&#x27;t just a personal experiment.
I&#x27;ve given three internal presentations at Red Hat on how I leverage AI tooling, the workflows I&#x27;ve built, and the productivity gains I&#x27;ve measured.
The interest from colleagues across the company has been one of the most rewarding parts of this journey.</p>
<h2 class="heading"><span id="the-foundation"></span>The foundation<a href="https://blog.marcnuri.com/promoted-senior-principal-software-engineer-red-hat#the-foundation" aria-label="the-foundation permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>None of these new initiatives meant I could step away from my existing responsibilities.
Throughout all of this, I continued maintaining the <a href="/tag/fabric8" class="tag-link " title="Fabric8" aria-label="Fabric8 Kubernetes Client">Fabric8 Kubernetes Client</a> and <a href="/tag/jkube" class="tag-link " title="Eclipse JKube" aria-label="Eclipse JKube">Eclipse JKube</a>, two projects I&#x27;ve been responsible for since I <a href="/tag/redhattiversary" class="tag-link " title="RedHattiversary" aria-label="joined Red Hat">joined Red Hat</a> more than six years ago.</p>
<p>The Kubernetes Client is a foundational building block for projects like Quarkus, Spring Cloud, and Java Operator SDK.
Eclipse JKube remains a key tool for Java developers deploying to Kubernetes.
Keeping these projects healthy while taking on everything else was one of the hardest and most important parts of the past year.</p>
<p>I&#x27;m grateful that I now have help maintaining them, which has been essential as my scope expanded.</p>
<h2 class="heading"><span id="hard-work-and-good-luck"></span>Hard work and good luck<a href="https://blog.marcnuri.com/promoted-senior-principal-software-engineer-red-hat#hard-work-and-good-luck" aria-label="hard-work-and-good-luck permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>Looking back, I think this promotion was a mix of hard work and good timing.
I was fortunate that MCP was emerging as a standard and AI-assisted development was gaining traction right when I was in a position to act on both.
I worked hard, but I also got lucky.
Not everyone who works this hard gets the same recognition, and I&#x27;m very aware of that.</p>
<p>2025 and early 2026 have been the most intense period of my career.
On top of all the new initiatives, I still had to sustain the Fabric8 Kubernetes Client and Eclipse JKube, hire someone to help with maintenance, and deliver three internal presentations on AI-assisted development.
This promotion feels like the culmination of all of it.</p>
<h2 class="heading"><span id="gratitude"></span>Gratitude<a href="https://blog.marcnuri.com/promoted-senior-principal-software-engineer-red-hat#gratitude" aria-label="gratitude permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>This promotion wouldn&#x27;t have happened without the people around me.</p>
<p>My managers gave me the autonomy and trust to pursue ambitious projects.
They believed in my work when the path forward wasn&#x27;t always clear, and they created the environment that made all of this possible.</p>
<p>The peers who provided feedback during the promotion process were generous and deeply encouraging.
Knowing that the people I work with value my contributions means more to me than the title itself.</p>
<p>The tech industry is going through turbulent times.
Recent changes at Red Hat have affected people I deeply respect, people who directly contributed to my growth and success.
I carry their support with me, and this milestone is bittersweet because of it.</p>
<h2 class="heading"><span id="looking-forward"></span>Looking forward<a href="https://blog.marcnuri.com/promoted-senior-principal-software-engineer-red-hat#looking-forward" aria-label="looking-forward permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>I don&#x27;t know what comes next.
What I do know is that the mission hasn&#x27;t changed: building <a href="/tag/open-source" class="tag-link " title="Open Source" aria-label="free and open source">free and open source</a> tools that make developers&#x27; lives easier, whether those developers are humans, AI agents, or both.</p>
<p>I&#x27;m incredibly grateful for this recognition, and even more motivated by the work still ahead.</p>
  ]]></content:encoded>
            <category>Personal</category>
            <enclosure url="https://blog.marcnuri.com/assets/promoted-senior-principal-software-engineer-red-hat.Dmm_ZQsK_64n1A.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Fabric8 Kubernetes Client 7.6 is now available!]]></title>
            <link>https://blog.marcnuri.com/fabric8-kubernetes-client-7-6</link>
            <guid isPermaLink="false">https://blog.marcnuri.com/fabric8-kubernetes-client-7-6</guid>
            <pubDate>Tue, 03 Mar 2026 14:00:00 GMT</pubDate>
            <description><![CDATA[Fabric8 Kubernetes Client 7.6 is available! Check out the major changes and learn how you can contribute.]]></description>
            <content:encoded><![CDATA[
    <div><a href="https://blog.marcnuri.com/fabric8-kubernetes-client-7-6">Original post</a></div>
    <div class="admonition admonition__note"><p class="admonition-title"><i class="admonition-title-icon fa-solid fa-circle-info"></i>Note</p><div class="admonition-content">A newer version of Fabric8 Kubernetes Client is available, jump to <a href="/fabric8-kubernetes-client-8-0" class="post-link " title="Fabric8 Kubernetes Client 8.0 is now available!">Fabric8 Kubernetes Client 8.0 announcement</a>.</div></div>
<p>On behalf of the <a href="/kubernetes-client-java-fabric8-introduction" class="post-link " title="Kubernetes Client for Java: Fabric8 introduction">Fabric8</a>
team and everyone who has contributed, I&#x27;m happy to announce that the Fabric8 Kubernetes Client <code>7.6.1</code> has been
<a href="https://github.com/fabric8io/kubernetes-client/releases/tag/v7.6.1" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client/releases/tag/v7.6.1" aria-label="released" target="_blank">released</a> and is now available from
<a href="https://repo1.maven.org/maven2/io/fabric8/kubernetes-client/7.6.1/" rel="noopener" title="Link to https://repo1.maven.org/maven2/io/fabric8/kubernetes-client/7.6.1/" aria-label="Maven Central" target="_blank">Maven Central</a> 🎉.</p>
<p>This marks the sixth minor release of the Fabric8 Kubernetes Client 7, bringing new features, bug fixes, and improvements while keeping the breaking changes minimal.</p>
<p>Thanks to all of you who have contributed with issue reports, pull requests, feedback, and spreading the word with blogs, videos, comments, and so on.
We really appreciate your help, keep it up!</p>
<h2 class="heading"><span id="whats-new"></span>What&#x27;s new?<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-7-6#whats-new" aria-label="whats-new permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>Without further ado, let&#x27;s have a look at the most significant updates:</p>
<ul>
<li><a href="/fabric8-kubernetes-client-7-6#kubernetes-135" class="post-link " title="Link to the Kubernetes 1.35 section">Kubernetes 1.35 support (Timbernetes)</a></li>
<li><a href="/fabric8-kubernetes-client-7-6#vertx-5" class="post-link " title="Link to the Vert.x 5 section">New Vert.x 5 HTTP client implementation</a></li>
<li><a href="/fabric8-kubernetes-client-7-6#okhttp-5" class="post-link " title="Link to the OkHttp 5 section">OkHttp upgraded to version 5</a></li>
<li>🐛 Many other bug fixes and minor improvements</li>
</ul>
<p>You can find the full changelog for this version in our GitHub <a href="https://github.com/fabric8io/kubernetes-client/releases/tag/v7.6.1" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client/releases/tag/v7.6.1" aria-label="release page" target="_blank">release page</a>.</p>
<h3 class="heading"><span id="kubernetes-135"></span>Kubernetes 1.35 support (Timbernetes)<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-7-6#kubernetes-135" aria-label="kubernetes-135 permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h3>
<p>This release adds support for Kubernetes v1.35 (Timbernetes), ensuring you have access to the latest API resources and CRDs.</p>
<div class="admonition admonition__note"><p class="admonition-title"><i class="admonition-title-icon fa-solid fa-circle-info"></i>Note</p><div class="admonition-content">
<p>Please note that you can still access newer Kubernetes clusters with <strong>older</strong> versions of the Fabric8 client.</p>
<p>The client provides a GenericKubernetesResources class to interact with resources that are not yet supported by the client.
We do recommend always using the <strong>latest</strong> version of the client to benefit from the latest features and bug fixes, but it&#x27;s not mandatory.</p>
</div></div>
<h3 class="heading"><span id="vertx-5"></span>New Vert.x 5 HTTP client implementation<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-7-6#vertx-5" aria-label="vertx-5 permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h3>
<p>A new Vert.x 5 HTTP client implementation has been added with improved async handling and WebSocket separation.
The <code>kubernetes-httpclient-vertx-5</code> module includes a runtime check for Vert.x 5 classes to provide a clear error message when a Vert.x 4/5 conflict occurs.</p>
<p>The HTTP client factory priority has also been fixed: <code>VertxHttpClientFactory</code> (the default) now has priority -1, while <code>OkHttpClientFactory</code> is restored to priority 0.</p>
<p>Note that the <code>kubernetes-httpclient-vertx</code> (Vert.x 4.x) and <code>kubernetes-httpclient-vertx-5</code> (Vert.x 5.x) modules are <strong>mutually exclusive</strong> and must not be included together in your project dependencies.
When using Vert.x 5, exclude the default Vert.x 4 client and add the Vert.x 5 module:</p>
<div class="code" style="background:#232323"><pre style="display:block;overflow-x:auto;padding:0.5em;background:#232323;color:#e6e1dc"><code class="language-xml" style="white-space:pre"><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">dependency</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span>  </span><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">groupId</span><span style="color:#e8bf6a">&gt;</span><span>io.fabric8</span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">groupId</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span>  </span><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">artifactId</span><span style="color:#e8bf6a">&gt;</span><span>kubernetes-client</span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">artifactId</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span>  </span><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">exclusions</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span>    </span><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">exclusion</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span>      </span><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">groupId</span><span style="color:#e8bf6a">&gt;</span><span>io.fabric8</span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">groupId</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span>      </span><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">artifactId</span><span style="color:#e8bf6a">&gt;</span><span>kubernetes-httpclient-vertx</span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">artifactId</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span>    </span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">exclusion</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span>  </span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">exclusions</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span></span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">dependency</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span></span><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">dependency</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span>  </span><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">groupId</span><span style="color:#e8bf6a">&gt;</span><span>io.fabric8</span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">groupId</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span>  </span><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">artifactId</span><span style="color:#e8bf6a">&gt;</span><span>kubernetes-httpclient-vertx-5</span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">artifactId</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span></span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">dependency</span><span style="color:#e8bf6a">&gt;</span></code></pre></div>
<h3 class="heading"><span id="okhttp-5"></span>OkHttp upgraded to version 5<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-7-6#okhttp-5" aria-label="okhttp-5 permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h3>
<p>OkHttp has been upgraded from version 4.12.0 to 5.3.2.
This update removes internal API usage and fixes deprecated OkHttp 5 calls.
While the versions are binary compatible, the major version upgrade might cause side effects in some projects.</p>
<h2 class="heading"><span id="using-this-release"></span>Using this release<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-7-6#using-this-release" aria-label="using-this-release permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>If your project is based on Maven, you just need to add the Fabric8 Kubernetes Client to your Maven dependencies:</p>
<div class="code" style="background:#232323"><pre style="display:block;overflow-x:auto;padding:0.5em;background:#232323;color:#e6e1dc"><code class="language-xml" style="white-space:pre"><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">dependency</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span>  </span><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">groupId</span><span style="color:#e8bf6a">&gt;</span><span>io.fabric8</span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">groupId</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span>  </span><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">artifactId</span><span style="color:#e8bf6a">&gt;</span><span>kubernetes-client</span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">artifactId</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span>  </span><span style="color:#e8bf6a">&lt;</span><span style="color:#e8bf6a">version</span><span style="color:#e8bf6a">&gt;</span><span>7.6.1</span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">version</span><span style="color:#e8bf6a">&gt;</span><span>
</span><span></span><span style="color:#e8bf6a">&lt;/</span><span style="color:#e8bf6a">dependency</span><span style="color:#e8bf6a">&gt;</span></code></pre></div>
<p>If your project is based on Gradle, you just need to add the Fabric8 Kubernetes Client to your Gradle dependencies:</p>
<div class="code" style="background:#232323"><pre style="display:block;overflow-x:auto;padding:0.5em;background:#232323;color:#e6e1dc"><code class="language-groovy" style="white-space:pre"><span>dependencies {
</span><span>  api </span><span style="color:#a5c261">&quot;io.fabric8:kubernetes-client:7.6.1&quot;</span><span>
</span>}</code></pre></div>
<p>Once your project is ready, you can create a new instance of the client to perform operations.
In the following code snippet, I show you how to instantiate the client and retrieve a list of Pods:</p>
<div class="code" style="background:#232323"><pre style="display:block;overflow-x:auto;padding:0.5em;background:#232323;color:#e6e1dc"><code class="language-java" style="white-space:pre"><span style="color:#c26230">try</span><span> (KubernetesClient client = </span><span style="color:#c26230">new</span><span> KubernetesClientBuilder().build()) {
</span>  client.pods().list().getItems().forEach(p -&gt; System.out.println(p.getMetadata().getName()));
}</code></pre></div>
<h2 class="heading"><span id="how-can-you-help"></span>How can you help?<a href="https://blog.marcnuri.com/fabric8-kubernetes-client-7-6#how-can-you-help" aria-label="how-can-you-help permalink" class="anchor"><i class="anchor__link fa-solid fa-link"></i></a></h2>
<p>If you&#x27;re interested in helping out and are a first-time contributor, check out
the <a href="https://github.com/fabric8io/kubernetes-client/labels/good%20first%20issue" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client/labels/good%20first%20issue" aria-label="&quot;good first issue&quot;" target="_blank">&quot;good first issue&quot;</a> tag in the issue repository.
We&#x27;ve tagged extremely easy issues so that you can get started contributing to Open Source.</p>
<p>We&#x27;re also excited to read articles and posts mentioning our project and sharing the user experience.
Giving a star to the project, and spreading the word in general, helps us reach more users and broaden the
feedback. Feedback is the only way to improve.</p>
<p><a href="https://github.com/fabric8io/kubernetes-client" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client" aria-label="Project Page" target="_blank">Project Page</a> |
<a href="https://github.com/fabric8io/kubernetes-client/issues" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client/issues" aria-label="Issues" target="_blank">Issues</a> |
<a href="https://github.com/fabric8io/kubernetes-client/discussions" rel="noopener" title="Link to https://github.com/fabric8io/kubernetes-client/discussions" aria-label="Discussions" target="_blank">Discussions</a> |
<a href="https://gitter.im/fabric8io/kubernetes-client" rel="noopener" title="Link to https://gitter.im/fabric8io/kubernetes-client" aria-label="Gitter" target="_blank">Gitter</a> |
<a href="https://stackoverflow.com/questions/tagged/fabric8" rel="noopener" title="Link to https://stackoverflow.com/questions/tagged/fabric8" aria-label="Stack Overflow" target="_blank">Stack Overflow</a></p>
<span class="post-image__pusher "></span><figure class="post-image "><span class="post-image__scrim"></span><a href="/assets/fabric8-logo.Df3cxiZJ_Z1lh3K4.png" class="post-image__link" title="The logo of Fabric8 Kubernetes Client"><span class="post-image__image-container"><picture><source type="image/webp" srcset="https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_253Alb.webp 269w,https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_Z2lDHOW.webp 539w,https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_o2X4Q.webp 1077w" sizes="(min-width: 1077px) 1077px, 100vw"><img sizes="(min-width: 1077px) 1077px, 100vw" decoding="async" loading="lazy" src="https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_Z1lh3K4.png" srcset="https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_qRUEO.png 269w,https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_Z2p4VEM.png 539w,https://blog.marcnuri.com/assets/fabric8-logo.Df3cxiZJ_Z1lh3K4.png 1077w" alt="The logo of Fabric8 Kubernetes Client" style="aspect-ratio:1077 / 361;--image-width:1077px"></picture></span></a></figure>
  ]]></content:encoded>
            <category>Cloud Native</category>
            <enclosure url="https://blog.marcnuri.com/assets/fabric8.B0BQP5Cf_j0pJB.jpg" length="0" type="image/jpg"/>
        </item>
    </channel>
</rss>