<?xml version="1.0" encoding="UTF-8"?><rss 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" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[JVM Weekly]]></title><description><![CDATA[From the latest updates in JVM languages like Java, Kotlin, and Scala to emerging technologies like GraalVM and Quarkus, this newsletter covers a wide range of topics that are of interest to developers and tech enthusiasts.]]></description><link>https://www.jvm-weekly.com</link><image><url>https://substackcdn.com/image/fetch/$s_!zYMM!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2908deb8-d9eb-4562-9112-e16f8cff149d_253x253.png</url><title>JVM Weekly</title><link>https://www.jvm-weekly.com</link></image><generator>Substack</generator><lastBuildDate>Fri, 12 Jun 2026 07:49:47 GMT</lastBuildDate><atom:link href="https://www.jvm-weekly.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Artur Skowronski]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[vived@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[vived@substack.com]]></itunes:email><itunes:name><![CDATA[Artur Skowronski]]></itunes:name></itunes:owner><itunes:author><![CDATA[Artur Skowronski]]></itunes:author><googleplay:owner><![CDATA[vived@substack.com]]></googleplay:owner><googleplay:email><![CDATA[vived@substack.com]]></googleplay:email><googleplay:author><![CDATA[Artur Skowronski]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[A New Generation of Java Libraries Is Born: Wasm Becomes the Implementation Detail with Andrea Peruffo - JVM Weekly vol. 180]]></title><description><![CDATA[The new JVM Weekly is here - next Friends of OpenJDK (Foojay.io). This month: WebAssembly hiding inside your JARs, Chicory's next chapter as Endive.]]></description><link>https://www.jvm-weekly.com/p/a-new-generation-of-java-libraries</link><guid isPermaLink="false">https://www.jvm-weekly.com/p/a-new-generation-of-java-libraries</guid><dc:creator><![CDATA[Artur Skowronski]]></dc:creator><pubDate>Thu, 11 Jun 2026 13:03:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!mDfx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc18b1670-a283-4157-b424-915aa2dbd0c6_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mDfx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc18b1670-a283-4157-b424-915aa2dbd0c6_1456x1048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mDfx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc18b1670-a283-4157-b424-915aa2dbd0c6_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!mDfx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc18b1670-a283-4157-b424-915aa2dbd0c6_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!mDfx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc18b1670-a283-4157-b424-915aa2dbd0c6_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!mDfx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc18b1670-a283-4157-b424-915aa2dbd0c6_1456x1048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mDfx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc18b1670-a283-4157-b424-915aa2dbd0c6_1456x1048.png" width="1456" height="1048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c18b1670-a283-4157-b424-915aa2dbd0c6_1456x1048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1048,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1638037,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/201573787?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc18b1670-a283-4157-b424-915aa2dbd0c6_1456x1048.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mDfx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc18b1670-a283-4157-b424-915aa2dbd0c6_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!mDfx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc18b1670-a283-4157-b424-915aa2dbd0c6_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!mDfx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc18b1670-a283-4157-b424-915aa2dbd0c6_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!mDfx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc18b1670-a283-4157-b424-915aa2dbd0c6_1456x1048.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>As a hub for the <strong><a href="https://www.linkedin.com/article/edit/7470406525463871488/#">Friends of OpenJDK (Foojay.io)</a></strong> continues to be one of the better places to track what is actually happening in the JVM ecosystem month-to-month. And this month&#8217;s main feature connects rather neatly to where we left off.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Last month, <strong><a href="https://www.linkedin.com/article/edit/7470406525463871488/#">David Vlijmincx</a></strong> walked us through the sharp edges of the FFM API - VarHandle access modes, memory fences, the places where Panama makes you think like a hardware engineer. This month we get to see what happens when somebody builds an entire ecosystem <em>on top of</em> that machinery. <strong><a href="https://www.linkedin.com/article/edit/7470406525463871488/#">Andrea Peruffo</a></strong> - the maintainer behind Chicory and one of the people who has done the most to make WebAssembly a first-class citizen on the JVM - published a piece arguing that we&#8217;re watching a new generation of Java libraries being born.</p><p>I&#8217;ve been following the Chicory story for a while now, and this article lands at a genuinely interesting inflection point. Let&#8217;s dig in.</p><div><hr></div><h2><strong>A New Generation of Java Libraries Is Born: Wasm Becomes the Implementation Detail</strong></h2><p>If you&#8217;re running JRuby in production, you&#8217;re running WebAssembly. If TrinoDB is evaluating your Python UDFs, that&#8217;s WebAssembly too. If Microcks is running JavaScript dispatchers to route your mock API responses, WebAssembly is doing the work.</p><p>You didn&#8217;t install a native binary. You didn&#8217;t configure JNI. You didn&#8217;t cross-compile anything for your target platform. It just works, because the Wasm module is hiding inside a regular JAR on your classpath.</p><p>This is the same pattern that already powers the web. Every day, millions of people use Google Sheets, Figma, or Photoshop without knowing that WebAssembly is what makes those applications possible. Wasm is already invisible infrastructure in the browser. Now the same thing is happening on the JVM.</p><h3><strong>The problem every Java developer knows</strong></h3><p>Some of the best libraries in the world are written in C, C++, Rust, or Go. SQLite. QuickJS. Protocol Buffers. OPA. They are battle-tested, widely deployed, and actively maintained. At some point, every Java project wants to use one of them.</p><p>The options have never been great. You can rewrite the library in Java, but that&#8217;s expensive, error-prone, and perpetually behind the upstream. Or you can reach for JNI and ship platform-specific native binaries. That path comes with its own pain: your application becomes OS and architecture-specific. Execution leaves the safety and observability of the JVM. Distribution turns into a matrix of .so, .dylib, and .dll files. Debugging across the JNI boundary is nobody&#8217;s idea of fun. And if you&#8217;re in a restrictive environment, such as a locked-down container or a platform that blocks native library loading, JNI may not be an option at all.</p><p>For decades, this trade-off felt permanent. You could have the capability, or you could have the JVM&#8217;s guarantees. Not both.</p><h3><strong>What if the library just ran inside the JVM?</strong></h3><p>WebAssembly changes this equation. Take a proven C or Rust library, compile it to Wasm, and run it <em>within</em> JVM boundaries. You keep everything the JVM gives you: guaranteed memory safety, fault isolation, platform independence, advanced JIT, observability, and the &#8220;write once, run anywhere&#8221; promise. The Wasm module becomes just another artifact inside your JAR, an implementation detail that your users never need to think about.</p><p>This isn&#8217;t a theoretical possibility. It&#8217;s happening right now, in production, across a growing ecosystem of Java libraries.</p><h3><strong>The ecosystem: it&#8217;s already here</strong></h3><p><strong>SQLite4j</strong> is a pure-Java JDBC driver for SQLite. The real SQLite, compiled to WebAssembly and embedded in a JAR. Before: you shipped platform-specific native binaries for every OS and architecture your users might run on, and hoped your CI matrix covered them all. After: one JAR, everywhere. Same SQLite, zero native dependencies. Add a Maven dependency and you have an embedded relational database.</p><p><strong>QuickJs4j</strong> puts a full JavaScript runtime inside your Java application. QuickJS, a small, fast, standards-compliant JS engine, is compiled to Wasm and wrapped in a clean Java API. It&#8217;s already powering real production systems. <strong><a href="https://microcks.io/">Microcks</a></strong>, a CNCF project, uses it for JavaScript dispatchers that control how mock responses are selected based on request headers, payloads, and parameters. It works across all Microcks distributions, including native-compiled images. Before: reach for Nashorn or Rhino (both deprecated), or GraalJS (heavy dependency). After: a lightweight, sandboxed JavaScript engine in a single dependency.</p><p><strong>pglite4j</strong> embeds PGlite, a lightweight PostgreSQL build, inside the JVM via WebAssembly. In-process, no external server, no native binaries. Useful for testing, local development, or anywhere you need Postgres compatibility without running a separate process.</p><p><strong>Protobuf4J</strong> compiles protocol buffers without the massive native protoc toolchain. Compile-time dependencies drop from 403MB to roughly 90MB. Same output. Fraction of the footprint.</p><p><strong>JRuby</strong> uses Prism, the Ruby parser, compiled to Wasm and consumed from Java without JNI. The JRuby team didn&#8217;t have to rewrite a parser or maintain platform-specific binaries. They added a dependency.</p><p><strong>TrinoDB</strong> runs user-defined Python functions inside the query engine, sandboxed via WebAssembly. Users write Python UDFs; Trino executes them safely within JVM boundaries.</p><p>And the list keeps growing: <strong>Debezium</strong> single message transforms, <strong>OpenFeature</strong> flag evaluation, <strong>OPA</strong> policy engine running in-process (no network hop to an external sidecar), and more.</p><p>The pattern is always the same. Take a proven library. Compile it to Wasm. Wrap it in a JAR. Ship it on Maven Central. Your users add a dependency and get the capability. No JNI, no platform matrix, no native binary management. <strong>Wasm becomes the implementation detail.</strong></p><h3><strong>Endive: a new chapter for WebAssembly on the JVM</strong></h3><p>This entire ecosystem was built on <strong><a href="https://github.com/dylibso/chicory">Chicory</a></strong>, a pure-Java WebAssembly runtime started in September 2023. Within two years it went from experiment to infrastructure, powering production systems across multiple organizations and proving that WebAssembly fits naturally into Java applications.</p><p>Now the project is entering its next chapter. <strong>Endive</strong> is a fork of Chicory and a <strong><a href="https://bytecodealliance.org/">Bytecode Alliance</a></strong> Hosted project, a vendor-neutral home where the project can grow openly. The community, the vision, and the code carry forward under the same Apache-2.0 license. What changes is that the project now belongs to its ecosystem.</p><p>Why the <strong><a href="https://bytecodealliance.org/">Bytecode Alliance</a></strong>? The BA is the foundation behind <strong><a href="https://wasmtime.dev/">Wasmtime</a></strong>, <strong><a href="https://wasi.dev/">WASI</a></strong>, and the <strong><a href="https://component-model.bytecodealliance.org/">Component Model</a></strong>: the core runtime, system interface, and component standard that define WebAssembly outside the browser. If Wasm is to become a durable cross-language component format, the JVM, one of the world&#8217;s major managed runtime ecosystems, needs to be part of that story. Endive gives the BA community a place to collaborate on JVM integration directly.</p><p>The first major milestone is integrating the experimental <strong><a href="https://github.com/roastedroot/chicory-redline">Redline</a></strong> compiler into the mainline. Redline uses <strong><a href="https://cranelift.dev/">Cranelift</a></strong>, the same compiler backend behind <strong><a href="https://wasmtime.dev/">Wasmtime</a></strong>, to compile Wasm to native machine code. On Java 25+, it achieves this with zero additional dependencies, thanks to Panama&#8217;s Foreign Function &amp; Memory API becoming a standard part of the platform. You get native-speed execution <em>and</em> the pure-Java packaging story.</p><p>Further out, the roadmap includes WasmGC, enabling the Java garbage collector to manage Wasm object references, and <strong><a href="https://component-model.bytecodealliance.org/">Component Model</a></strong> support for consuming cross-language components through typed interfaces.</p><p>For the full story on the fork, the governance model, and the migration path for existing Chicory users, see the <strong><a href="https://bytecodealliance.org/articles/endive-and-the-next-chapter-of-webassembly-on-the-jvm">Bytecode Alliance announcement</a></strong>.</p><h3><strong>Compose, don&#8217;t rewrite</strong></h3><p>The future isn&#8217;t about rewriting native libraries in Java. It isn&#8217;t about wrestling with JNI or maintaining platform-specific builds. It&#8217;s about <em>composing</em> your application from components written in any language (Rust, C, Go, Python, JavaScript) through WebAssembly.</p><p>One runtime. Any language. No rewrites.</p><p>Java has always been about writing code once and running it anywhere. WebAssembly extends that promise to <em>any codebase in any language</em>. With Endive, the JVM becomes a place where established libraries, regardless of what language they were written in, can run safely, portably, and at native speed.</p><p>Wasm becomes the invisible glue. The implementation detail that makes it all work, without you even noticing.</p><h3><strong>Get involved</strong></h3><p>The <strong><a href="https://github.com/bytecodealliance/endive">Endive repository</a></strong> is already available. The first release will prioritize strong continuity with Chicory, preserving compatibility and documenting migration steps clearly.</p><p>If you care about Java, WebAssembly, secure plugin systems, cross-language components, or the future of portable software, <strong><a href="https://github.com/bytecodealliance/endive">come build with us</a></strong>.</p><div><hr></div><p>Also on Foojay This Month</p><h3><strong>Foojay Podcast #95: Is Your Java App Actually Secure, Or Does It Just Look That Way?</strong></h3><p><strong><a href="https://www.linkedin.com/article/edit/7470406525463871488/#">Frank Delporte</a></strong> (Java Champion at Azul) sat down with <strong><a href="https://www.linkedin.com/article/edit/7470406525463871488/#">Steve Poole</a></strong> and <strong><a href="https://www.linkedin.com/article/edit/7470406525463871488/#">David Welch</a></strong> , both from <strong><a href="https://www.herodevs.com/">HeroDevs</a></strong>, for an episode of the <strong><a href="https://foojay.io/today/foojay-podcast-95/">Foojay Podcast</a></strong> that I&#8217;d file under &#8220;uncomfortable but necessary.&#8221;</p><p>Steve brings his concept of <strong>zombie dependencies</strong> - end-of-life libraries that look safely dormant while quietly accumulating vulnerabilities nobody will ever file a CVE against. David, co-chair of the CVE Automation Working Group, explains how the identification and disclosure process actually works - and why AI tooling is dramatically accelerating the pace at which new vulnerabilities get found, <em>on both sides of the wall</em>. That last clause is the one to sit with: the same automation that helps defenders triage is helping attackers prospect.</p><p>BTW: This one pairs almost suspiciously well with Steve&#8217;s CRA article below - consider them a double feature.</p><div><hr></div><h3><strong>Context Is a Budget - Eight Levers and Three Workflow Patterns</strong></h3><p><strong><a href="https://www.linkedin.com/article/edit/7470406525463871488/#">Soham Dasgupta</a></strong> opens with a hook designed to get forwarded to engineering managers: a team of fifty developers can quietly burn $30,000 a month on AI coding assistants without anyone having a story for where it went. The rest of the <strong><a href="https://foojay.io/today/context-is-a-budget-eight-levers-and-three-workflow-patterns/">article</a></strong> is the most practical treatment of AI-assistant cost discipline I&#8217;ve seen on Foojay - and I say that as someone professionally obligated to read all of them.</p><p>The mental model is in the title: stop treating the context window as a free buffet and start treating it as a budget you spend on every turn. The detail most people miss - and the article backs with research from Anthropic and Chroma - is <strong>context rot</strong>: model recall and reasoning degrade as the window fills, <em>well inside</em> the advertised limit. More context isn&#8217;t just expensive; past a point it&#8217;s actively harmful. The other quietly brutal number: every connected MCP server ships its full tool schemas with every request, so five servers can cost you 5,000-10,000 tokens per turn before you&#8217;ve typed a word - whether the model uses the tools or not.</p><p>The eight levers (context engineering, prompt caching, MCP hygiene, instruction files, model routing, output discipline, repo hygiene, observability) are each delivered with a &#8220;do this Monday&#8221; action, and the three workflow patterns escalate from the gloriously named <strong>Ralph Wiggum loop</strong> (cheap model + <strong><a href="http://todo.md/">TODO.md</a></strong> + relentless iteration, state on disk instead of in conversation tokens) to a planner &#8594; implementer &#8594; reviewer split that routes expensive models only to the work that needs them.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rXDf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07034f17-2c32-46d2-a1a7-88b1e671b989_500x701.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rXDf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07034f17-2c32-46d2-a1a7-88b1e671b989_500x701.png 424w, https://substackcdn.com/image/fetch/$s_!rXDf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07034f17-2c32-46d2-a1a7-88b1e671b989_500x701.png 848w, https://substackcdn.com/image/fetch/$s_!rXDf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07034f17-2c32-46d2-a1a7-88b1e671b989_500x701.png 1272w, https://substackcdn.com/image/fetch/$s_!rXDf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07034f17-2c32-46d2-a1a7-88b1e671b989_500x701.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rXDf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07034f17-2c32-46d2-a1a7-88b1e671b989_500x701.png" width="500" height="701" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/07034f17-2c32-46d2-a1a7-88b1e671b989_500x701.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:701,&quot;width&quot;:500,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!rXDf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07034f17-2c32-46d2-a1a7-88b1e671b989_500x701.png 424w, https://substackcdn.com/image/fetch/$s_!rXDf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07034f17-2c32-46d2-a1a7-88b1e671b989_500x701.png 848w, https://substackcdn.com/image/fetch/$s_!rXDf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07034f17-2c32-46d2-a1a7-88b1e671b989_500x701.png 1272w, https://substackcdn.com/image/fetch/$s_!rXDf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07034f17-2c32-46d2-a1a7-88b1e671b989_500x701.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>None of it is rocket science, which is rather the point - as Soham puts it, most teams don&#8217;t have a token problem, they have a discipline problem. The piece already made the rounds via Baeldung&#8217;s weekly review, deservedly.</p><div><hr></div><h3><strong>Tiberius: A Security Testing Framework for LLM Applications in Java</strong></h3><p><strong><a href="https://www.linkedin.com/article/edit/7470406525463871488/#">Iryna Dohndorf</a></strong> - whom regular readers may remember from last month&#8217;s anniversary podcast - opens her <strong><a href="https://foojay.io/today/tiberius-a-security-testing-framework-for-llm-applications-in-java/">introduction of Tiberius</a></strong> with the question every team shipping LLM features eventually faces: how do you write a regression test for a system that is non-deterministic by design?</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xacg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f9ae716-dd06-455a-a82b-754b8fcdc702_700x449.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xacg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f9ae716-dd06-455a-a82b-754b8fcdc702_700x449.png 424w, https://substackcdn.com/image/fetch/$s_!xacg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f9ae716-dd06-455a-a82b-754b8fcdc702_700x449.png 848w, https://substackcdn.com/image/fetch/$s_!xacg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f9ae716-dd06-455a-a82b-754b8fcdc702_700x449.png 1272w, https://substackcdn.com/image/fetch/$s_!xacg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f9ae716-dd06-455a-a82b-754b8fcdc702_700x449.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xacg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f9ae716-dd06-455a-a82b-754b8fcdc702_700x449.png" width="700" height="449" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6f9ae716-dd06-455a-a82b-754b8fcdc702_700x449.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:449,&quot;width&quot;:700,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!xacg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f9ae716-dd06-455a-a82b-754b8fcdc702_700x449.png 424w, https://substackcdn.com/image/fetch/$s_!xacg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f9ae716-dd06-455a-a82b-754b8fcdc702_700x449.png 848w, https://substackcdn.com/image/fetch/$s_!xacg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f9ae716-dd06-455a-a82b-754b8fcdc702_700x449.png 1272w, https://substackcdn.com/image/fetch/$s_!xacg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f9ae716-dd06-455a-a82b-754b8fcdc702_700x449.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Tiberius is an open-source (Apache 2.0) Java library that answers it with a <strong>scan-fixture-validate workflow</strong>. A scan fires 200+ attack probes - jailbreaks, prompt injection, encoding evasion, data extraction, multi-turn escalation, all mapped to the OWASP LLM Top 10 - against your deployed model and serializes whatever got through to a JSON fixture. That fixture becomes version-controlled ground truth: your guardrails then get tested against attacks that <em>actually</em> bypassed your model, not the handful of examples a developer imagined. Both block rate and false-positive rate are first-class metrics.</p><h3><strong>Spring Boot Migration and the CRA: When Good Enough Isn&#8217;t</strong></h3><p><strong><a href="https://www.linkedin.com/article/edit/7470406525463871488/#">Steve Poole</a></strong> again, this time in writing, and with a date you should put in your calendar twice. <strong><a href="https://foojay.io/today/spring-boot-migration-and-the-cra-when-good-enough-isnt/">The article</a></strong> is a follow-up to his April piece on zombie dependencies, and the framing has shifted from technical risk to legal risk: Spring Boot 3.5 reaches end of open-source support on <strong>June 30</strong>, and the EU Cyber Resilience Act starts coming into force on <strong>September 11</strong>.</p><p>The mechanics are worth knowing precisely. CRA Article 14(1): if a product you ship contains a vulnerability that&#8217;s actively being exploited and you become aware of it, you owe ENISA and your national CSIRT an early warning within <strong>24 hours</strong>, a full notification within 72, and a final report within 14 days of a corrective measure being available. The trigger is active exploitation - not CVE assignment, not a severity score. And then you must address it &#8220;without undue delay,&#8221; a phrase that EU regulators interpret <em>relative to what was reasonably available to you</em>.</p><p>Here&#8217;s Steve&#8217;s sharpest point: after June 30, the upstream patch for 3.5 no longer exists - but commercial support does. Which means the regulator&#8217;s question stops being &#8220;why didn&#8217;t you take the upstream fix?&#8221; and becomes &#8220;why didn&#8217;t you use one of the available options to get a patch anyway?&#8221; Once commercial backports exist, &#8220;there was nothing we could do&#8221; stops being true. Steve works for HeroDevs and says so openly, which I appreciate - the argument holds regardless of who benefits. With the Spring community&#8217;s own guidance recommending migrations start nine to twelve months before EOL (a window that opened in July 2025), and medium codebases running 12-14 weeks, &#8220;we&#8217;ll migrate in six months&#8221; is about to become a much harder sentence to say to a regulator. A different flavor than the rest of this edition - regulation plus enterprise - but if you&#8217;re anywhere near compliance conversations, this is the one to forward.</p><div><hr></div><h3><strong>Jakarta EE is Ready for AI &#8211; But Don&#8217;t Just Take My Word for It!</strong></h3><p><strong><a href="https://www.linkedin.com/article/edit/7470406525463871488/#">Dominika Tasarz</a></strong> (Senior Developer Advocate at Azul, and Frank&#8217;s new Foojay colleague as of episode #94) put together a <strong><a href="https://foojay.io/today/jakarta-ee-is-ready-for-ai-but-dont-just-take-my-word-for-it/">roundup of five talks</a></strong> from Open Community Experience 2026 in Brussels that, taken together, make a coherent argument: enterprise Java doesn&#8217;t need framework gymnastics to do AI.</p><p>The sequencing is smart. <strong><a href="https://www.linkedin.com/article/edit/7470406525463871488/#">Ivar Grimstad</a></strong> (Eclipse Foundation) provides the orientation talk - from J2EE&#8217;s famous pain through Jakarta EE 10/11 to the EE 12 roadmap and early AI standardization moves. Then <strong><a href="https://www.linkedin.com/article/edit/7470406525463871488/#">Luqman Saeed</a></strong> (Azul) delivers a two-talk arc that I&#8217;d call the heart of the post: first the &#8220;intelligent monolith&#8221; - a full RAG pipeline with CDI, LangChain4j, pgvector, and Ollama, escalating all the way to in-process inference with Jlama running the model <em>inside</em> the JVM - and then the microservices variant, where Jakarta Data repositories store embeddings as plain JPA byte arrays with cosine similarity in plain Java, and Jakarta Concurrency 3.1&#8217;s virtual threads handle the I/O-bound inference work. What Dominika rightly highlights is Luqman&#8217;s honesty about limits: in-memory vector search works until it doesn&#8217;t, and he tells you what signals mean it&#8217;s time for a real vector database.</p><p><strong><a href="https://www.linkedin.com/article/edit/7470406525463871488/#">Kenji Kazumura</a></strong> (Fujitsu) then asks the production question - supervisor agents coordinating sub-agents over MCP, with JWT propagation, OpenTelemetry tracing, and compensation patterns where ACID can&#8217;t reach - and introduces the Jakarta Agentic AI project aiming to standardize agent lifecycle across the ecosystem. <strong><a href="https://www.linkedin.com/article/edit/7470406525463871488/#">Rustam Mehmandarov</a></strong> closes with the necessary cold shower: all of these agents talk over APIs, and your AI architecture is worth very little if those APIs are fragile and badly versioned.</p><p>Five talks, all with recordings embedded, and a useful counterweight to the assumption that &#8220;Java + AI&#8221; automatically means Spring.</p><div><hr></div><p>And that&#8217;s all, folks.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Adwq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48bdf185-10b7-473b-b6e7-b181515f593b_1030x1028.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Adwq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48bdf185-10b7-473b-b6e7-b181515f593b_1030x1028.png 424w, https://substackcdn.com/image/fetch/$s_!Adwq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48bdf185-10b7-473b-b6e7-b181515f593b_1030x1028.png 848w, https://substackcdn.com/image/fetch/$s_!Adwq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48bdf185-10b7-473b-b6e7-b181515f593b_1030x1028.png 1272w, https://substackcdn.com/image/fetch/$s_!Adwq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48bdf185-10b7-473b-b6e7-b181515f593b_1030x1028.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Adwq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48bdf185-10b7-473b-b6e7-b181515f593b_1030x1028.png" width="294" height="293.4291262135922" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/48bdf185-10b7-473b-b6e7-b181515f593b_1030x1028.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1028,&quot;width&quot;:1030,&quot;resizeWidth&quot;:294,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Adwq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48bdf185-10b7-473b-b6e7-b181515f593b_1030x1028.png 424w, https://substackcdn.com/image/fetch/$s_!Adwq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48bdf185-10b7-473b-b6e7-b181515f593b_1030x1028.png 848w, https://substackcdn.com/image/fetch/$s_!Adwq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48bdf185-10b7-473b-b6e7-b181515f593b_1030x1028.png 1272w, https://substackcdn.com/image/fetch/$s_!Adwq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48bdf185-10b7-473b-b6e7-b181515f593b_1030x1028.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>PS: <strong><a href="https://www.linkedin.com/company/jdd/">JDD</a></strong> in Krakow is looking for speakers! We&#8217;re looking for in Call for Papers submissions. &#129504;</p><p>&#128073; We&#8217;re <a href="https://jdd.org.pl/cfp-2026/">accepting them until June 21</a>  </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Feature Freeze for JDK 27: What Will the New Edition Bring? - JVM Weekly vol. 179]]></title><description><![CDATA[Today JDK 27 forks off into the Rampdown phase - so let's look at what made the cut!]]></description><link>https://www.jvm-weekly.com/p/feature-freeze-for-jdk-27-what-will</link><guid isPermaLink="false">https://www.jvm-weekly.com/p/feature-freeze-for-jdk-27-what-will</guid><dc:creator><![CDATA[Artur Skowronski]]></dc:creator><pubDate>Thu, 04 Jun 2026 13:01:46 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!fPAY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb58b64f3-0806-411c-a47a-e2d1c9a35e95_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fPAY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb58b64f3-0806-411c-a47a-e2d1c9a35e95_1456x1048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fPAY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb58b64f3-0806-411c-a47a-e2d1c9a35e95_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!fPAY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb58b64f3-0806-411c-a47a-e2d1c9a35e95_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!fPAY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb58b64f3-0806-411c-a47a-e2d1c9a35e95_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!fPAY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb58b64f3-0806-411c-a47a-e2d1c9a35e95_1456x1048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fPAY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb58b64f3-0806-411c-a47a-e2d1c9a35e95_1456x1048.png" width="1456" height="1048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b58b64f3-0806-411c-a47a-e2d1c9a35e95_1456x1048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1048,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2215080,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/200459884?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb58b64f3-0806-411c-a47a-e2d1c9a35e95_1456x1048.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fPAY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb58b64f3-0806-411c-a47a-e2d1c9a35e95_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!fPAY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb58b64f3-0806-411c-a47a-e2d1c9a35e95_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!fPAY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb58b64f3-0806-411c-a47a-e2d1c9a35e95_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!fPAY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb58b64f3-0806-411c-a47a-e2d1c9a35e95_1456x1048.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Today is the day: <strong>June 4th</strong>, JDK 27 <strong><a href="https://openjdk.org/projects/jdk/27/">enters the Rampdown phase</a></strong> and forks off the main line. Rampdown means the feature list gets frozen and no further new features are to be expected - so the set you see below is the set we&#8217;re getting in September.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Just like JDK 26, this is a lean release - and, as tradition now dictates, a <strong>non-LTS</strong> one (the second non-LTS since the JDK 25 LTS last September; the next LTS won&#8217;t arrive until JDK 29 in 2027).</p><p>Yeah, I know there is not a thing like LTS in Java.</p><p>So if you were waiting for a blockbuster on the scale of HTTP/3, this isn&#8217;t it. But don&#8217;t let the size fool you - there&#8217;s one genuinely important <strong>security</strong> headline here, and two quietly consequential <strong>default flips</strong> that will touch almost every Java process on the planet.</p><p>For the calendar-minded, the full schedule, <strong><a href="https://mail.openjdk.org/archives/list/jdk-dev@openjdk.org/thread/XSC4BBCVZFNYBTCH6V2DB23JWH2YRUNV/">approved</a></strong> by Mark Reinhold:</p><ul><li><p><strong>Rampdown Phase One</strong> (fork from main line): June 4, 2026</p></li><li><p><strong>Rampdown Phase Two</strong>: July 16, 2026</p></li><li><p><strong>Initial Release Candidate</strong>: August 6, 2026</p></li><li><p><strong>Final Release Candidate</strong>: August 20, 2026</p></li><li><p><strong>General Availability</strong>: September 14, 2026</p></li></ul><p>Now, let&#8217;s go through the complete list of changes in the new edition.</p><h2><strong>Cryptography Updates</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Y1EW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2571dd1-e682-4f11-979e-ac8ef59f2b30_2194x1460.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Y1EW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2571dd1-e682-4f11-979e-ac8ef59f2b30_2194x1460.png 424w, https://substackcdn.com/image/fetch/$s_!Y1EW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2571dd1-e682-4f11-979e-ac8ef59f2b30_2194x1460.png 848w, https://substackcdn.com/image/fetch/$s_!Y1EW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2571dd1-e682-4f11-979e-ac8ef59f2b30_2194x1460.png 1272w, https://substackcdn.com/image/fetch/$s_!Y1EW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2571dd1-e682-4f11-979e-ac8ef59f2b30_2194x1460.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Y1EW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2571dd1-e682-4f11-979e-ac8ef59f2b30_2194x1460.png" width="1456" height="969" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c2571dd1-e682-4f11-979e-ac8ef59f2b30_2194x1460.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:969,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Y1EW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2571dd1-e682-4f11-979e-ac8ef59f2b30_2194x1460.png 424w, https://substackcdn.com/image/fetch/$s_!Y1EW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2571dd1-e682-4f11-979e-ac8ef59f2b30_2194x1460.png 848w, https://substackcdn.com/image/fetch/$s_!Y1EW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2571dd1-e682-4f11-979e-ac8ef59f2b30_2194x1460.png 1272w, https://substackcdn.com/image/fetch/$s_!Y1EW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2571dd1-e682-4f11-979e-ac8ef59f2b30_2194x1460.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3><strong>JEP 527: Post-Quantum Hybrid Key Exchange for TLS 1.3</strong></h3><p>If there&#8217;s a single reason to pay attention to JDK 27, this is it. <strong><a href="https://openjdk.org/jeps/527">JEP 527</a></strong> brings <strong>post-quantum cryptography</strong> into the TLS handshake itself - and, crucially, it does so <strong>by default, with zero code changes</strong> on your side.</p><p><strong>The problem it solves:</strong> quantum computers capable of breaking RSA and Elliptic-Curve Diffie-Hellman don&#8217;t exist yet. But that&#8217;s cold comfort, because of the wonderfully ominous <strong>&#8220;harvest now, decrypt later&#8221;</strong> threat model: an adversary records your encrypted traffic <em>today</em>, sits on it, and decrypts it the day a sufficiently large quantum computer shows up. For anything that needs to stay secret for years (medical records, state secrets, that embarrassing Slack export), the clock is already ticking.</p><p><strong>The solution:</strong> the IETF TLS Working Group settled on <strong>hybrid</strong> key exchange - combine a battle-tested classical algorithm with a quantum-resistant one, and you&#8217;re safe as long as <em>either</em> survives. This hedges against quantum attacks while acknowledging that the new lattice-based algorithms haven&#8217;t yet had decades of cryptanalysis thrown at them. JDK 27 implements three such schemes, each pairing <strong>ML-KEM</strong> with <strong>Ephemeral Elliptic-Curve Diffie-Hellman (ECDHE)</strong>:</p><ul><li><p><strong>X25519MLKEM768</strong> - X25519 + ML-KEM-768</p></li><li><p><strong>SecP256r1MLKEM768</strong> - secp256r1 + ML-KEM-768</p></li><li><p><strong>SecP384r1MLKEM1024</strong> - secp384r1 + ML-KEM-1024</p></li></ul><p>This is the natural next step in a multi-release journey: the KEM API arrived in Java 21 (<strong><a href="https://openjdk.org/jeps/452">JEP 452</a></strong>), the ML-KEM algorithm itself in Java 24 (<strong><a href="https://openjdk.org/jeps/496">JEP 496</a></strong>), and now JDK 27 wires them into TLS 1.3.</p><p>The best part: TLS clients advertise their supported &#8220;named groups&#8221; in preference order during the handshake, and <strong>X25519MLKEM768 goes straight to the front of that list</strong>. So any code using <strong><a href="http://javax.net/">javax.net</a></strong>.ssl gets quantum-resistant handshakes automatically - provided it doesn&#8217;t already pin specific named groups. If you <em>do</em> want to take control, you can override the default list via the jdk.tls.namedGroups system property, or per-connection:</p><pre><code><code>SSLSocket tlsSock = (SSLSocket) SSLContext.getDefault()
.getSocketFactory().createSocket();

SSLParameters params = tlsSock.getSSLParameters();

// Two hybrid KEM schemes plus two traditional ones

params.setNamedGroups(new String[] {
   "SecP256r1MLKEM768", "X25519MLKEM768", "secp256r1", "x25519"
});

tlsSock.setSSLParameters(params);</code></code></pre><p>One caveat worth flagging (and the JEP authors flag it too): the underlying IETF specifications for hybrid key exchange are still in <em>draft</em> status. The feature ships only once those drafts graduate to RFCs - so if the standard wobbles, this could in theory slip. But everything points to it landing.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XJ_9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc19d8c1f-a038-4bfa-9691-cf7d3404eddb_916x636.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XJ_9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc19d8c1f-a038-4bfa-9691-cf7d3404eddb_916x636.png 424w, https://substackcdn.com/image/fetch/$s_!XJ_9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc19d8c1f-a038-4bfa-9691-cf7d3404eddb_916x636.png 848w, https://substackcdn.com/image/fetch/$s_!XJ_9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc19d8c1f-a038-4bfa-9691-cf7d3404eddb_916x636.png 1272w, https://substackcdn.com/image/fetch/$s_!XJ_9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc19d8c1f-a038-4bfa-9691-cf7d3404eddb_916x636.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XJ_9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc19d8c1f-a038-4bfa-9691-cf7d3404eddb_916x636.png" width="916" height="636" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c19d8c1f-a038-4bfa-9691-cf7d3404eddb_916x636.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:636,&quot;width&quot;:916,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!XJ_9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc19d8c1f-a038-4bfa-9691-cf7d3404eddb_916x636.png 424w, https://substackcdn.com/image/fetch/$s_!XJ_9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc19d8c1f-a038-4bfa-9691-cf7d3404eddb_916x636.png 848w, https://substackcdn.com/image/fetch/$s_!XJ_9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc19d8c1f-a038-4bfa-9691-cf7d3404eddb_916x636.png 1272w, https://substackcdn.com/image/fetch/$s_!XJ_9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc19d8c1f-a038-4bfa-9691-cf7d3404eddb_916x636.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3><strong>JEP 538: PEM Encodings of Cryptographic Objects</strong></h3><p>Sticking with the security library, <strong><a href="https://openjdk.org/jeps/538">JEP 538</a></strong> finally <strong>finalizes</strong> the PEM encoding/decoding API after a patient two-preview run - <strong><a href="https://openjdk.org/jeps/470">JEP 470</a></strong> in JDK 25 and <strong><a href="https://openjdk.org/jeps/524">JEP 524</a></strong> in JDK 26 (longtime readers will recall me covering both).</p><p>For the uninitiated: cryptographic objects live in binary <strong>DER</strong> format - great for machines, unreadable for humans. <strong>PEM</strong> (Privacy-Enhanced Mail) wraps that DER in Base64 with those familiar -----BEGIN ...----- headers, which is what actually ends up in your Git repos, server configs, and copy-pasted email threads. Until this API, Java had no first-class way to convert between the two, so everyone reached for hand-rolled parsers or third-party libraries.</p><pre><code><code>String pem = PEMEncoder.of().encodeToString(privateKey);  // object &#8594; PEM

PrivateKey key = PEMDecoder.of().decode(pem, PrivateKey.class);   // PEM &#8594; object</code></code></pre><p>The finalization brought two notable tweaks. The PEMRecord class was <strong>reclassified from a record to a regular class</strong>, which lets it offer convenience constructors that accept Base64-encoded content directly as byte arrays. And the marker interface formerly known as DEREncodable was <strong>renamed to BinaryEncodable</strong> - a more honest description of the binary data actually sitting inside the PEM text. Nothing earth-shattering, but it&#8217;s nice to finally retire the &#8220;(Preview)&#8221; suffix.</p><h2><strong>Squeezing the Memory</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9VqV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12970019-1439-40e0-82b0-e4aa5e02ae9e_2190x1462.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9VqV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12970019-1439-40e0-82b0-e4aa5e02ae9e_2190x1462.png 424w, https://substackcdn.com/image/fetch/$s_!9VqV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12970019-1439-40e0-82b0-e4aa5e02ae9e_2190x1462.png 848w, https://substackcdn.com/image/fetch/$s_!9VqV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12970019-1439-40e0-82b0-e4aa5e02ae9e_2190x1462.png 1272w, https://substackcdn.com/image/fetch/$s_!9VqV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12970019-1439-40e0-82b0-e4aa5e02ae9e_2190x1462.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9VqV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12970019-1439-40e0-82b0-e4aa5e02ae9e_2190x1462.png" width="1456" height="972" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/12970019-1439-40e0-82b0-e4aa5e02ae9e_2190x1462.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:972,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!9VqV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12970019-1439-40e0-82b0-e4aa5e02ae9e_2190x1462.png 424w, https://substackcdn.com/image/fetch/$s_!9VqV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12970019-1439-40e0-82b0-e4aa5e02ae9e_2190x1462.png 848w, https://substackcdn.com/image/fetch/$s_!9VqV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12970019-1439-40e0-82b0-e4aa5e02ae9e_2190x1462.png 1272w, https://substackcdn.com/image/fetch/$s_!9VqV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12970019-1439-40e0-82b0-e4aa5e02ae9e_2190x1462.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3><strong>JEP 534: Compact Object Headers by Default</strong></h3><p><strong><a href="https://openjdk.org/jeps/534">JEP 534</a></strong> promotes <strong>compact object headers</strong> to the <strong>default</strong> layout in HotSpot. The feature itself is the one we met in JDK 25 as a production option (<strong><a href="https://openjdk.org/jeps/519">JEP 519</a></strong>), having started life as an experimental flag back in JDK 24.</p><p>Quick refresher on why anyone cares: the standard 64-bit HotSpot object header is <strong>two machine words</strong> - a mark word and a class pointer. With millions of live objects, that second word adds up to tens of megabytes of pure overhead, doubles GC traffic, and trashes your CPU cache. Compact headers squeeze the mark word, a compressed class pointer, and a few meta bits into a <strong>single 64-bit value</strong>, while keeping all the functionality you rely on (hashCode, synchronization, locking).</p><p>After large-scale production hardening (Amazon famously ran it across hundreds of services), the layout has proven itself enough to become the default. From JDK 27 onward you get the memory savings for free - and if for some reason you need the old behaviour, -XX:-UseCompactObjectHeaders is still there to turn it off. A rare case of a release where you do <em>less</em> and get <em>more</em>.</p><h3><strong>JEP 523: Make G1 the Default Garbage Collector in All Environments</strong></h3><p><strong><a href="https://openjdk.org/jeps/523">JEP 523</a></strong> is the kind of change that sounds boring until you realize how many edge cases it quietly eliminates. As <strong><a href="https://nipafx.dev/inside-java-newscast-99/">nipafx</a></strong> would gleefully remind us, the JCP doesn&#8217;t <em>technically</em> recognize the concept of a &#8220;default garbage collector&#8221; - but in practice HotSpot has to pick <em>something</em> when you don&#8217;t, and that pick has been <strong>inconsistent</strong> for a decade.</p><p>Here&#8217;s the history: G1 became the default for <strong>server-class machines</strong> in JDK 9 (<strong><a href="https://openjdk.org/jeps/248">JEP 248</a></strong>) - that is, anything with at least 2 hardware threads and roughly 2 GB of RAM. Below that threshold (single CPU, less than ~1792 MB), HotSpot silently fell back to <strong>Serial GC</strong>, because back in 2017 Serial genuinely had the edge on throughput and footprint in cramped environments.</p><p>Note the past tense. Over the last several releases G1 has been relentlessly optimized: its native memory footprint came down, and the <strong>second card table</strong> introduced by <strong><a href="https://openjdk.org/jeps/522">JEP 522</a></strong> in JDK 26 (the one I spent way too many paragraphs explaining in <strong>vol. 157</strong>) brought its throughput within spitting distance of Serial&#8217;s. G1&#8217;s maximum latencies, meanwhile, have <em>always</em> beaten Serial&#8217;s, since it reclaims the old generation incrementally rather than via stop-the-world full collections.</p><p>So the conclusion writes itself: G1 is now competitive at all heap sizes, and there&#8217;s no longer a good reason to surprise users with a different collector just because they&#8217;re running on a small box. <strong>From JDK 27, if you don&#8217;t specify a GC, you get G1 - period, regardless of cores or memory.</strong> A welcome side effect: the AlwaysActAsServerClassMachine and NeverActAsServerClassMachine flags lose most of their purpose and are now deprecated for removal. And of course, an explicit -XX:+UseSerialGC still does exactly what it says - this only changes the <em>implicit</em> choice.</p><h2><strong>Observability &amp; Tooling</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wUsL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c98153e-adcd-4aa5-9d8b-0659ce0b5834_2598x1456.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wUsL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c98153e-adcd-4aa5-9d8b-0659ce0b5834_2598x1456.png 424w, https://substackcdn.com/image/fetch/$s_!wUsL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c98153e-adcd-4aa5-9d8b-0659ce0b5834_2598x1456.png 848w, https://substackcdn.com/image/fetch/$s_!wUsL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c98153e-adcd-4aa5-9d8b-0659ce0b5834_2598x1456.png 1272w, https://substackcdn.com/image/fetch/$s_!wUsL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c98153e-adcd-4aa5-9d8b-0659ce0b5834_2598x1456.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wUsL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c98153e-adcd-4aa5-9d8b-0659ce0b5834_2598x1456.png" width="1456" height="816" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0c98153e-adcd-4aa5-9d8b-0659ce0b5834_2598x1456.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:816,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!wUsL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c98153e-adcd-4aa5-9d8b-0659ce0b5834_2598x1456.png 424w, https://substackcdn.com/image/fetch/$s_!wUsL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c98153e-adcd-4aa5-9d8b-0659ce0b5834_2598x1456.png 848w, https://substackcdn.com/image/fetch/$s_!wUsL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c98153e-adcd-4aa5-9d8b-0659ce0b5834_2598x1456.png 1272w, https://substackcdn.com/image/fetch/$s_!wUsL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c98153e-adcd-4aa5-9d8b-0659ce0b5834_2598x1456.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3><strong>JEP 528: Post-Mortem Crash Analysis with jcmd</strong></h3><p><strong><a href="https://openjdk.org/jeps/528">JEP 528</a></strong> wants to extend the trusty <strong>jcmd</strong> tool so it can diagnose a JVM <strong>after it has crashed</strong> - poking at core dumps to extract the kind of post-mortem detail you&#8217;d otherwise need the aging jhsdb utility or the Serviceability Agent for. The intent is consolidation: stop spreading &#8220;what happened when it died&#8221; across three different tools and bring it home to jcmd, where the <em>living</em>-JVM diagnostics already live.</p><p>Why does moving this into jcmd matter? Because jhsdb and the Serviceability Agent are the crusty, half-forgotten corner of the toolbox - powerful, but fiddly, poorly documented, and the kind of thing you re-learn from scratch every time production falls over at 3 a.m. jcmd, by contrast, is the modern, unified entry point most of us already reach for. Folding crash analysis into it means one tool, one mental model, for both the JVM that&#8217;s still breathing <em>and</em> the one you&#8217;re performing an autopsy on. This one had me a little nervous right up to the freeze - but it made the cut, and I&#8217;m genuinely glad it did.</p><h3><strong>JEP 536: JFR In-Process Data Redaction</strong></h3><p><strong><a href="https://openjdk.org/jeps/536">JEP 536</a></strong> plugs a leak that&#8217;s bitten more teams than will admit it. JDK Flight Recorder captures, among other things, your <strong>command-line arguments, the initial values of environment variables, and system properties</strong> - which is fantastic for debugging and <em>terrible</em> when that .jfr file (often containing a database password or API token passed via -D...) gets shipped off to a vendor, a support ticket, or a shared bucket.</p><p>This JEP lets JFR <strong>redact sensitive information in-process, before the recording is even finalized</strong>, so the secrets never make it to disk in the first place. It&#8217;s the sort of unglamorous, defense-in-depth feature that nobody asks for in a survey but everybody benefits from. Currently Proposed to Target, but it looks comfortable.</p><h2><strong>Nihil Novi Sub Sole - (Yet More) Preview Features</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1_cC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99574f3b-bc8a-4b61-9908-eb9b5805537c_2184x1452.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1_cC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99574f3b-bc8a-4b61-9908-eb9b5805537c_2184x1452.png 424w, https://substackcdn.com/image/fetch/$s_!1_cC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99574f3b-bc8a-4b61-9908-eb9b5805537c_2184x1452.png 848w, https://substackcdn.com/image/fetch/$s_!1_cC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99574f3b-bc8a-4b61-9908-eb9b5805537c_2184x1452.png 1272w, https://substackcdn.com/image/fetch/$s_!1_cC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99574f3b-bc8a-4b61-9908-eb9b5805537c_2184x1452.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1_cC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99574f3b-bc8a-4b61-9908-eb9b5805537c_2184x1452.png" width="1456" height="968" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/99574f3b-bc8a-4b61-9908-eb9b5805537c_2184x1452.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:968,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!1_cC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99574f3b-bc8a-4b61-9908-eb9b5805537c_2184x1452.png 424w, https://substackcdn.com/image/fetch/$s_!1_cC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99574f3b-bc8a-4b61-9908-eb9b5805537c_2184x1452.png 848w, https://substackcdn.com/image/fetch/$s_!1_cC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99574f3b-bc8a-4b61-9908-eb9b5805537c_2184x1452.png 1272w, https://substackcdn.com/image/fetch/$s_!1_cC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99574f3b-bc8a-4b61-9908-eb9b5805537c_2184x1452.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>And now the part of the release notes where, as ever, the preview features file past for another lap. If you&#8217;ve been reading this newsletter for any length of time, you can probably recite these from memory - but let&#8217;s note what (little) changed.</p><h3><strong>JEP 531: Lazy Constants (Third Preview)</strong></h3><p>The feature with more names than a witness in protection: <strong>Computed Constants</strong> &#8594; <strong>StableValue</strong> (<strong><a href="https://openjdk.org/jeps/502">JEP 502</a></strong>, JDK 25) &#8594; <strong>LazyConstant</strong> (<strong><a href="https://openjdk.org/jeps/526">JEP 526</a></strong>, JDK 26) &#8594; and now <strong><a href="https://openjdk.org/jeps/531">JEP 531</a></strong> for round three.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!A1FQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc319237d-c283-4d3e-badc-4525d6ce4133_1186x1327.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!A1FQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc319237d-c283-4d3e-badc-4525d6ce4133_1186x1327.png 424w, https://substackcdn.com/image/fetch/$s_!A1FQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc319237d-c283-4d3e-badc-4525d6ce4133_1186x1327.png 848w, https://substackcdn.com/image/fetch/$s_!A1FQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc319237d-c283-4d3e-badc-4525d6ce4133_1186x1327.png 1272w, https://substackcdn.com/image/fetch/$s_!A1FQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc319237d-c283-4d3e-badc-4525d6ce4133_1186x1327.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!A1FQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc319237d-c283-4d3e-badc-4525d6ce4133_1186x1327.png" width="1186" height="1327" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c319237d-c283-4d3e-badc-4525d6ce4133_1186x1327.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1327,&quot;width&quot;:1186,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!A1FQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc319237d-c283-4d3e-badc-4525d6ce4133_1186x1327.png 424w, https://substackcdn.com/image/fetch/$s_!A1FQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc319237d-c283-4d3e-badc-4525d6ce4133_1186x1327.png 848w, https://substackcdn.com/image/fetch/$s_!A1FQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc319237d-c283-4d3e-badc-4525d6ce4133_1186x1327.png 1272w, https://substackcdn.com/image/fetch/$s_!A1FQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc319237d-c283-4d3e-badc-4525d6ce4133_1186x1327.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>The core idea has been stable throughout: compute a value <strong>exactly once</strong>, lazily, in a thread-safe way, and let the JVM treat it as a true constant afterwards (constant-folding and all), so you get lazy initialization <em>without</em> paying the usual synchronization tax.</p><p>The third preview makes <strong>two changes</strong>: it removes the low-level isInitialized() and orElse() methods (they invited usage patterns at odds with the API&#8217;s design goals), and it adds a <strong>Set.ofLazy(...)</strong> factory. With that addition, all <strong>three</strong> fundamental collection types - List, Set, and Map - now have lazy variants where each element sits in its own LazyConstant and initializes only on first access.</p><p>As I showed back in <strong>vol. 171</strong>, this lets you write things like:</p><pre><code><code>enum Option { VERBOSE, DRY_RUN, STRICT }

// Each element initialized lazily, only on first touch

static final Set&lt;Option&gt; OPTIONS =

    Set.ofLazy(EnumSet.allOf(Option.class), Application::isEnabled);</code></code></pre><p>Thread-safe by construction, constant-foldable after the fact. The feature matures a little with each iteration and is clearly circling the runway toward finalization - my bet is JDK 28.</p><h3><strong>JEP 532: Primitive Types in Patterns, instanceof, and switch (Fifth Preview)</strong></h3><p><strong><a href="https://openjdk.org/jeps/532">JEP 532</a></strong> brings back - for the <strong>fifth</strong> time (yes, fifth) - the extension of pattern matching to primitive types across instanceof and switch. This round ships with <strong>no changes</strong> from the fourth preview (<strong><a href="https://openjdk.org/jeps/530">JEP 530</a></strong>, JDK 26), so... you know the drill by now &#128521;</p><pre><code><code>switch (x.getYearlyFlights()) {
    case 0                  -&gt; "No flights";
    case int i when i &gt;= 100 -&gt; "Gold status!";
    case int i              -&gt; "Regular: " + i + " flights";
}</code></code></pre><p>The authors are simply collecting more real-world feedback before pulling the trigger. One day this <em>will</em> be stable, and we&#8217;ll all pretend we weren&#8217;t slightly impatient about it.</p><h3><strong>JEP 533: Structured Concurrency (Seventh Preview)</strong></h3><p><strong><a href="https://openjdk.org/jeps/533">JEP 533</a></strong> continues the marathon - the <strong>seventh</strong> preview of Structured Concurrency, following <strong><a href="https://openjdk.org/jeps/525">JEP 525</a></strong> (sixth preview) in JDK 26. The API treats a group of concurrent subtasks as a single unit of work, with unified cancellation and error propagation, and you still drive it through the <strong><a href="http://structuredtaskscope.open/">StructuredTaskScope.open</a></strong>() factory established in the big sixth-preview revamp:</p><pre><code><code>try (var scope = StructuredTaskScope.open()) {
    Subtask&lt;String&gt;  user  = scope.fork(() -&gt; findUser());
    Subtask&lt;Integer&gt; order = scope.fork(() -&gt; fetchOrder());
    scope.join();
    return new Response(user.get(), order.get());
}</code></code></pre><p>At seven previews, Structured Concurrency is officially testing my ability to find new ways to say &#8220;still cooking.&#8221; But it&#8217;s <em>good</em> cooking, and the shape now feels right.</p><h3><strong>JEP 537: Vector API (Twelfth Incubator)</strong></h3><p>And to close, our perennial guest: <strong><a href="https://openjdk.org/jeps/537">JEP 537</a></strong> delivers the <strong>twelfth</strong> incubation of the Vector API, with no substantial implementation changes since JDK 25. The pitch is unchanged - express vector computations in plain Java that the JIT reliably compiles down to optimal SIMD instructions (AVX, NEON, SVE) on the host CPU.</p><p>As I&#8217;ve now written so many times it should be a macro: the Vector API stays in incubation until <strong>Project Valhalla</strong>&#8216;s value classes become available as preview features, at which point it&#8217;ll be adapted to use them and promoted to preview. Back in the <strong>vol. 157</strong> (JDK 26) edition I admitted I&#8217;d honestly expected more Valhalla by now. Reader, I am still waiting. The Vector API and I are growing old together.</p><div><hr></div><p>So there it is - JDK 27, the second lean non-LTS release in a row. No single feature reorders the universe the way HTTP/3 did in 26, but the shape of the release tells a story: <strong>security is hardening</strong> (post-quantum TLS by default is a genuinely big deal that most people will never have to think about, which is exactly the point), <strong>the defaults are getting saner</strong> (G1 everywhere, compact headers on), and the long-running language and concurrency previews keep inching toward the finish line while we collectively hold our breath for Valhalla.</p><p>And with that, the list is frozen - no loose threads to report back on this time. See you in the next edition - <strong><a href="https://www.linkedin.com/company/foojayio/">Friends of OpenJDK (Foojay.io)</a></strong> One &#128522;. We needed to switch them this time</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[The Rest of the Story: May Edition - JVM Weekly vol. 178]]></title><description><![CDATA[KotlinConf devoured the calendar this month, so, exceptionally, Kotlin gets first billing in a dedicated section - and then it&#8217;s back to the usual.]]></description><link>https://www.jvm-weekly.com/p/the-rest-of-the-story-may-edition</link><guid isPermaLink="false">https://www.jvm-weekly.com/p/the-rest-of-the-story-may-edition</guid><dc:creator><![CDATA[Artur Skowronski]]></dc:creator><pubDate>Thu, 28 May 2026 13:03:26 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-bE8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F693a5047-887c-4f12-b2b0-ae4f3504f898_1928x1088.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-bE8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F693a5047-887c-4f12-b2b0-ae4f3504f898_1928x1088.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-bE8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F693a5047-887c-4f12-b2b0-ae4f3504f898_1928x1088.png 424w, https://substackcdn.com/image/fetch/$s_!-bE8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F693a5047-887c-4f12-b2b0-ae4f3504f898_1928x1088.png 848w, https://substackcdn.com/image/fetch/$s_!-bE8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F693a5047-887c-4f12-b2b0-ae4f3504f898_1928x1088.png 1272w, https://substackcdn.com/image/fetch/$s_!-bE8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F693a5047-887c-4f12-b2b0-ae4f3504f898_1928x1088.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-bE8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F693a5047-887c-4f12-b2b0-ae4f3504f898_1928x1088.png" width="1456" height="822" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/693a5047-887c-4f12-b2b0-ae4f3504f898_1928x1088.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:822,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2248559,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/199581395?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F693a5047-887c-4f12-b2b0-ae4f3504f898_1928x1088.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-bE8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F693a5047-887c-4f12-b2b0-ae4f3504f898_1928x1088.png 424w, https://substackcdn.com/image/fetch/$s_!-bE8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F693a5047-887c-4f12-b2b0-ae4f3504f898_1928x1088.png 848w, https://substackcdn.com/image/fetch/$s_!-bE8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F693a5047-887c-4f12-b2b0-ae4f3504f898_1928x1088.png 1272w, https://substackcdn.com/image/fetch/$s_!-bE8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F693a5047-887c-4f12-b2b0-ae4f3504f898_1928x1088.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>KotlinConf ate the calendar this month, so Kotlin gets first fiddle in a dedicated Section 0 - and then the usual: Valhalla and Leyden keep grinding, the race to make the JVM the host of AI continues, and a JVM written in Go is here to make sure we don&#8217;t get too full of ourselves.</p><p>You already know the ROTS rules: this is where everything that didn&#8217;t earn its own edition lands before it rots (heh) on my backlog. But May was different. KotlinConf &#8216;26 happened in Munich and pulled half of the month&#8217;s news into its gravity well - the 2.4 line, context parameters, the security policy, the VS Code extension, and the by-now-inevitable &#8220;what is Kotlin doing about AI&#8221; conversation.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>So this time I&#8217;m doing something I&#8217;ve never done: <strong>Section 0</strong>, devoted exclusively to KotlinConf and the broader Kotlin world. Everything else slots in behind it, grouped by theme rather than by the order it happened to hit my feed. Let&#8217;s go.</p><h3><strong>0. KotlinConf 2026 - and all things Kotlin</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nNq7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c68a80-999a-4237-b726-cf56da4b5a32_1488x987.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nNq7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c68a80-999a-4237-b726-cf56da4b5a32_1488x987.png 424w, https://substackcdn.com/image/fetch/$s_!nNq7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c68a80-999a-4237-b726-cf56da4b5a32_1488x987.png 848w, https://substackcdn.com/image/fetch/$s_!nNq7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c68a80-999a-4237-b726-cf56da4b5a32_1488x987.png 1272w, https://substackcdn.com/image/fetch/$s_!nNq7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c68a80-999a-4237-b726-cf56da4b5a32_1488x987.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nNq7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c68a80-999a-4237-b726-cf56da4b5a32_1488x987.png" width="1456" height="966" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c9c68a80-999a-4237-b726-cf56da4b5a32_1488x987.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:966,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!nNq7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c68a80-999a-4237-b726-cf56da4b5a32_1488x987.png 424w, https://substackcdn.com/image/fetch/$s_!nNq7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c68a80-999a-4237-b726-cf56da4b5a32_1488x987.png 848w, https://substackcdn.com/image/fetch/$s_!nNq7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c68a80-999a-4237-b726-cf56da4b5a32_1488x987.png 1272w, https://substackcdn.com/image/fetch/$s_!nNq7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c68a80-999a-4237-b726-cf56da4b5a32_1488x987.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>KotlinConf 2026 took place <strong>May 20&#8211;22 in Munich</strong> and marked <strong>15 years of Kotlin</strong> - and the way the whole event was framed says a lot. This was a &#8220;Kotlin is now load-bearing enterprise infrastructure, please treat it accordingly&#8221; kind of conference (pretty please). The <strong><a href="https://kotl.in/rm6hir">keynote highlights</a></strong> read less like a language pitch and more like a maturity declaration - and they&#8217;re worth splitting into a few buckets. I&#8217;ll go through them in order of how much they&#8217;ll actually change your week.</p><div id="youtube2-MmwBJbzWbV0" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;MmwBJbzWbV0&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/MmwBJbzWbV0?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Context parameters are the headliner - and the community is already arguing about them</strong></h3><p>The flagship language feature in the 2.4 line is <strong>context parameters</strong> - the long-awaited successor to experimental context receivers and the thing JetBrains has been quietly de-mining since the PSI work in 2.3.20 (which we covered in the <strong><a href="https://www.jvm-weekly.com/p/the-rest-of-the-story-march-edition">March ROTS</a></strong>). In <strong><a href="https://github.com/JetBrains/kotlin/releases/tag/v2.4.0-RC">2.4.0-RC</a></strong> they&#8217;re still hidden behind the -Xcontext-parameters flag, but the conference messaging positions the 2.4 line as the one in which they stabilize. There&#8217;s also a nice ergonomic touch in the anonymous-context syntax context(_: Type), which lets you inject a dependency without naming the parameter when you only need it to satisfy the compiler.</p><p>What&#8217;s really interesting, though, is what the <strong><a href="https://www.reddit.com/r/Kotlin/comments/1to54vx/kotlin_context_parameters_as_statically_tracked/">r/Kotlin discussion</a></strong> pulled out: people are reading context parameters as the foundation for <strong>capability-based architecture</strong>, where the compiler treats a type as a statically-tracked capability - you can&#8217;t call a function that requires a database handle context unless you can prove you have one, in the style of Scala 3&#8217;s capture checking. Compiler-enforced side effects: lovely in theory. But a loud part of the senior crowd pushed back on the &#8220;Can-Do&#8221; naming convention that usually rides along with it (CanAccessCache, CanWriteAudit) - arguing that this is just dependency injection dressed up as a verb, and that a plain noun interface CacheReader says the same thing with less ceremony. I land somewhere in the middle - the capability framing is real and useful at module boundaries, but if your whole codebase turns into a thesaurus of CanDoX interfaces, you&#8217;ve reinvented constructor injection with extra steps. We&#8217;ll see which way the idiom goes.</p><div><hr></div><h3><strong>Kotlin 2.4.0-RC: the boring-but-load-bearing stuff.</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!X-xF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35f24396-6c02-48ac-8cec-87510519f494_1488x959.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!X-xF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35f24396-6c02-48ac-8cec-87510519f494_1488x959.png 424w, https://substackcdn.com/image/fetch/$s_!X-xF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35f24396-6c02-48ac-8cec-87510519f494_1488x959.png 848w, https://substackcdn.com/image/fetch/$s_!X-xF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35f24396-6c02-48ac-8cec-87510519f494_1488x959.png 1272w, https://substackcdn.com/image/fetch/$s_!X-xF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35f24396-6c02-48ac-8cec-87510519f494_1488x959.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!X-xF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35f24396-6c02-48ac-8cec-87510519f494_1488x959.png" width="1456" height="938" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/35f24396-6c02-48ac-8cec-87510519f494_1488x959.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:938,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!X-xF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35f24396-6c02-48ac-8cec-87510519f494_1488x959.png 424w, https://substackcdn.com/image/fetch/$s_!X-xF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35f24396-6c02-48ac-8cec-87510519f494_1488x959.png 848w, https://substackcdn.com/image/fetch/$s_!X-xF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35f24396-6c02-48ac-8cec-87510519f494_1488x959.png 1272w, https://substackcdn.com/image/fetch/$s_!X-xF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35f24396-6c02-48ac-8cec-87510519f494_1488x959.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Beyond context parameters, <strong><a href="https://github.com/JetBrains/kotlin/releases/tag/v2.4.0-RC">2.4.0-RC</a></strong> is the release where the transition to K2 finally burns the bridges: <strong>K2 is mandatory, and the old JVM backend is gone entirely</strong>. The toolchain now targets <strong>JVM bytecode up to version 26</strong>, Kotlin/Native GC pause times dropped by ~15% thanks to concurrent marking, and stdlib got primitive overloads for StringBuilder.insert to kill some boxing overhead. One thing to flag in red: <strong>the 2.4 stdlib contracts are incompatible with the 2.3 compiler</strong> (<strong><a href="https://kotl.in/2-4-0-rc">KT-85948</a></strong>) - that&#8217;s a hard break, so don&#8217;t mix it in a multi-module build and don&#8217;t expect it to go smoothly. PowerAssert&#8217;s ABI also stabilized, and the Compose compiler now skips group generation for inline lambdas that don&#8217;t contain @Composable calls. Details in <strong><a href="https://kotl.in/2-4-0-rc">What&#8217;s new in Kotlin 2.4.0-RC</a></strong>.</p><div><hr></div><h3><strong>Koog 1.0: a stable foundation for agents in Kotlin.</strong></h3><p>The other big keynote announcement was Vadim Briliantov - Koog&#8217;s tech lead and author - shipping the stable <strong><a href="https://github.com/JetBrains/koog">Koog 1.0</a></strong>, JetBrains&#8217; open-source framework for building AI agents in Kotlin and Java, running on backend, mobile, KMP, and even in the browser. It&#8217;s JetBrains&#8217; centerpiece in the &#8220;who builds the production-grade agentic platform&#8221; race &#8212; and the concrete materialization of the eval-driven-development thesis as an honest answer to LLM non-determinism.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-FrE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a7e8ab4-1a80-427e-96b7-31b3fa443d46_1488x947.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-FrE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a7e8ab4-1a80-427e-96b7-31b3fa443d46_1488x947.png 424w, https://substackcdn.com/image/fetch/$s_!-FrE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a7e8ab4-1a80-427e-96b7-31b3fa443d46_1488x947.png 848w, https://substackcdn.com/image/fetch/$s_!-FrE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a7e8ab4-1a80-427e-96b7-31b3fa443d46_1488x947.png 1272w, https://substackcdn.com/image/fetch/$s_!-FrE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a7e8ab4-1a80-427e-96b7-31b3fa443d46_1488x947.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-FrE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a7e8ab4-1a80-427e-96b7-31b3fa443d46_1488x947.png" width="1456" height="927" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1a7e8ab4-1a80-427e-96b7-31b3fa443d46_1488x947.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:927,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!-FrE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a7e8ab4-1a80-427e-96b7-31b3fa443d46_1488x947.png 424w, https://substackcdn.com/image/fetch/$s_!-FrE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a7e8ab4-1a80-427e-96b7-31b3fa443d46_1488x947.png 848w, https://substackcdn.com/image/fetch/$s_!-FrE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a7e8ab4-1a80-427e-96b7-31b3fa443d46_1488x947.png 1272w, https://substackcdn.com/image/fetch/$s_!-FrE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a7e8ab4-1a80-427e-96b7-31b3fa443d46_1488x947.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>The 1.0 isn&#8217;t just a number. Modules now split into <strong>stable</strong> and <strong>beta</strong> streams so production code can pin to APIs that won&#8217;t break without a deprecation cycle; every previously @Deprecated API is gone (event handlers, pipeline, agent/strategy/DSL, tools, persistence, MCP, Spring autoconfig, RAG - a proper sweep), and the graph DSL node names are finalized. On the technical side: a <strong>redesigned Java interop layer</strong>, HTTP transport decoupled from Ktor, <strong>OpenTelemetry for Kotlin Multiplatform</strong> (Langfuse, Weave, and DataDog now run on every Koog target via a Ktor-based OTLP/JSON exporter, not just JVM), and <strong>Anthropic prompt caching</strong> out of the box.</p><p>Add integrations with <strong>Spring AI</strong> and Ktor, persistence and recovery for long-running agents, and intelligent history compression. Maven Central: ai.koog:koog-agents:1.0.0. If you&#8217;re building agents on the JVM and don&#8217;t want to drag in a Python stack, this is now the most serious &#8220;idiomatic Kotlin all the way down&#8221; candidate.</p><div><hr></div><h3><strong>Kotlin/Wasm goes Stable.</strong></h3><p>From the same RC, but worth its own line: <strong>Kotlin/Wasm reached Stable status</strong>. After years of &#8220;promising but experimental,&#8221; Wasm is now a full-fledged target you can lean on. Combined with the broader Wasm-on-JVM momentum (more in Section 1), the &#8220;browser as a deployment target&#8221; story for Kotlin stops being aspirational.</p><div><hr></div><h3><strong>Maturity in security: JetBrains becomes a CVE Numbering Authority</strong></h3><p>This is the announcement nobody live-tweeted but the one your compliance team will care about most. JetBrains rolled out a <strong><a href="https://blog.jetbrains.com/kotlin/2026/05/security-support-policy-for-the-kotlin-standard-library/">formal security support policy</a></strong> for kotlin-stdlib and kotlin-reflect, and crucially - registered as a <strong>CVE Numbering Authority (CNA)</strong>. That means JetBrains now issues its own CVE identifiers and manages vulnerability disclosure with the same rigor you&#8217;d expect from Oracle or Red Hat. The policy guarantees patches for the three most recent minor versions (currently 2.1.x, 2.0.x, 1.9.x), commits to strict binary and source compatibility for those patches, and allows out-of-band hotfixes for critical issues. For anyone deploying Kotlin in finance, healthcare, or anything that ships with an auditor attached, this is the &#8220;Kotlin has grown up&#8221; paperwork you&#8217;ve been waiting for.</p><div><hr></div><h3><strong>KMP: Swift interop without the Objective-C tax, and a real docs portal</strong></h3><p>The big Kotlin Multiplatform story is direct Swift export - bypassing the Objective-C header bridge, which according to JetBrains yields smaller binaries and lower call-site overhead on iOS. If you&#8217;ve ever stared at a mangled Obj-C interop signature wondering where your nice Kotlin API went - this is the fix. Alongside that, JetBrains consolidated the scattered KMP guides into a single learning portal aligned with the Kotlin 2.0.0+ era, covering modern expect/actual patterns, source-set configuration in the Gradle Kotlin DSL, the current Native memory model, Ktor, and SQLDelight. Less &#8220;version soup,&#8221; more single source of truth. Overdue and welcome.</p><div><hr></div><h3><strong>Backend tooling grows up: Exposed 1.0, kotlinx-rpc, and Spring leaning in</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BAWc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70d6e2bf-ea5a-4364-9276-ddb8828c9a6a_1488x921.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BAWc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70d6e2bf-ea5a-4364-9276-ddb8828c9a6a_1488x921.png 424w, https://substackcdn.com/image/fetch/$s_!BAWc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70d6e2bf-ea5a-4364-9276-ddb8828c9a6a_1488x921.png 848w, https://substackcdn.com/image/fetch/$s_!BAWc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70d6e2bf-ea5a-4364-9276-ddb8828c9a6a_1488x921.png 1272w, https://substackcdn.com/image/fetch/$s_!BAWc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70d6e2bf-ea5a-4364-9276-ddb8828c9a6a_1488x921.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BAWc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70d6e2bf-ea5a-4364-9276-ddb8828c9a6a_1488x921.png" width="1456" height="901" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/70d6e2bf-ea5a-4364-9276-ddb8828c9a6a_1488x921.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:901,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!BAWc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70d6e2bf-ea5a-4364-9276-ddb8828c9a6a_1488x921.png 424w, https://substackcdn.com/image/fetch/$s_!BAWc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70d6e2bf-ea5a-4364-9276-ddb8828c9a6a_1488x921.png 848w, https://substackcdn.com/image/fetch/$s_!BAWc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70d6e2bf-ea5a-4364-9276-ddb8828c9a6a_1488x921.png 1272w, https://substackcdn.com/image/fetch/$s_!BAWc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70d6e2bf-ea5a-4364-9276-ddb8828c9a6a_1488x921.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>On the server side, the conference finally shipped <strong><a href="https://www.youtube.com/watch?v=5k-jh24CDZw">Exposed 1.0</a></strong> - API stability for JetBrains&#8217; SQL framework after what feels like a decade of &#8220;well, it&#8217;s basically stable already.&#8221; It comes with: experimental <strong>kotlinx-rpc</strong> (a pure-Kotlin alternative to gRPC) and native <strong>Vector</strong> types tuned for similarity search for AI workloads. The Spring alignment also continues - Josh Long was on the ground reinforcing &#8220;Kotlin-first&#8221; in the evolution of Spring Boot&#8217;s API, which remains one of the more significant partnerships for day-to-day JVM productivity. A related release this month is <strong><a href="https://github.com/ktorio/ktor/releases/tag/3.5.0">Ktor 3.5.0</a></strong>, keeping the networking layer current.</p><div><hr></div><h3><strong>Kotlin meets AI - and JetBrains wants your data on it</strong></h3><p>JetBrains pulled two parallel threads here. The first is research: a <strong><a href="https://blog.jetbrains.com/kotlin/2026/05/help-shape-the-future-of-kotlin-in-the-age-of-ai/">strategic initiative to close the AI gap between Java and Kotlin</a></strong>, targeting four workflows - completion, chat, autonomous agents, and code review. The honest premise underneath is that LLMs trained on a mountain of Java tend to produce <em>Kotlin with a Java accent</em> - losing DSLs, sealed classes, conciseness - and JetBrains wants to fix this through context injection and Kotlin-specific tuning rather than hoping foundation models figure it out on their own.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yNrZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00048eed-5053-467e-8821-292d655109b5_744x246.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yNrZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00048eed-5053-467e-8821-292d655109b5_744x246.png 424w, https://substackcdn.com/image/fetch/$s_!yNrZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00048eed-5053-467e-8821-292d655109b5_744x246.png 848w, https://substackcdn.com/image/fetch/$s_!yNrZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00048eed-5053-467e-8821-292d655109b5_744x246.png 1272w, https://substackcdn.com/image/fetch/$s_!yNrZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00048eed-5053-467e-8821-292d655109b5_744x246.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yNrZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00048eed-5053-467e-8821-292d655109b5_744x246.png" width="744" height="246" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/00048eed-5053-467e-8821-292d655109b5_744x246.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:246,&quot;width&quot;:744,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!yNrZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00048eed-5053-467e-8821-292d655109b5_744x246.png 424w, https://substackcdn.com/image/fetch/$s_!yNrZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00048eed-5053-467e-8821-292d655109b5_744x246.png 848w, https://substackcdn.com/image/fetch/$s_!yNrZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00048eed-5053-467e-8821-292d655109b5_744x246.png 1272w, https://substackcdn.com/image/fetch/$s_!yNrZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00048eed-5053-467e-8821-292d655109b5_744x246.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>The accompanying <strong><a href="https://surveys.jetbrains.com/s3/Kotlin-AI-a2">Kotlin-AI-a2 survey</a></strong> gets at the points of greatest friction: KMP structures, complex coroutine orchestration, and type-safe DSL construction, with an explicit emphasis on improving the K2 compiler&#8217;s metadata export so an in-IDE assistant gets real semantic context. If you have an opinion on where AI mangles your Kotlin (you do), this is the survey to fill out.</p><p>The second thread is plumbing: <strong><a href="https://github.com/Kotlin/kotlin-agent-skills/">kotlin-agent-skills</a></strong>, a framework that exposes the compiler&#8217;s own understanding to agents over the <strong>Model Context Protocol</strong> - search_symbols for semantic indexing, find_usages for the code graph, plus Gradle hooks to actually run compile and run_tests. The pitch is right: stop letting the model guess, and let it correct itself based on real compiler feedback. This is the same &#8220;agents grounded in deterministic tooling&#8221; thesis JetBrains has been hammering on all year, now aimed squarely at Kotlin. (And yes - this is the repo where the AGP 9.0 migration skill from last month lives, so it&#8217;s being actively populated.)</p><div><hr></div><h3><strong>VS Code extension - in alpha, with caveats</strong></h3><p>JetBrains <strong><a href="https://blog.jetbrains.com/kotlin/2026/05/official-kotlin-support-for-visual-studio-code-is-now-available-in-alpha/">officially shipped a first-party &#8220;Kotlin by JetBrains&#8221; VS Code extension</a></strong> in alpha, built on the kotlin-lsp backend. The strategic read is clear: be where the developers are - in lightweight, polyglot editors where IntelliJ isn&#8217;t always the default. The realistic read, per the <strong><a href="https://www.reddit.com/r/Kotlin/comments/1tkgvyt/official_kotlin_support_for_visual_studio_code_is/">community thread</a></strong>, is more tempered - Neovim users on the same LSP report lag and finicky completion, and KMP support is immature enough to be a dealbreaker for production work. The recurring architectural note also resurfaces: that the old Gradle jvm plugin is becoming a burden and new projects should default to multiplatform. JetBrains frames this explicitly as a &#8220;thin&#8221; experience for quick edits, not a play for parity - IntelliJ remains the only full-feature option. Good first step; manage expectations.</p><div><hr></div><h3><strong>And for dessert: Gamebit</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fDUO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76281d83-f728-4d03-89dc-2a896aeda6d6_1464x922.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fDUO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76281d83-f728-4d03-89dc-2a896aeda6d6_1464x922.png 424w, https://substackcdn.com/image/fetch/$s_!fDUO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76281d83-f728-4d03-89dc-2a896aeda6d6_1464x922.png 848w, https://substackcdn.com/image/fetch/$s_!fDUO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76281d83-f728-4d03-89dc-2a896aeda6d6_1464x922.png 1272w, https://substackcdn.com/image/fetch/$s_!fDUO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76281d83-f728-4d03-89dc-2a896aeda6d6_1464x922.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fDUO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76281d83-f728-4d03-89dc-2a896aeda6d6_1464x922.png" width="1456" height="917" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/76281d83-f728-4d03-89dc-2a896aeda6d6_1464x922.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:917,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!fDUO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76281d83-f728-4d03-89dc-2a896aeda6d6_1464x922.png 424w, https://substackcdn.com/image/fetch/$s_!fDUO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76281d83-f728-4d03-89dc-2a896aeda6d6_1464x922.png 848w, https://substackcdn.com/image/fetch/$s_!fDUO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76281d83-f728-4d03-89dc-2a896aeda6d6_1464x922.png 1272w, https://substackcdn.com/image/fetch/$s_!fDUO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76281d83-f728-4d03-89dc-2a896aeda6d6_1464x922.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>To close Section 0 with something that isn&#8217;t a roadmap slide - JetBrains spotlighted <strong><a href="https://kotl.in/e8usu3">Gamebit</a></strong> by <strong><a href="https://www.linkedin.com/preload/#">Dmytro Kurets</a></strong> , a board-game AI project that deliberately <em>doesn&#8217;t</em> reach for an LLM.</p><div id="youtube2-434WFSiYj9k" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;434WFSiYj9k&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/434WFSiYj9k?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>It&#8217;s classic algorithmic AI - Monte Carlo Tree Search, Minimax with alpha-beta pruning - implemented in Kotlin with a <strong>bitboard</strong> representation that packs entire game states into 64-bit primitives to keep GC pressure near zero during deep tree traversals, plus compile-time-enforced legal-move generation, all targeting KMP. In a year where every &#8220;AI&#8221; headline assumes a transformer, this is a genuinely refreshing reminder that in constrained, heavily logical domains, well-tuned deterministic search eats neural networks for breakfast. Star it for the bit-twiddling alone.</p><p>That&#8217;s it for Kotlin. Now - the rest of the story.</p><h2><strong>1. May: The Rest of the Story</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rGdX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf21043-d3e2-42d9-8151-3469f6bb95d1_1184x786.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rGdX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf21043-d3e2-42d9-8151-3469f6bb95d1_1184x786.png 424w, https://substackcdn.com/image/fetch/$s_!rGdX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf21043-d3e2-42d9-8151-3469f6bb95d1_1184x786.png 848w, https://substackcdn.com/image/fetch/$s_!rGdX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf21043-d3e2-42d9-8151-3469f6bb95d1_1184x786.png 1272w, https://substackcdn.com/image/fetch/$s_!rGdX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf21043-d3e2-42d9-8151-3469f6bb95d1_1184x786.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rGdX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf21043-d3e2-42d9-8151-3469f6bb95d1_1184x786.png" width="1184" height="786" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dbf21043-d3e2-42d9-8151-3469f6bb95d1_1184x786.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:786,&quot;width&quot;:1184,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!rGdX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf21043-d3e2-42d9-8151-3469f6bb95d1_1184x786.png 424w, https://substackcdn.com/image/fetch/$s_!rGdX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf21043-d3e2-42d9-8151-3469f6bb95d1_1184x786.png 848w, https://substackcdn.com/image/fetch/$s_!rGdX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf21043-d3e2-42d9-8151-3469f6bb95d1_1184x786.png 1272w, https://substackcdn.com/image/fetch/$s_!rGdX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf21043-d3e2-42d9-8151-3469f6bb95d1_1184x786.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Last month I got a little misty over Project Metropolis going to Call For Votes. May delivered the sequel. <strong>OpenJDK is moving to deprecate and remove <a href="https://www.reddit.com/r/java/comments/1tojhwx/rip_jvmci/">JVMCI</a></strong> - the Java-Level JVM Compiler Interface from JEP 243 that let Graal slot into HotSpot as a C2 replacement via -XX:+EnableJVMCI. Same logic as Metropolis: maintaining a stable interface for an external compiler while HotSpot&#8217;s internals churn became unsustainable once the strategic future of Graal as a standalone, vendor-distributed product was settled. Native Image is untouched, but Truffle languages and projects like TornadoVM now have a hard dependency on specific GraalVM builds. If you read the Metropolis section in April and thought &#8220;well, that&#8217;s the end of Graal in mainline&#8221; - this is the formal full stop. A genuinely bold experiment, quietly retired.</p><div><hr></div><p>Two <strong>JDK Reviewer nominations</strong> worth noting, both signaling where OpenJDK is allocating its review bandwidth. <strong><a href="https://www.linkedin.com/preload/#">Casper Norrbin</a></strong> from Oracle&#8217;s HotSpot runtime team (45 contributions - a custom red-black tree, string-table optimizations, removal of StatSampler/PerfData) is positioned as a key reviewer for <strong>Valhalla</strong>&#8216;s integration into mainline, which makes sense given how deep those changes reach into value-type memory layout. Separately, <strong><a href="https://mail.openjdk.org/archives/list/jdk-dev@openjdk.org/thread/QG6WHZ5PVAAJRDBKW7ONKI4Q7CZ2JFTB/">Artur Barashev</a></strong> from Oracle&#8217;s Java Security Libraries team (40+ contributions to <strong><a href="http://sun.security/">sun.security</a></strong>.ssl, notably the TLS Certificate Compression work per RFC 8879) was nominated for the security stack - sponsored by veteran Weijun Wang. Both go through the standard Three-Vote Consensus.</p><p>I admit a small bias in amplifying that some &#8220;Artur&#8221; is being promoted. Solidarity.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-0mB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936c2dd1-76cf-43f1-9d5b-69d834fd7eaf_498x269.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-0mB!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936c2dd1-76cf-43f1-9d5b-69d834fd7eaf_498x269.gif 424w, https://substackcdn.com/image/fetch/$s_!-0mB!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936c2dd1-76cf-43f1-9d5b-69d834fd7eaf_498x269.gif 848w, https://substackcdn.com/image/fetch/$s_!-0mB!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936c2dd1-76cf-43f1-9d5b-69d834fd7eaf_498x269.gif 1272w, https://substackcdn.com/image/fetch/$s_!-0mB!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936c2dd1-76cf-43f1-9d5b-69d834fd7eaf_498x269.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-0mB!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936c2dd1-76cf-43f1-9d5b-69d834fd7eaf_498x269.gif" width="498" height="269" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/936c2dd1-76cf-43f1-9d5b-69d834fd7eaf_498x269.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:269,&quot;width&quot;:498,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!-0mB!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936c2dd1-76cf-43f1-9d5b-69d834fd7eaf_498x269.gif 424w, https://substackcdn.com/image/fetch/$s_!-0mB!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936c2dd1-76cf-43f1-9d5b-69d834fd7eaf_498x269.gif 848w, https://substackcdn.com/image/fetch/$s_!-0mB!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936c2dd1-76cf-43f1-9d5b-69d834fd7eaf_498x269.gif 1272w, https://substackcdn.com/image/fetch/$s_!-0mB!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936c2dd1-76cf-43f1-9d5b-69d834fd7eaf_498x269.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><div><hr></div><p>Two smaller governance items close the topic. A <strong><a href="https://mail.openjdk.org/archives/list/core-libs-dev@openjdk.org/thread/GBI3RDSVFILSXXTPXKUUTNUANVZT3CY2/">proposal on core-libs-dev</a></strong> wants to resurrect a 2011 idea and allow <strong>method references as annotation element values</strong> (JLS &#167;9.6.1) - which would let frameworks like Spring or JUnit replace brittle, runtime-validated String literals with compile-time-checked MyClass::myMethod. A nice step in the ecosystem&#8217;s long &#8220;de-Stringification.&#8221; There&#8217;s also a <strong><a href="https://www.reddit.com/r/java/comments/1t1r8rz/jep_draft_deprecate_the_javasqlrowset_module_for/">JEP draft to deprecate the java.sql.rowset module</a></strong> for removal - ~60 commits since 2017, high maintenance cost - which triggered the predictable &#8220;but I use CachedRowSet in tests&#8221; pushback. The eternal struggle between trimming the JDK and the niche tools people quietly rely on.</p><div><hr></div><p>The race to make the JVM an AI host is sasily the most crowded topic of the month. The strategic signal: <strong><a href="https://feeds.feedblitz.com/~/954947657/0/baeldung~Java-Weekly-Issue">JDK 27 planning named generative AI as one of its main pillars</a></strong>, with talk of tuning the runtime for vector cognitive-computing patterns and high-throughput LLM orchestration - a deliberate &#8220;Java wants to be a full AI host, not just a deployment target for Python&#8221; declaration.</p><p>The proof-of-concept layer is filling in fast. <strong><a href="http://qxotic.ai/">Qxotic.ai</a></strong> uses <strong>Project Panama (JEP 454, FFM API)</strong> to talk to native inference engines like ONNX Runtime and llama.cpp directly - no JNI glue - and combines that with GraalVM Native Image for sub-100ms startup, building the case for local LLM execution on the JVM with type-safe model orchestration.</p><p>There are also two &#8220;redesign the architecture <em>for</em> LLMs&#8221; projects I&#8217;m bundling together because they&#8217;re the same idea from opposite ends: <strong><a href="https://github.com/nikoma/carrier">Carrier</a></strong> is an AI-first backend compiler that turns natural-language or JSON specs into idiomatic Spring Boot 3.x (Spring Data JPA, entities, controllers, synced migrations), while <strong><a href="https://github.com/jfinal/aifei">Aifei</a></strong> by <strong><a href="https://www.linkedin.com/preload/#">James Zhan</a></strong> of JFinal goes the other way - a deliberately minimalist framework of 3,333 lines and zero dependencies that collapses Controller/Service/Repository/Mapper into a single &#8220;Just Service&#8221; specifically to raise &#8220;attention density&#8221; and keep the entire LLM context window aimed at business logic. Seniors will (rightly) shudder at the abandonment of separation of concerns, but both are honest attempts at designing for how agents actually reason. I&#8217;m skeptical and curious in roughly equal measure.</p><p><strong><a href="https://www.linkedin.com/preload/#">JetBrains</a></strong> continuing its &#8220;let&#8217;s turn everything into an agent&#8221; campaign, shipped an <strong><a href="https://blog.jetbrains.com/idea/2026/05/teaching-an-ai-agent-to-debug-flaky-tests/">agent skill for debugging flaky tests</a></strong> that orchestrates the actual JVM debugger and test runner across iterations to hunt race conditions and environment leaks - agentic workflows grounded in real execution state, not static guessing. This plugs directly into their <strong><a href="https://blog.jetbrains.com/ai/2026/05/our-2026-direction-ai-and-classic-workflows-in-jetbrains-ides-2/">2026 &#8220;dual-workflow&#8221; roadmap</a></strong>, which leans on IntelliJ&#8217;s existing static analysis engine as a real-time verification layer against LLM hallucinations, plus a local-first approach to privacy. The <strong><a href="https://blog.jetbrains.com/ai/2026/05/meet-the-finalists-jetbrains-codex-hackathon/">Codex hackathon finalists</a></strong> showed where the practical wins are: <strong>AST-aware context pruning</strong> to cut token waste and hallucinations, LSP-based validation of generated code, and reasoning-trace sidebars so the agent&#8217;s logic is auditable. The recurring lesson across all of this is the same one I keep coming back to in the book - the value isn&#8217;t the model, it&#8217;s the deterministic harness you wrap around it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JfMJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F941606db-3716-48f2-8781-9be1d21c9106_1488x961.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JfMJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F941606db-3716-48f2-8781-9be1d21c9106_1488x961.png 424w, https://substackcdn.com/image/fetch/$s_!JfMJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F941606db-3716-48f2-8781-9be1d21c9106_1488x961.png 848w, https://substackcdn.com/image/fetch/$s_!JfMJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F941606db-3716-48f2-8781-9be1d21c9106_1488x961.png 1272w, https://substackcdn.com/image/fetch/$s_!JfMJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F941606db-3716-48f2-8781-9be1d21c9106_1488x961.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JfMJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F941606db-3716-48f2-8781-9be1d21c9106_1488x961.png" width="1456" height="940" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/941606db-3716-48f2-8781-9be1d21c9106_1488x961.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:940,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!JfMJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F941606db-3716-48f2-8781-9be1d21c9106_1488x961.png 424w, https://substackcdn.com/image/fetch/$s_!JfMJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F941606db-3716-48f2-8781-9be1d21c9106_1488x961.png 848w, https://substackcdn.com/image/fetch/$s_!JfMJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F941606db-3716-48f2-8781-9be1d21c9106_1488x961.png 1272w, https://substackcdn.com/image/fetch/$s_!JfMJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F941606db-3716-48f2-8781-9be1d21c9106_1488x961.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>And as an antidote to all the optimism: <strong><a href="https://www.linkedin.com/preload/#">Markus Eisele</a></strong> <strong><a href="https://www.the-main-thread.com/p/modernization-spiderweb-ai-java">Spiderweb Model</a></strong> for quantifying Java modernization. Instead of counting lines of code, it scores six axes - Scope, Semantics, Knowledge Opacity, Integration/Data, Feedback Friction, Governance - and his sharpest insight is that it&#8217;s <strong>Knowledge Opacity</strong> (undocumented &#8220;tribal knowledge&#8221; debt) and <strong>Feedback Friction</strong> (slow, brittle CI/CD) that actually sink AI-assisted migrations. LLMs translate syntax beautifully; they won&#8217;t conjure up missing test coverage or solve an architectural constraint nobody wrote down. Required reality check for anyone selling &#8220;just point an agent at the monolith.&#8221;</p><div><hr></div><p><strong>The JVM is finally good at scripting</strong>, and <strong><a href="https://www.linkedin.com/preload/#">Haoyi Li</a></strong> overview breaks down the three-way race: Java shedding ceremony through JEP 330, 463, and 477 (single-file execution, unnamed classes, implicit imports); Kotlin&#8217;s .kts with @<strong>file:DependsOn</strong>; and Scala CLI, arguably leading on DX thanks to using directives plus GraalVM Native Image killing the 100-200ms startup tax. Mill 0.12 wires it into tooling. The choice is now genuinely a trade-off question, not a &#8220;is this even possible&#8221; one.</p><div><hr></div><p>On <strong>Wasm</strong>, a good <strong><a href="https://www.reddit.com/r/java/comments/1t1zbbx/have_you_ever_used_webassembly_in_your_java/">landscape survey on r/java</a></strong>: TeaVM (WasmGC) and CheerpJ for compiling <em>to</em> Wasm, GraalWasm and the pure-Java Chicory for running Wasm <em>inside</em> a JVM as sandboxed plugins. The missing piece remains a standardized Component Model - serialization overhead at the JVM/Wasm boundary is still costly - and the community sees Project Babylon and Leyden as precursors to any official integration. Pair this with Kotlin/Wasm going Stable (Section 0) and this year&#8217;s Wasm story suddenly has legs.</p><div><hr></div><p>A few more, rapid-fire: <strong>Scala SIP-80</strong> proposes <strong><a href="https://www.reddit.com/r/scala/comments/1t56k06/sip80_targettyped_companion_shorthand/">a Swift-style target-typed companion shorthand</a></strong> (.Member) and immediately triggered the &#8220;feature fatigue / freeze the language and fix 3.6.x stability first&#8221; debate that&#8217;s worth reading as a snapshot of current Scala mood.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Nu1G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd4d36c3-3357-46ab-a3a4-f6f43491ccf6_1488x853.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Nu1G!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd4d36c3-3357-46ab-a3a4-f6f43491ccf6_1488x853.png 424w, https://substackcdn.com/image/fetch/$s_!Nu1G!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd4d36c3-3357-46ab-a3a4-f6f43491ccf6_1488x853.png 848w, https://substackcdn.com/image/fetch/$s_!Nu1G!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd4d36c3-3357-46ab-a3a4-f6f43491ccf6_1488x853.png 1272w, https://substackcdn.com/image/fetch/$s_!Nu1G!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd4d36c3-3357-46ab-a3a4-f6f43491ccf6_1488x853.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Nu1G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd4d36c3-3357-46ab-a3a4-f6f43491ccf6_1488x853.png" width="1456" height="835" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dd4d36c3-3357-46ab-a3a4-f6f43491ccf6_1488x853.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:835,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Nu1G!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd4d36c3-3357-46ab-a3a4-f6f43491ccf6_1488x853.png 424w, https://substackcdn.com/image/fetch/$s_!Nu1G!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd4d36c3-3357-46ab-a3a4-f6f43491ccf6_1488x853.png 848w, https://substackcdn.com/image/fetch/$s_!Nu1G!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd4d36c3-3357-46ab-a3a4-f6f43491ccf6_1488x853.png 1272w, https://substackcdn.com/image/fetch/$s_!Nu1G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd4d36c3-3357-46ab-a3a4-f6f43491ccf6_1488x853.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong>Netflix open-sourced <a href="https://www.reddit.com/r/java/comments/1t7b271/scaling_archunit_with_nebula_archrules/">Nebula ArchRules</a></strong>, a Gradle plugin that scales ArchUnit by decoupling rules from the test lifecycle and running them as tasks bound to check, with three-tier (error/warning/info) granularity.</p><p>The <strong><a href="https://blog.jetbrains.com/platform/2026/05/make-your-plugin-remote-development-ready/">IntelliJ Platform</a></strong> is pushing plugin authors toward a Remote-Development-ready split (headless backend vs. JetBrains client UI, ClientSession API, EDT discipline), while the fun community library swing-fluid-swipe uses JNI into AppKit&#8217;s NSEvent to bring smooth trackpad gestures to Swing on macOS.</p><p>And a <strong><a href="https://medium.com/@yalovoy/four-million-lambda-invokes-across-python-java-rust-and-go-5b9218f64563">benchmark of 4 million AWS Lambda invocations</a></strong> confirms that <strong>SnapStart</strong> pulls Java 21 cold starts down from a brutal 1,200&#8211;4,500ms to 400&#8211;600ms (at 512MB+) - effectively neutralizing Go&#8217;s and Python&#8217;s edge, although Rust&#8217;s sub-50ms still reigns. SnapStart is now a genuine alternative to Native Image if you want to keep standard JVM ergonomics in serverless.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!M81x!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14c751eb-de0b-4484-88ef-73655d460e6b_759x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!M81x!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14c751eb-de0b-4484-88ef-73655d460e6b_759x1000.png 424w, https://substackcdn.com/image/fetch/$s_!M81x!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14c751eb-de0b-4484-88ef-73655d460e6b_759x1000.png 848w, https://substackcdn.com/image/fetch/$s_!M81x!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14c751eb-de0b-4484-88ef-73655d460e6b_759x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!M81x!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14c751eb-de0b-4484-88ef-73655d460e6b_759x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!M81x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14c751eb-de0b-4484-88ef-73655d460e6b_759x1000.png" width="759" height="1000" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/14c751eb-de0b-4484-88ef-73655d460e6b_759x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1000,&quot;width&quot;:759,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!M81x!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14c751eb-de0b-4484-88ef-73655d460e6b_759x1000.png 424w, https://substackcdn.com/image/fetch/$s_!M81x!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14c751eb-de0b-4484-88ef-73655d460e6b_759x1000.png 848w, https://substackcdn.com/image/fetch/$s_!M81x!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14c751eb-de0b-4484-88ef-73655d460e6b_759x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!M81x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14c751eb-de0b-4484-88ef-73655d460e6b_759x1000.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>And to close the section on a human note: the community is <strong><a href="https://www.reddit.com/r/java/comments/1t3uqc7/are_old_java_developer_journals_or_dr_dobbs_mags/">worried about preserving the Java Developer Journal and Dr. Dobb&#8217;s archives</a></strong> from the early-2000s J2SE 5.0 era, because Sys-con Media never maintained accessible digital copies. Former JDJ editor Joseph Ottinger confirmed that the physical magazines may be the only surviving record.</p><p>There&#8217;s something on point about an ecosystem so obsessed with backwards compatibility realizing that its own written history is rotting. If you have a box of those issues in the attic - scan them.</p><h2><strong>2. Release Radar</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!S2eo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f6bbaba-fe11-47fc-a72a-d92204731438_1186x786.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!S2eo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f6bbaba-fe11-47fc-a72a-d92204731438_1186x786.png 424w, https://substackcdn.com/image/fetch/$s_!S2eo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f6bbaba-fe11-47fc-a72a-d92204731438_1186x786.png 848w, https://substackcdn.com/image/fetch/$s_!S2eo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f6bbaba-fe11-47fc-a72a-d92204731438_1186x786.png 1272w, https://substackcdn.com/image/fetch/$s_!S2eo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f6bbaba-fe11-47fc-a72a-d92204731438_1186x786.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!S2eo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f6bbaba-fe11-47fc-a72a-d92204731438_1186x786.png" width="1186" height="786" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8f6bbaba-fe11-47fc-a72a-d92204731438_1186x786.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:786,&quot;width&quot;:1186,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!S2eo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f6bbaba-fe11-47fc-a72a-d92204731438_1186x786.png 424w, https://substackcdn.com/image/fetch/$s_!S2eo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f6bbaba-fe11-47fc-a72a-d92204731438_1186x786.png 848w, https://substackcdn.com/image/fetch/$s_!S2eo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f6bbaba-fe11-47fc-a72a-d92204731438_1186x786.png 1272w, https://substackcdn.com/image/fetch/$s_!S2eo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f6bbaba-fe11-47fc-a72a-d92204731438_1186x786.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3><strong>Micronaut 5.0.0 GA</strong></h3><p><strong><a href="https://micronaut.io/2026/05/20/micronaut-framework-5-0-0-released/">Micronaut 5.0.0 went GA</a></strong> - the first major in three years, and deliberately a stabilization release rather than a feature dump. The center of gravity is a <strong>unified Platform BOM</strong> that syncs every module to kill version drift - which matters enormously for reproducible AOT compilation on GraalVM - on a JDK 17 base.</p><p>On the <strong><a href="https://github.com/micronaut-projects/micronaut-core/releases/tag/v5.0.0">Core side</a></strong>, 5.0 adds a <strong>programmatic Retry and Circuit Breaker API</strong> going beyond the declarative annotations, fixes native-image initialization for &#8220;loom-carrier&#8221; threads in GraalVM 25, and ships a new Async HTTP Client. Two breaking changes worth catching: the YAML media type moves to application/yaml, and <em>BeanIntrospectionModule</em> is gone - read the migration guide before jumping from 4.x.</p><h3><strong>WildFly 40 GA</strong></h3><p><strong><a href="https://www.wildfly.org/news/2026/05/21/WildFly-40-is-released/">WildFly 40</a></strong> went GA on May 21 (Brian Stansberry), and it&#8217;s a more significant release than the round number suggests.</p><p>The headline: the standard distribution moves to <strong>Jakarta EE 11</strong> - after incubating in a Preview variant since WildFly 32, EE 11 finally hits the default server, so you get Jakarta Data backed by Hibernate Data Repositories, Jakarta Persistence 3.2 improvements, and virtual threads in Jakarta Concurrency services on Java SE 21+.</p><p>For those not yet ready to migrate, a temporary <strong>WildFly EE 10</strong> variant appeared, and on the security front - a long-requested <strong>HashiCorp Vault</strong> integration feature pack. This ties in nicely with the Jakarta EE 12 thread from Section 1: the spec keeps moving, and the servers are just now shipping the previous edition.</p><h3><strong>Payara &#8594; Azul Payara Community</strong></h3><p><strong><a href="https://foojay.io/today/a-new-chapter-for-the-payara-community/">Payara Platform Community is becoming Azul Payara Community</a></strong>, moving under Azul governance and aligning its lifecycle with Azul Zulu OpenJDK and Java LTS support windows. Community builds remain TCK-compliant with Jakarta EE, but expect changes to distribution binaries and artifact naming that will trickle into your dependency management and CI. More predictable long-term support in exchange for watching how the vendor model handles transparency.</p><h3><strong>Quarkus 3.35.0</strong></h3><p><strong><a href="https://quarkus.io/blog/quarkus-3-35-released/">Quarkus 3.35.0</a></strong> shipped JAR tree-shaking, native PGO, and @Transactional support for Hibernate Reactive - but the most interesting bit is the <strong><a href="https://quarkus.io/blog/semeru-scc/">integration with IBM Semeru / OpenJ9 Shared Classes Cache</a></strong>. It&#8217;s a pragmatic middle path to faster cold starts via -Xshareclasses and multi-stage Docker builds that shift JIT warmup from runtime to build time, with a nice RSS reduction because instances share cached metadata - no closed-world constraints and full reflection retained.</p><p>And as a fun stress test of the model: <strong><a href="https://quarkus.io/insights/">Quarkus Insights #246</a></strong> walks through redesigning <em>Minecraft</em> server infrastructure as cloud-native (GraalVM native images, Mutiny, reactive messaging) to avoid stop-the-world GC pauses. <strong><a href="https://github.com/quarkusio/quarkus/releases/tag/3.35.0">Full notes</a></strong>.</p><h3><strong>Hibernate ORM 7.4.0</strong></h3><p><strong><a href="https://github.com/hibernate/hibernate-orm/releases/tag/7.4.0">Hibernate ORM 7.4.0</a></strong> is more than a routine bump - it ships an incubating but potentially substantial <strong>StateManagement SPI</strong> along with two annotations built on top of it: @Temporal for mapping temporal data and querying by &#8220;effectivity&#8221; over time (an effectivity-columns table or a split between current and historical data, transparent to client code) and @Audited for tracking modifications in a separate audit log.</p><p>There&#8217;s also a <strong><a href="https://docs.hibernate.org/orm/7.4/migration-guide/">migration guide</a></strong> worth reviewing - among other things, on Oracle the HQL current date/local date expressions now translate via trunc(). If you&#8217;ve ever rolled your own temporality or Envers-based audit - take a look before you add another custom one.</p><h3><strong>Apache Fory 1.0.0</strong></h3><p><strong><a href="https://fory.apache.org/blog/fory_1_0_0_release/">Apache Fory 1.0.0</a></strong> - the high-performance multilingual serialization framework (you&#8217;ll remember it as Fury) hits 1.0, and in this case it&#8217;s a real milestone: from this version on, <strong>binary compatibility is guaranteed</strong>, and the unified <strong>xlang</strong> type system becomes the default mode across all languages (compatible-mode reads, simplified field ordering, better list/array compatibility).</p><p><em>decimal</em> and <em>bfloat16</em> support for xlang join in, and on the JVM side: <strong>Kotlin</strong> gets xlang, KSP, and IDL schema support, while <strong>Java</strong> gets Android serialization and annotation processor support. 84 PRs from 11 contributors. For anyone who&#8217;s measured serialization cost on a hot path, worth benchmarking against Protobuf or your current setup.</p><h3><strong>JUnit 6.1.0</strong></h3><p><strong><a href="https://docs.junit.org/6.1.0/release-notes.html">JUnit 6.1.0</a></strong> continues the 6.x line with a few genuinely useful items. The most interesting for large suites: a new WorkerThreadPoolHierarchicalTestExecutorService for parallel execution backed by a plain thread pool instead of ForkJoinPool, plus an <strong>experimental memory-cleanup mode</strong> (junit.platform.execution.memory.cleanup.enabled) useful for massive test counts.</p><p>There&#8217;s also the ability to redirect XML events from <em>OpenTestReportGeneratingListener</em> to a socket instead of a file. If you&#8217;re tracking the JUnit 6 migration (Keycloak&#8217;s new test framework targets it, for one) - keep this on the radar.</p><h3><strong>JobRunr 8.6.0</strong></h3><p><strong><a href="https://github.com/jobrunr/jobrunr/releases/tag/v8.6.0">JobRunr 8.6.0</a></strong> - the background jobs library that increasingly doubles as infrastructure for agentic stacks (recall ClawRunr built on top of it). 8.6.0 adds full <strong>JDK 26</strong> compatibility, official <strong>Quarkus 3.33 LTS</strong> support, performance improvements for recurring jobs and SQL table validation, and - practically useful for agentic patterns - the ability to set a timeout for jobs waiting for an external signal, so they don&#8217;t hang indefinitely.</p><h3><strong>LangChain4j 1.14.0</strong></h3><p><strong><a href="https://docs.langchain4j.dev/latest-release-notes/">LangChain4j 1.14.0</a></strong> - the workhorse of the JVM AI stack keeps iterating. Beyond bug fixes and dependency bumps, there&#8217;s a new IMMEDIATE_IF_LAST attribute in the ReturnBehavior enum (returns the result of the AI service execution loop when a given tool is the last one in the LLM&#8217;s response) and an OpenAiOfficialResponsesChatModel class, closing the pair with its streaming counterpart for OpenAI&#8217;s Responses API.</p><p>A line in which the &#8220;resilient, stateful agents as baseline&#8221; trend is still visible.</p><h3><strong>Apache NetBeans 30</strong></h3><p><strong><a href="https://www.reddit.com/r/java/comments/1tjfyxp/apache_netbeans_30_released/">NetBeans 30</a></strong> is out - the IDE that quietly keeps shipping solid, on-time releases for the part of the community that never left it. Details in the changelog, but if you&#8217;re in the NetBeans camp, this is a standard &#8220;upgrade and move on.&#8221;</p><h3><strong>JReleaser 1.24.0 / Ujorm 3.0.0 / Bob v0.7.0</strong></h3><p>Three smaller items: <strong><a href="https://jreleaser.org/">JReleaser 1.24.0</a></strong> for release automation adds Zernio to the announcer list and a reproducible flag to enforce reproducible output; <strong><a href="https://dzone.com/articles/ujorm3-lightweight-orm-java">Ujorm 3.0.0</a></strong>, a lightweight ORM, hits major; and <strong><a href="https://www.reddit.com/r/java/comments/1tfptbu/bob_v070_lightweight_builder_generator_for_java/">Bob v0.7.0</a></strong> is a lightweight builder generator for Java for those allergic to annotation processors.</p><h2><strong>3. GitHub All-Stars</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!At8c!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4093594-39a5-4955-bc29-2fcf27b307ef_1178x780.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!At8c!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4093594-39a5-4955-bc29-2fcf27b307ef_1178x780.png 424w, https://substackcdn.com/image/fetch/$s_!At8c!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4093594-39a5-4955-bc29-2fcf27b307ef_1178x780.png 848w, https://substackcdn.com/image/fetch/$s_!At8c!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4093594-39a5-4955-bc29-2fcf27b307ef_1178x780.png 1272w, https://substackcdn.com/image/fetch/$s_!At8c!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4093594-39a5-4955-bc29-2fcf27b307ef_1178x780.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!At8c!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4093594-39a5-4955-bc29-2fcf27b307ef_1178x780.png" width="1178" height="780" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c4093594-39a5-4955-bc29-2fcf27b307ef_1178x780.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:780,&quot;width&quot;:1178,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!At8c!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4093594-39a5-4955-bc29-2fcf27b307ef_1178x780.png 424w, https://substackcdn.com/image/fetch/$s_!At8c!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4093594-39a5-4955-bc29-2fcf27b307ef_1178x780.png 848w, https://substackcdn.com/image/fetch/$s_!At8c!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4093594-39a5-4955-bc29-2fcf27b307ef_1178x780.png 1272w, https://substackcdn.com/image/fetch/$s_!At8c!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4093594-39a5-4955-bc29-2fcf27b307ef_1178x780.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Four community projects that aren&#8217;t formal releases but are too interesting to lose.</p><h3><strong>Jacobin - a JVM written in Go</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xHXN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4225cf4e-0486-461c-a011-0c7544acef14_1143x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xHXN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4225cf4e-0486-461c-a011-0c7544acef14_1143x1000.png 424w, https://substackcdn.com/image/fetch/$s_!xHXN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4225cf4e-0486-461c-a011-0c7544acef14_1143x1000.png 848w, https://substackcdn.com/image/fetch/$s_!xHXN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4225cf4e-0486-461c-a011-0c7544acef14_1143x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!xHXN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4225cf4e-0486-461c-a011-0c7544acef14_1143x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xHXN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4225cf4e-0486-461c-a011-0c7544acef14_1143x1000.png" width="1143" height="1000" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4225cf4e-0486-461c-a011-0c7544acef14_1143x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1000,&quot;width&quot;:1143,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!xHXN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4225cf4e-0486-461c-a011-0c7544acef14_1143x1000.png 424w, https://substackcdn.com/image/fetch/$s_!xHXN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4225cf4e-0486-461c-a011-0c7544acef14_1143x1000.png 848w, https://substackcdn.com/image/fetch/$s_!xHXN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4225cf4e-0486-461c-a011-0c7544acef14_1143x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!xHXN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4225cf4e-0486-461c-a011-0c7544acef14_1143x1000.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong><a href="https://github.com/platypusguy/jacobin">Jacobin</a></strong> is exactly the type of project that keeps me humble: a full reimplementation of the JVM in <strong>Go</strong>, targeting the Java 21 spec - and it&#8217;s not a toy. It handles invokedynamic, CONSTANT_Dynamic, sealed classes, and records via its own class-file parser, runs modern class files without a local JDK, and delegates memory management to Go&#8217;s GC instead of building its own heap.</p><p>It&#8217;s a strict interpreter with no JIT, so it won&#8217;t threaten HotSpot on throughput - but as a clean-room, OpenJDK-independent execution engine, it&#8217;s a genuinely valuable lens on how the JVM instruction set actually works. The kind of repo I&#8217;ll be pointing people at when they want to <em>understand</em> class loading rather than just trust it.</p><h3><strong>Strange - pure-Java quantum simulation</strong></h3><p><strong><a href="https://github.com/redfx-quantum/strange">Strange</a></strong> by <strong><a href="https://www.linkedin.com/preload/#">Johan Vos</a></strong> is a pure-Java API for quantum computation and a state-vector simulator - qubits and gates (Hadamard, Pauli-X, CNOT) via a declarative DSL for circuit construction, no native dependencies, no QPU access.</p><p>Originally a teaching tool for the Manning book <em>Quantum Computing in Action</em>, now maturing under RedFX, it lets you prototype Grover or Shor algorithms entirely inside a standard JVM. Classical state-vector simulation obviously doesn&#8217;t scale to real quantum hardware, but as an on-ramp for Java developers to experiment with quantum logic before committing to cloud QPUs, it lowers the barrier to entry considerably.</p><h3><strong>Versionparser - zero-dependency, multi-scheme version parsing</strong></h3><p><strong><a href="https://github.com/cthing/versionparser">Versionparser</a></strong> is the unglamorous-but-essential kind of utility: a Java 17+ library, <strong>zero dependencies</strong>, that parses, compares, and normalizes version strings across incompatible ecosystems - SemVer 2.0.0, Maven, Python (PEP 440), Debian, RPM, OpenJDK formats, plus CalVer, caret/tilde ranges, epochs, and pre-release identifiers. If you&#8217;ve ever hand-rolled version-comparison logic and watched it die on a Debian version with an epoch prefix, you know exactly why a unified Version interface with no transitive dependencies is worth bookmarking - perfect for dependency scanners and build-system tooling.</p><h3><strong>Benetto - private on-device transcription on Android</strong></h3><p><strong><a href="https://github.com/570775-ux/Benetto">Benetto</a></strong> (1.0.0, MIT) is a Kotlin Android app that runs whisper.cpp locally for voice transcription in 99+ languages - zero outbound network traffic, zero API cost. It uses the Whisper &#8220;Small&#8221; model (~466MB - an obvious disk-space hurdle), cleanly separates the AudioRecord-based recording module from the inference engine, and persists everything through Room.</p><p>As a reference for wiring high-performance C++ inference into Kotlin/Android internals, and as a response to data sovereignty concerns around cloud transcription APIs, it&#8217;s a tidy demonstration of where on-device ML has arrived.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tyQ1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d3cc4a-ad22-4cad-bbef-b39d83905e07_1333x1000.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tyQ1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d3cc4a-ad22-4cad-bbef-b39d83905e07_1333x1000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!tyQ1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d3cc4a-ad22-4cad-bbef-b39d83905e07_1333x1000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!tyQ1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d3cc4a-ad22-4cad-bbef-b39d83905e07_1333x1000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!tyQ1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d3cc4a-ad22-4cad-bbef-b39d83905e07_1333x1000.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tyQ1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d3cc4a-ad22-4cad-bbef-b39d83905e07_1333x1000.jpeg" width="1333" height="1000" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/33d3cc4a-ad22-4cad-bbef-b39d83905e07_1333x1000.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1000,&quot;width&quot;:1333,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!tyQ1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d3cc4a-ad22-4cad-bbef-b39d83905e07_1333x1000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!tyQ1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d3cc4a-ad22-4cad-bbef-b39d83905e07_1333x1000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!tyQ1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d3cc4a-ad22-4cad-bbef-b39d83905e07_1333x1000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!tyQ1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d3cc4a-ad22-4cad-bbef-b39d83905e07_1333x1000.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong>PS:</strong> Fresh off <strong>KotlinConf &#8216;26 in Munich</strong> as a media partner - I wasn&#8217;t there myself, but the representation was solid - thanks to <strong><a href="https://www.linkedin.com/preload/#">Grzegorz Kr&#243;l</a></strong> for the running updates. Hence this fairly Kotlin-centric edition; no regrets.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[JDK 27 takes shape, while GraalVM changes the release cadence - JVM Weekly vol. 176]]></title><description><![CDATA[GraalVM switches to monthly releases (and sparks a discussion about JVMCI), Valhalla finally leaves the lab, and JDK 27 EA brings a whole load of improvements.]]></description><link>https://www.jvm-weekly.com/p/jdk-27-takes-shape-while-graalvm</link><guid isPermaLink="false">https://www.jvm-weekly.com/p/jdk-27-takes-shape-while-graalvm</guid><dc:creator><![CDATA[Artur Skowronski]]></dc:creator><pubDate>Thu, 21 May 2026 13:03:34 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!svnI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0df0b926-f375-4f26-8595-d5bad35c821e_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!svnI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0df0b926-f375-4f26-8595-d5bad35c821e_1456x1048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!svnI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0df0b926-f375-4f26-8595-d5bad35c821e_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!svnI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0df0b926-f375-4f26-8595-d5bad35c821e_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!svnI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0df0b926-f375-4f26-8595-d5bad35c821e_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!svnI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0df0b926-f375-4f26-8595-d5bad35c821e_1456x1048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!svnI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0df0b926-f375-4f26-8595-d5bad35c821e_1456x1048.png" width="1456" height="1048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0df0b926-f375-4f26-8595-d5bad35c821e_1456x1048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1048,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2178244,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/198680317?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0df0b926-f375-4f26-8595-d5bad35c821e_1456x1048.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!svnI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0df0b926-f375-4f26-8595-d5bad35c821e_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!svnI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0df0b926-f375-4f26-8595-d5bad35c821e_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!svnI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0df0b926-f375-4f26-8595-d5bad35c821e_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!svnI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0df0b926-f375-4f26-8595-d5bad35c821e_1456x1048.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Welcome to another edition. This week it&#8217;s all about the ecosystem internals - lots of movement on both the GraalVM and OpenJDK fronts. And interestingly, these two threads are starting to intertwine - so let&#8217;s begin with the biggest organizational shift.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2><strong>1. GraalVM Overhauls Its Delivery Model - and Amazon Fights for JVMCI&#8217;s Future</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4JvB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92abbb30-804d-4cee-8cfa-09fc99680172_1488x963.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4JvB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92abbb30-804d-4cee-8cfa-09fc99680172_1488x963.png 424w, https://substackcdn.com/image/fetch/$s_!4JvB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92abbb30-804d-4cee-8cfa-09fc99680172_1488x963.png 848w, https://substackcdn.com/image/fetch/$s_!4JvB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92abbb30-804d-4cee-8cfa-09fc99680172_1488x963.png 1272w, https://substackcdn.com/image/fetch/$s_!4JvB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92abbb30-804d-4cee-8cfa-09fc99680172_1488x963.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4JvB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92abbb30-804d-4cee-8cfa-09fc99680172_1488x963.png" width="1456" height="942" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/92abbb30-804d-4cee-8cfa-09fc99680172_1488x963.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:942,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!4JvB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92abbb30-804d-4cee-8cfa-09fc99680172_1488x963.png 424w, https://substackcdn.com/image/fetch/$s_!4JvB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92abbb30-804d-4cee-8cfa-09fc99680172_1488x963.png 848w, https://substackcdn.com/image/fetch/$s_!4JvB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92abbb30-804d-4cee-8cfa-09fc99680172_1488x963.png 1272w, https://substackcdn.com/image/fetch/$s_!4JvB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92abbb30-804d-4cee-8cfa-09fc99680172_1488x963.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>GraalVM is making a fundamental change to its delivery model on two fronts simultaneously. First, the project drops its independent versioning (remember those confusing 22.3, 23.0 numbers?) in favor of JDK-aligned labels like &#8220;GraalVM for JDK 21,&#8221; following the <strong><a href="https://openjdk.org/jeps/223">JEP 223</a></strong> scheme - though this had already been creeping into the naming for a while. Second - and this is the bolder move - GraalVM shifts from quarterly to <strong>monthly feature releases</strong>.</p><p>The main driver is - of course - the need to ship AI-targeted compiler optimizations faster (hehe) along with developer tooling improvements. For JVM engineers, this means a much shorter feedback loop, especially around Native Image and polyglot environments. On the flip side, it forces a strategic choice: adopt the monthly cadence and get incremental functional iterations, or stay on quarterly <strong><a href="https://www.oracle.com/security-alerts/">CPU</a></strong> (Critical Patch Updates) and miss the latest optimizations. In other words, GraalVM is creating two tracks: a &#8220;fast lane&#8221; for teams that can keep up with testing, and a &#8220;stability lane&#8221; for those who prefer the proven quarterly security patch cycle. Sound familiar? It&#8217;s the same dilemma OpenJDK solved with its feature release / LTS split - just on a far more compressed timescale.</p><p>Because in 2026, everything is faster. At this rate, by 2028 we&#8217;ll be doing daily releases.</p><p>On the technical side - under the <strong><a href="https://www.oracle.com/downloads/licenses/graal-free-license.html">GraalVM Free Terms and Conditions (GFTC)</a></strong>, advanced performance optimizations and G1 GC support, previously locked behind the Enterprise paywall, are now available in the free distribution. This significantly lowers the barrier for production Native Image deployments. If someone ever told you &#8220;GraalVM Native Image isn&#8217;t production-ready without Enterprise&#8221; - that excuse just expired.</p><p>There&#8217;s also a notable caveat in the roadmap: GraalVM plans to <strong>skip support for JDK 26, 27, and 28</strong> (non-LTS versions), targeting Java 29 directly. For teams still on the 22.3.x line, this is a clear signal to migrate to a JDK 17 or 21 baseline - sooner rather than later. Aggressive sunsetting of older branches combined with an accelerated release cadence creates pressure not every enterprise will be ready for.</p><p>And it&#8217;s precisely in this context that a parallel discussion deserves attention - <strong><a href="https://mail.openjdk.org/archives/list/hotspot-compiler-dev@openjdk.org/thread/E626GML4PPAOR326DHB45XE3LMWRTVOP/">JDK-8382582</a></strong>, proposing the <strong>removal of the experimental JVMCI</strong> (Java-Level JVM Compiler Interface) from OpenJDK. HotSpot maintainers argue, not unreasonably, that JVMCI introduces significant codebase complexity and testing overhead for a feature that remains niche outside the GraalVM ecosystem.</p><p>Makes sense, right? The problem? <strong>Amazon has formally opposed it.</strong> This isn&#8217;t sentiment - their engineers report heavy reliance on Graal JIT and the Truffle framework to scale polyglot applications in production on HotSpot. And this is no small player - we&#8217;re talking AWS-scale, Corretto, and the entire ecosystem Amazon builds around the JVM.</p><p>To understand the stakes, a quick step back. <strong><a href="https://openjdk.org/jeps/243">JVMCI</a></strong> is an experimental API introduced in JDK 9 that opens HotSpot&#8217;s internal compilation pipeline to external implementations. Normally, when HotSpot decides a code path is &#8220;hot&#8221; enough for native compilation, it hands it to one of its built-in compilers: C1 (fast compilation, less optimization) or C2 (slower compilation, aggressive optimization). JVMCI lets you plug <strong>any Java-written compiler</strong> into that slot - and that&#8217;s exactly how Graal JIT works. Instead of C2, HotSpot passes the code&#8217;s intermediate representation to the Graal compiler via JVMCI, and Graal returns compiled machine code. This is what lets you run Graal as a drop-in C2 replacement on stock OpenJDK - no full GraalVM distribution needed.</p><p>JVMCI is also the foundation for Truffle - the framework that lets you implement interpreters for new languages (JavaScript, Python, Ruby, R, LLVM bitcode) and automatically get JIT compilation through partial evaluation. Without JVMCI, the entire &#8220;polyglot on HotSpot&#8221; model stops working.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jCOe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec873094-bd8a-47fa-af40-87ed0433297a_750x500.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jCOe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec873094-bd8a-47fa-af40-87ed0433297a_750x500.png 424w, https://substackcdn.com/image/fetch/$s_!jCOe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec873094-bd8a-47fa-af40-87ed0433297a_750x500.png 848w, https://substackcdn.com/image/fetch/$s_!jCOe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec873094-bd8a-47fa-af40-87ed0433297a_750x500.png 1272w, https://substackcdn.com/image/fetch/$s_!jCOe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec873094-bd8a-47fa-af40-87ed0433297a_750x500.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jCOe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec873094-bd8a-47fa-af40-87ed0433297a_750x500.png" width="750" height="500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ec873094-bd8a-47fa-af40-87ed0433297a_750x500.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:500,&quot;width&quot;:750,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!jCOe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec873094-bd8a-47fa-af40-87ed0433297a_750x500.png 424w, https://substackcdn.com/image/fetch/$s_!jCOe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec873094-bd8a-47fa-af40-87ed0433297a_750x500.png 848w, https://substackcdn.com/image/fetch/$s_!jCOe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec873094-bd8a-47fa-af40-87ed0433297a_750x500.png 1272w, https://substackcdn.com/image/fetch/$s_!jCOe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec873094-bd8a-47fa-af40-87ed0433297a_750x500.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>The community points to <strong><a href="https://openjdk.org/projects/detroit/">Project Detroit</a></strong> as the &#8220;eventual successor&#8221; for JIT integration, but Amazon counters that Detroit is <strong>years from production-grade performance and stability</strong>. This isn&#8217;t a &#8220;just migrate&#8221; situation - we&#8217;re talking about live stacks serving real traffic. In a significant move, Amazon has offered to <strong>assume JVMCI maintenance responsibilities</strong> (!) - no small commitment in the OpenJDK world.</p><p>If JVMCI disappears before Detroit matures, organizations running Graal on HotSpot face a choice: GraalVM CE or a compiler stack refactor. Neither is painless.</p><h2><strong>2. Project Valhalla: From Erasure to Specialized Generics</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GvdM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9781558-b268-4f55-8073-aa72ee5ce83e_1488x990.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GvdM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9781558-b268-4f55-8073-aa72ee5ce83e_1488x990.png 424w, https://substackcdn.com/image/fetch/$s_!GvdM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9781558-b268-4f55-8073-aa72ee5ce83e_1488x990.png 848w, https://substackcdn.com/image/fetch/$s_!GvdM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9781558-b268-4f55-8073-aa72ee5ce83e_1488x990.png 1272w, https://substackcdn.com/image/fetch/$s_!GvdM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9781558-b268-4f55-8073-aa72ee5ce83e_1488x990.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GvdM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9781558-b268-4f55-8073-aa72ee5ce83e_1488x990.png" width="1456" height="969" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e9781558-b268-4f55-8073-aa72ee5ce83e_1488x990.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:969,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!GvdM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9781558-b268-4f55-8073-aa72ee5ce83e_1488x990.png 424w, https://substackcdn.com/image/fetch/$s_!GvdM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9781558-b268-4f55-8073-aa72ee5ce83e_1488x990.png 848w, https://substackcdn.com/image/fetch/$s_!GvdM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9781558-b268-4f55-8073-aa72ee5ce83e_1488x990.png 1272w, https://substackcdn.com/image/fetch/$s_!GvdM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9781558-b268-4f55-8073-aa72ee5ce83e_1488x990.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>A deep-dive article appeared on <strong><a href="http://inside.java/">inside.java</a></strong> - <em><strong><a href="https://inside.java/2026/04/19/generics-optimization/">Beyond Erasure: Project Valhalla&#8217;s Path to Specialized Generics</a></strong></em> - and it&#8217;s probably the best explanation to date of where <strong><a href="https://openjdk.org/projects/valhalla/">Project Valhalla</a></strong> (JEP <strong><a href="https://openjdk.org/jeps/401">401</a></strong>/<strong><a href="https://openjdk.org/jeps/402">402</a></strong>) is heading and how it plans to get there.</p><p>I know, I know - &#8220;Valhalla is coming&#8221; is a running gag in JVM circles, right up there with &#8220;year of Linux on the desktop.&#8221; But this article shows we&#8217;re dealing with something far more concrete than another promise.</p><p>The piece starts with the problem we all know: type erasure - the 2004 compromise that gave us generics but no type information at runtime. Today, C2 manages with Class Hierarchy Analysis (CHA) to eliminate redundant checkcast and speculative devirtualization. It works... okay. But it&#8217;s patching, not solving.</p><p>The article details the &#8220;Parametric VM&#8221; architecture - a fundamentally different approach to generics. Instead of erasing type information at compile time and hoping the JIT can recover it, the Parametric VM introduces a runtime &#8220;Specializer&#8221; that generates dedicated class variants for specific memory layouts. Think of it as the JVM creating a purpose-built List implementation specifically for int values - not a generic List&lt;Object&gt; that wraps each int in an Integer box.</p><p>This is what enables &#8220;Universal Generics&#8221;: List&lt;int&gt; bypasses java.lang.Integer boxing entirely. Primitives are stored directly in arrays and object fields, flattened inline alongside regular objects - no object headers per element, no pointer indirection, no chasing references across the heap. Data sits sequentially in memory, which is exactly what modern CPUs want for cache performance. The results described in the article reflect this: <strong>60&#8211;80% memory footprint reduction</strong> and significantly improved L1 cache hit rates. Approaching C++/Rust performance territory while keeping managed runtime safety guarantees. The numbers speak for themselves.</p><p>And lest this sound like just theory and conference talks - <strong><a href="https://github.com/openjdk/jdk/pull/31120">PR #31120</a></strong> has been opened with the JEP 401 implementation (Value Classes and Objects). The scale is impressive: <strong>~3,000 commits, ~2,000 modified classes</strong>.</p><p>Before you start planning a migration, though - Brian Goetz cautions against timeline optimism. Given the mid-June rampdown and the rigorous security reviews required for such a fundamental type system change, <strong>JDK 27 is an unlikely integration target</strong>. But the sheer fact that this RFR exists - at this scale - represents the most significant movement toward flattened memory layouts in Java&#8217;s history. After a decade of waiting, I see light at the end of the tunnel. And this time it doesn&#8217;t look like an oncoming train (heh).</p><h2><strong>3. JDK 27 Early Access</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!c2DZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F386813ec-84c9-44c0-b1d8-a0d43ab5af6b_1488x995.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!c2DZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F386813ec-84c9-44c0-b1d8-a0d43ab5af6b_1488x995.png 424w, https://substackcdn.com/image/fetch/$s_!c2DZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F386813ec-84c9-44c0-b1d8-a0d43ab5af6b_1488x995.png 848w, https://substackcdn.com/image/fetch/$s_!c2DZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F386813ec-84c9-44c0-b1d8-a0d43ab5af6b_1488x995.png 1272w, https://substackcdn.com/image/fetch/$s_!c2DZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F386813ec-84c9-44c0-b1d8-a0d43ab5af6b_1488x995.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!c2DZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F386813ec-84c9-44c0-b1d8-a0d43ab5af6b_1488x995.png" width="1456" height="974" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/386813ec-84c9-44c0-b1d8-a0d43ab5af6b_1488x995.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:974,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!c2DZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F386813ec-84c9-44c0-b1d8-a0d43ab5af6b_1488x995.png 424w, https://substackcdn.com/image/fetch/$s_!c2DZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F386813ec-84c9-44c0-b1d8-a0d43ab5af6b_1488x995.png 848w, https://substackcdn.com/image/fetch/$s_!c2DZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F386813ec-84c9-44c0-b1d8-a0d43ab5af6b_1488x995.png 1272w, https://substackcdn.com/image/fetch/$s_!c2DZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F386813ec-84c9-44c0-b1d8-a0d43ab5af6b_1488x995.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p><strong><a href="https://github.com/openjdk/jdk/releases/tag/jdk-27%2B20">JDK 27 EA</a></strong> is shaping up as a release worth serious attention - especially for production quality-of-life. It&#8217;s not a single-headline release (that&#8217;s still waiting on Valhalla), but the sum of individual JEPs tells a remarkably coherent story of modernizing JVM defaults. Let&#8217;s walk through the highlights, because a lot of detail has landed recently.</p><h3><strong>Memory First: G1 Everywhere + Compact Headers</strong></h3><p><strong><a href="https://openjdk.org/jeps/523">JEP 523: Make G1 the Default Garbage Collector in All Environments</a></strong> retires the &#8220;server-class machine&#8221; heuristic dating back to J2SE 5.0 (yes, 2004 - same era as type erasure, appreciate the poetry). Until now, the JVM on machines with &lt;2 CPUs or &lt;1792MB RAM defaulted to the Serial Collector - which in the era of micro-containers with 512MB RAM limits meant a good chunk of production workloads got a GC never designed for them. G1 is now the default <strong>everywhere</strong>. No more GC log surprises after deploying to Kubernetes with aggressive resource limits.</p><p>In parallel, <strong><a href="https://openjdk.org/jeps/534">JEP 534: Compact Object Headers by Default</a></strong> enables compact object headers by default. Building on <strong><a href="https://openjdk.org/jeps/450">JEP 450: Compact Object Headers (Experimental)</a></strong>, this reduces the standard object header from 12 to 8 bytes on 64-bit architectures by encoding the class pointer into the mark word. Sounds like an implementation detail? Perhaps. But for workloads that create lots of small objects (and which Java workload doesn&#8217;t?) it&#8217;s a <strong>10&#8211;20% heap reduction</strong> and better CPU cache performance - out of the box, no flags needed.</p><p>It&#8217;s fascinating how quickly that one got from the concept to production default.</p><h3><strong>Security: JFR Finally Stops Leaking Your Secrets</strong></h3><p><strong><a href="https://openjdk.org/jeps/536">JEP 536: JFR In-Process Data Redaction</a></strong> brings in-process data redaction to JDK Flight Recorder. And I have to say it bluntly: finally.</p><p>For years, JFR has been an invaluable production profiling tool - low overhead, rich telemetry, no external agent dependencies. But it carried a dirty secret (pun intended): database passwords, API tokens, and auth keys passed via environment variables or system properties ended up in .jfr files as plaintext. Anyone who&#8217;s ever run a security audit at an organization using JFR knows the moment - &#8220;wait, these credentials have been in diagnostic files... for two years... on a shared network drive?&#8221;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uqxc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9e926a4-2c41-4a38-af9a-b9768d574bf6_889x500.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uqxc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9e926a4-2c41-4a38-af9a-b9768d574bf6_889x500.png 424w, https://substackcdn.com/image/fetch/$s_!uqxc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9e926a4-2c41-4a38-af9a-b9768d574bf6_889x500.png 848w, https://substackcdn.com/image/fetch/$s_!uqxc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9e926a4-2c41-4a38-af9a-b9768d574bf6_889x500.png 1272w, https://substackcdn.com/image/fetch/$s_!uqxc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9e926a4-2c41-4a38-af9a-b9768d574bf6_889x500.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uqxc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9e926a4-2c41-4a38-af9a-b9768d574bf6_889x500.png" width="889" height="500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a9e926a4-2c41-4a38-af9a-b9768d574bf6_889x500.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:500,&quot;width&quot;:889,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!uqxc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9e926a4-2c41-4a38-af9a-b9768d574bf6_889x500.png 424w, https://substackcdn.com/image/fetch/$s_!uqxc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9e926a4-2c41-4a38-af9a-b9768d574bf6_889x500.png 848w, https://substackcdn.com/image/fetch/$s_!uqxc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9e926a4-2c41-4a38-af9a-b9768d574bf6_889x500.png 1272w, https://substackcdn.com/image/fetch/$s_!uqxc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9e926a4-2c41-4a38-af9a-b9768d574bf6_889x500.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Dear fellow Europeans - ever had to scrub historical *.jfr logs for GDPR compliance? Happened to me once &#128513;</figcaption></figure></div><p>Redaction now operates at the JVM recording engine level - <strong>before</strong> data hits disk or gets emitted via the JFR Streaming API. Three targeted events: jdk.InitialSystemProperty, jdk.InitialEnvironmentVariable, and jdk.JVMInformation (command-line arguments). The shift from &#8220;redact after the fact&#8221; to &#8220;secure by default at source&#8221; is a major compliance win - especially for GDPR, SOC2, and similar regulations. It eliminates the need for custom sanitization scripts that - in my experience - half of teams forgot to configure on new environments anyway.</p><p>The only minor cost: debugging configuration issues that require seeing full property values gets slightly harder. But that&#8217;s a trade-off most enterprise architects will accept with open arms.</p><h3><strong>Diagnostics: jcmd Learns to Read Core Dumps</strong></h3><p><strong><a href="https://openjdk.org/jeps/528">JEP 528: Post-Mortem Crash Analysis with jcmd</a></strong> extends jcmd with post-mortem analysis - finally letting you run familiar diagnostic commands (Thread.print, <strong><a href="http://vm.info/">VM.info</a></strong>, VM.flags, VM.system_properties) against static core files from HotSpot crashes. Syntax: jcmd &lt;executable&gt; &lt;corefile&gt; &lt;command&gt;.</p><p>For those of you who&#8217;ve never had to reach for jhsdb at 3 AM during a production incident - congratulations, I wish you continued luck. For the rest of us - this bridges the gap between the friendly, well-known jcmd and the more complex, Serviceability Agent&#8211;based jhsdb. Until now, jcmd only worked with live JVM processes (PID or local socket). If the process died and left a core dump, you had to switch to a completely different tool with different syntax, conventions, and mental model. In containerized environments where JVM processes are ephemeral, this is even more painful - by the time you&#8217;d attach jcmd, the container was long recycled by the orchestrator.</p><p>JEP 528 doesn&#8217;t replace jhsdb (still essential for low-level memory inspection) or native debuggers like GDB. But it surfaces the most commonly needed JVM metadata through the standard, familiar interface - a significant convenience for production support and root-cause analysis.</p><h3><strong>macOS/x64 Deprecation: End of an Era</strong></h3><p>Oracle has <strong><a href="https://mail.openjdk.org/archives/list/jdk-dev@openjdk.org/thread/6NQ4ZNXZE3WY7NFJCZJ43GMAU6E2NISD/">officially signaled</a></strong> the end of macOS/x64 port maintenance - deprecation targets JDK 27, with eventual removal to follow. The argument is straightforward: Apple Silicon won, the transition succeeded, and maintaining the legacy Intel port demands full-time dedicated engineering that&#8217;s no longer justifiable.</p><p>Worth emphasizing - Oracle explicitly stated this is <strong>not a part-time job</strong>. It requires dedicated resources for feature parity and platform-specific bug fixing. The bar for a &#8220;credible third-party&#8221; successor is high, and no one has stepped up yet. The community is largely pragmatic about it - some voices suggest aligning JDK&#8217;s support window more closely with Apple&#8217;s own macOS x64 hardware lifecycle, but realistically, JDK 27 will likely be the first release where Intel Macs become legacy tier.</p><p>If you&#8217;re still relying on Intel Mac Pros or x64 macOS CI/CD runners - time to plan the migration. AArch64 macOS or Linux x64 environments are the two obvious paths.</p><h3><strong>Re-previews and Incubations: The Eternal Stabilization</strong></h3><p>Finally - the &#8220;eternal candidates,&#8221; each at a different point on the road to GA, but all sharing the same theme: the API is ready, the integration isn&#8217;t.</p><p><strong>Structured Concurrency</strong> (<strong><a href="https://openjdk.org/jeps/533">JEP 533</a></strong>) enters its seventh(!) preview - easy to lose count since the feature has been evolving since JDK 19 (<strong><a href="https://openjdk.org/jeps/428">JEP 428</a></strong>). The main change this round is an API refinement toward fluent style: StructuredTaskScope.join() and joinUntil(Instant) now return the scope instance, enabling elegant chaining in try-with-resources blocks. Cosmetic? Perhaps. But it signals that core mechanics are settled (the major refactor happened in <strong><a href="https://openjdk.org/jeps/491">JDK 24/JEP 491</a></strong>) and the team is now polishing ergonomics. Seven previews suggest a cautious approach to API stability - which, after experiences with &#8220;premature GA&#8221; features (see: Nashorn), is welcome.</p><p><strong>Vector API</strong> (<strong><a href="https://openjdk.org/jeps/537">JEP 537</a></strong>) hits its... twelfth incubation. Yes, twelfth. The API is effectively frozen - zero breaking changes this iteration - but graduation awaits Valhalla and its value classes with specialized generics. Without those, the Vector API can&#8217;t reach its final, memory-overhead-free form. For those already using SIMD via jdk.incubator.vector in production (with the --add-modules flag): nothing changes, your code will keep working.</p><p><strong>Lazy Constants</strong> (<strong><a href="https://openjdk.org/jeps/531">JEP 531</a></strong>) in its third preview stabilizes a lazy initialization mechanism that lets HotSpot recognize and optimize lazily computed values as aggressively as static final - constant folding, inlining, the full arsenal. For years, developers relied on the &#8220;initialization-on-demand holder idiom&#8221; or volatile double-checked locking; these patterns work for concurrency but remain black boxes to the JIT. JEP 531 offers a declarative alternative that communicates semantics directly to the compiler. Third preview signals stabilization.</p><p>And finally <strong><a href="https://openjdk.org/jeps/538">JEP 538 PEM Encoder/Decoder</a></strong> - native PEM support in the Java Cryptography Architecture, handling PrivateKey, PublicKey, X509Certificate, and X509CRL. The most interesting technical detail: streaming-capable processing for efficient handling of large Certificate Revocation Lists without memory pressure. No more manual Base64, no more depending on Bouncy Castle just to handle RFC 7468.</p><h3><strong>Closing Note: The Lazy Collections Debate (JEP 526)</strong></h3><p>An interesting debate is brewing on <strong><a href="https://mail.openjdk.org/archives/list/amber-dev@openjdk.org/thread/NM6OFA3H3JMGBLA2CGHZL6KGXR67SQNL/">amber-dev</a></strong> around <strong><a href="https://openjdk.org/jeps/526">JEP 526</a></strong> (&#8221;Deferred Immutability&#8221;), worth watching even if it doesn&#8217;t land in JDK 27. The proposal introduces List.ofLazy / Map.ofLazy with mandatory memoization - simplifying immutable collection creation with on-demand computed values, thread-safety guarantees, and &#8220;compute-once&#8221; semantics.</p><p>The community, however, points to a serious limitation: hardcoded memoization prevents these APIs from serving as truly lazy functional views - &#224; la Guava&#8217;s Lists.transform. The core objection? If every value must be memoized, you can&#8217;t handle collections larger than available heap, and simple type conversions (e.g., projecting a List&lt;CharSequence&gt; as List&lt;String&gt;) force unnecessary allocation. The debate centers on whether these methods should be simple convenience utilities for late-initialized data or a broader foundation for memory-efficient data processing. Consensus leans toward a non-caching default - and frankly, I agree.</p><p>----</p><p>PS: And greetings to all those in the KotlinConf. I couldn&#8217;t make it this year. However, my special reporter, Grzegorz Kr&#243;l, will bring you some news from the conference!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Code Remix Summit: Postcard from Miami - JVM Weekly vol. 175]]></title><description><![CDATA[A shorter edition from the other side of the world, because determinism is back in the game.]]></description><link>https://www.jvm-weekly.com/p/code-remix-summit-postcard-from-miami</link><guid isPermaLink="false">https://www.jvm-weekly.com/p/code-remix-summit-postcard-from-miami</guid><dc:creator><![CDATA[Artur Skowronski]]></dc:creator><pubDate>Thu, 14 May 2026 13:02:51 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!UhpU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5574c7-460f-436e-a070-1fb9aeba0ec6_1928x1088.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UhpU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5574c7-460f-436e-a070-1fb9aeba0ec6_1928x1088.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UhpU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5574c7-460f-436e-a070-1fb9aeba0ec6_1928x1088.png 424w, https://substackcdn.com/image/fetch/$s_!UhpU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5574c7-460f-436e-a070-1fb9aeba0ec6_1928x1088.png 848w, https://substackcdn.com/image/fetch/$s_!UhpU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5574c7-460f-436e-a070-1fb9aeba0ec6_1928x1088.png 1272w, https://substackcdn.com/image/fetch/$s_!UhpU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5574c7-460f-436e-a070-1fb9aeba0ec6_1928x1088.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UhpU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5574c7-460f-436e-a070-1fb9aeba0ec6_1928x1088.png" width="1456" height="822" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1a5574c7-460f-436e-a070-1fb9aeba0ec6_1928x1088.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:822,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2265331,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/197600115?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5574c7-460f-436e-a070-1fb9aeba0ec6_1928x1088.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!UhpU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5574c7-460f-436e-a070-1fb9aeba0ec6_1928x1088.png 424w, https://substackcdn.com/image/fetch/$s_!UhpU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5574c7-460f-436e-a070-1fb9aeba0ec6_1928x1088.png 848w, https://substackcdn.com/image/fetch/$s_!UhpU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5574c7-460f-436e-a070-1fb9aeba0ec6_1928x1088.png 1272w, https://substackcdn.com/image/fetch/$s_!UhpU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5574c7-460f-436e-a070-1fb9aeba0ec6_1928x1088.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>This edition will be shorter than usual. I&#8217;ve been travelling a lot, I&#8217;m on a conference tour, and this week I managed to squeeze in the <strong><a href="https://coderemix.ai/schedule">Code Remix Summit</a></strong> organised by Moderne. So instead of the usual news roundup - a postcard from the conference, with short teasers for the talks worth catching up on via the <strong><a href="https://www.youtube.com/playlist?list=PLIasdWXKABOmXSFwB5Kt7O8XtRVKE4-RS">recordings</a></strong> once they&#8217;re up.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CJ6L!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb270ed22-d68b-4633-a62b-23b2d319f093_1344x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CJ6L!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb270ed22-d68b-4633-a62b-23b2d319f093_1344x1000.png 424w, https://substackcdn.com/image/fetch/$s_!CJ6L!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb270ed22-d68b-4633-a62b-23b2d319f093_1344x1000.png 848w, https://substackcdn.com/image/fetch/$s_!CJ6L!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb270ed22-d68b-4633-a62b-23b2d319f093_1344x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!CJ6L!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb270ed22-d68b-4633-a62b-23b2d319f093_1344x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CJ6L!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb270ed22-d68b-4633-a62b-23b2d319f093_1344x1000.png" width="1344" height="1000" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b270ed22-d68b-4633-a62b-23b2d319f093_1344x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1000,&quot;width&quot;:1344,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!CJ6L!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb270ed22-d68b-4633-a62b-23b2d319f093_1344x1000.png 424w, https://substackcdn.com/image/fetch/$s_!CJ6L!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb270ed22-d68b-4633-a62b-23b2d319f093_1344x1000.png 848w, https://substackcdn.com/image/fetch/$s_!CJ6L!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb270ed22-d68b-4633-a62b-23b2d319f093_1344x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!CJ6L!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb270ed22-d68b-4633-a62b-23b2d319f093_1344x1000.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Because it&#8217;s worth saying upfront: I was there on my own dime - well, okay, on <strong><a href="https://www.linkedin.com/article/edit/7460452881494790144/#">VirtusLab</a></strong> dime, on the picture up there I&#8217;m with <strong><a href="https://www.linkedin.com/article/edit/7460452881494790144/#">Tomasz Orzechowski</a></strong>, our COO - without an invitation from <strong><a href="https://www.linkedin.com/article/edit/7460452881494790144/#">Moderne</a></strong> , without a &#8220;write something nice about us&#8221; contract. We were just curious about what was going on. And I have to say, it was worth it. Sincere feedback, not sponsored content.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HpAE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdea352c4-3825-4847-8692-06982f541c38_1280x960.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HpAE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdea352c4-3825-4847-8692-06982f541c38_1280x960.jpeg 424w, https://substackcdn.com/image/fetch/$s_!HpAE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdea352c4-3825-4847-8692-06982f541c38_1280x960.jpeg 848w, https://substackcdn.com/image/fetch/$s_!HpAE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdea352c4-3825-4847-8692-06982f541c38_1280x960.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!HpAE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdea352c4-3825-4847-8692-06982f541c38_1280x960.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HpAE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdea352c4-3825-4847-8692-06982f541c38_1280x960.jpeg" width="1280" height="960" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dea352c4-3825-4847-8692-06982f541c38_1280x960.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:960,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!HpAE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdea352c4-3825-4847-8692-06982f541c38_1280x960.jpeg 424w, https://substackcdn.com/image/fetch/$s_!HpAE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdea352c4-3825-4847-8692-06982f541c38_1280x960.jpeg 848w, https://substackcdn.com/image/fetch/$s_!HpAE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdea352c4-3825-4847-8692-06982f541c38_1280x960.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!HpAE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdea352c4-3825-4847-8692-06982f541c38_1280x960.jpeg 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong><a href="https://www.linkedin.com/article/edit/7460452881494790144/#">Code Remix Summit</a></strong> was <strong>very focused</strong> - and that&#8217;s a big plus for me. The whole conference revolves around one theme: scaling code changes. OpenRewrite, automated migrations, agentic refactoring, tooling for agents. No blockchain, no microservices-vs-monolith panels. Each talk connects to the previous one, in the hallways you bump into people who actually understand your problems with a 4-million-line codebase, and after you come home you have a coherent map instead of a random bag of ideas. In a world of &#8220;a bit of everything&#8221; conferences (which I do enjoy, by the way) - this kind of change of pace makes a difference.</p><p>OK, let&#8217;s get to it. I&#8217;m going in order, so if any of the talks catches your eye, you&#8217;ll easily find it on the playlist once it shows up (if I understand correctly how this will work).</p><h3><strong>1. &#8220;Making Changes at Scale&#8221; - Morgan Stanley</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PD6E!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F216e2333-b548-4ea1-bbe8-614c5c170255_744x325.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PD6E!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F216e2333-b548-4ea1-bbe8-614c5c170255_744x325.png 424w, https://substackcdn.com/image/fetch/$s_!PD6E!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F216e2333-b548-4ea1-bbe8-614c5c170255_744x325.png 848w, https://substackcdn.com/image/fetch/$s_!PD6E!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F216e2333-b548-4ea1-bbe8-614c5c170255_744x325.png 1272w, https://substackcdn.com/image/fetch/$s_!PD6E!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F216e2333-b548-4ea1-bbe8-614c5c170255_744x325.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PD6E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F216e2333-b548-4ea1-bbe8-614c5c170255_744x325.png" width="744" height="325" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/216e2333-b548-4ea1-bbe8-614c5c170255_744x325.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:325,&quot;width&quot;:744,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!PD6E!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F216e2333-b548-4ea1-bbe8-614c5c170255_744x325.png 424w, https://substackcdn.com/image/fetch/$s_!PD6E!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F216e2333-b548-4ea1-bbe8-614c5c170255_744x325.png 848w, https://substackcdn.com/image/fetch/$s_!PD6E!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F216e2333-b548-4ea1-bbe8-614c5c170255_744x325.png 1272w, https://substackcdn.com/image/fetch/$s_!PD6E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F216e2333-b548-4ea1-bbe8-614c5c170255_744x325.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>The opening of the conference. <strong><a href="https://www.linkedin.com/article/edit/7460452881494790144/#">Dov B. Katz</a></strong> and <strong><a href="https://www.linkedin.com/article/edit/7460452881494790144/#">Khalid Elsawaf</a></strong> from Morgan Stanley - a year of experience with OpenRewrite and Moderne in production. Very often, keynotes at conferences like these are dull. Either they go full &#8220;transformation, future, paradigm shift&#8221;, or they dive into a granular demo that no one has the head for in the morning. I especially liked quote, that this is a first time work in Software Engineering (Code Review) shifts right. Thant&#8217;s very interesting insight.</p><p>This one hit exactly the middle - lots of concrete ideas, zero pretending they&#8217;ve already solved everything - and a fair bit of riffing on the now-popular &#8220;code is cheap, software engineering is still expensive&#8221;. A perfect rhythm for the opening.</p><p><strong><a href="https://nfjs-slides.s3.us-east-2.amazonaws.com/slides/2026/khalid_elsawaf/297925_Morgan%20Stanley%20-%20Making%20Changes%20at%20Scale%20-%20Large%20Scale%20Roll%20Out%20of%20OpenRewrite%20and%20Moderne%20One%20Year%20Later.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Date=20260513T222122Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=259200&amp;X-Amz-Credential=AKIAUWBVM35YRO7WMCVA%2F20260513%2Fus-east-2%2Fs3%2Faws4_request&amp;X-Amz-Signature=c46a768b12d87c02a93f3fba50a7f5fbe26ab006f56aae7b5b04079d7abd151d">Slides</a></strong></p><h3><strong>2. &#8220;Diff Risk Score: AI-Driven Risk-Aware Software Development&#8221; - Meta</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZQHr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1cdd856-0573-403d-b335-d84f21809fdc_739x400.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZQHr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1cdd856-0573-403d-b335-d84f21809fdc_739x400.png 424w, https://substackcdn.com/image/fetch/$s_!ZQHr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1cdd856-0573-403d-b335-d84f21809fdc_739x400.png 848w, https://substackcdn.com/image/fetch/$s_!ZQHr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1cdd856-0573-403d-b335-d84f21809fdc_739x400.png 1272w, https://substackcdn.com/image/fetch/$s_!ZQHr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1cdd856-0573-403d-b335-d84f21809fdc_739x400.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZQHr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1cdd856-0573-403d-b335-d84f21809fdc_739x400.png" width="739" height="400" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a1cdd856-0573-403d-b335-d84f21809fdc_739x400.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:400,&quot;width&quot;:739,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!ZQHr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1cdd856-0573-403d-b335-d84f21809fdc_739x400.png 424w, https://substackcdn.com/image/fetch/$s_!ZQHr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1cdd856-0573-403d-b335-d84f21809fdc_739x400.png 848w, https://substackcdn.com/image/fetch/$s_!ZQHr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1cdd856-0573-403d-b335-d84f21809fdc_739x400.png 1272w, https://substackcdn.com/image/fetch/$s_!ZQHr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1cdd856-0573-403d-b335-d84f21809fdc_739x400.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong><a href="https://www.linkedin.com/article/edit/7460452881494790144/#">Rui Maranhao Abreu</a></strong> talked about Meta&#8217;s DRS - a model that predicts whether a given diff is likely to cause a customer-facing incident. Meta has wired this signal into the entire SDLC: from review, through testing, all the way to automated rollback plans.</p><p>What sold me the most was the part on Centrality - a graph of how a change ripples through the rest of the codebase, used as a model feature. Once again you can see that graphs are increasingly the core of developer tooling.</p><p>Bonus insight: figuring out which signal actually predicts risk - versus which one just looks pretty on a slide - is genuinely interesting work.</p><h3><strong>3. &#8220;Feature Flags: How to Ship Faster, Safer, and Smarter&#8221; - Wells Fargo</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!L9EB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a98ced5-7980-4664-b12c-e7278b01968c_1429x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!L9EB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a98ced5-7980-4664-b12c-e7278b01968c_1429x1000.png 424w, https://substackcdn.com/image/fetch/$s_!L9EB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a98ced5-7980-4664-b12c-e7278b01968c_1429x1000.png 848w, https://substackcdn.com/image/fetch/$s_!L9EB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a98ced5-7980-4664-b12c-e7278b01968c_1429x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!L9EB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a98ced5-7980-4664-b12c-e7278b01968c_1429x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!L9EB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a98ced5-7980-4664-b12c-e7278b01968c_1429x1000.png" width="1429" height="1000" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1a98ced5-7980-4664-b12c-e7278b01968c_1429x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1000,&quot;width&quot;:1429,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!L9EB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a98ced5-7980-4664-b12c-e7278b01968c_1429x1000.png 424w, https://substackcdn.com/image/fetch/$s_!L9EB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a98ced5-7980-4664-b12c-e7278b01968c_1429x1000.png 848w, https://substackcdn.com/image/fetch/$s_!L9EB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a98ced5-7980-4664-b12c-e7278b01968c_1429x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!L9EB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a98ced5-7980-4664-b12c-e7278b01968c_1429x1000.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong><a href="https://www.linkedin.com/article/edit/7460452881494790144/#">Dinesh Arora</a></strong> session was a bit more basic. What feature flags are, FF4J/Togglz in the demo, best practices. After the Meta and Morgan Stanley sessions - it&#8217;s a step down in complexity. But it was still interesting to hear what deployment challenges are showing up in banking. Wells Fargo has its own, very specific risk landscape, and that perspective made for a nice counterpoint.</p><p><strong><a href="https://nfjs-slides.s3.us-east-2.amazonaws.com/slides/2026/dinesh_arora/297939_final-ppt-dinesh-remix-final-1.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Date=20260513T222948Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=259199&amp;X-Amz-Credential=AKIAUWBVM35YRO7WMCVA%2F20260513%2Fus-east-2%2Fs3%2Faws4_request&amp;X-Amz-Signature=a951c370bf37e96575aed46677154dc030e2a6608ffdfe1ba21a869acf2bf7ef">Slides</a></strong></p><h3><strong>4. &#8220;How Uber Migrated 75K JUnit4 Test Classes to JUnit5 Using OpenRewrite&#8221; - Uber</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZzxC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1181fdba-0ad9-4f00-9515-cbed51171449_744x370.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZzxC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1181fdba-0ad9-4f00-9515-cbed51171449_744x370.png 424w, https://substackcdn.com/image/fetch/$s_!ZzxC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1181fdba-0ad9-4f00-9515-cbed51171449_744x370.png 848w, https://substackcdn.com/image/fetch/$s_!ZzxC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1181fdba-0ad9-4f00-9515-cbed51171449_744x370.png 1272w, https://substackcdn.com/image/fetch/$s_!ZzxC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1181fdba-0ad9-4f00-9515-cbed51171449_744x370.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZzxC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1181fdba-0ad9-4f00-9515-cbed51171449_744x370.png" width="744" height="370" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1181fdba-0ad9-4f00-9515-cbed51171449_744x370.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:370,&quot;width&quot;:744,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!ZzxC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1181fdba-0ad9-4f00-9515-cbed51171449_744x370.png 424w, https://substackcdn.com/image/fetch/$s_!ZzxC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1181fdba-0ad9-4f00-9515-cbed51171449_744x370.png 848w, https://substackcdn.com/image/fetch/$s_!ZzxC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1181fdba-0ad9-4f00-9515-cbed51171449_744x370.png 1272w, https://substackcdn.com/image/fetch/$s_!ZzxC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1181fdba-0ad9-4f00-9515-cbed51171449_744x370.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong><a href="https://www.linkedin.com/article/edit/7460452881494790144/#">Anshuman Mishra</a></strong> and <strong><a href="https://www.linkedin.com/article/edit/7460452881494790144/#">Kaushik Vejju</a></strong> - one of those sessions you go to conferences for if you&#8217;re into large-scale transformations. End-to-end, top-to-bottom migration: 75 thousand test classes, 400 thousand tests, 15M+ lines of code, 1.5M modified. Customisations for Uber&#8217;s monorepo, validation, rollout safety, CI integration. No magic, with concrete numbers. Anyone who&#8217;s ever tried something like that in their own organisation knows what I&#8217;m talking about.</p><p>Definitely worth at least <strong><a href="https://nfjs-slides.s3.us-east-2.amazonaws.com/slides/2026/kaushik_vejju/297945_CodeRemixUberJUnitPresentation%20%282%29.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Date=20260513T223143Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=259199&amp;X-Amz-Credential=AKIAUWBVM35YRO7WMCVA%2F20260513%2Fus-east-2%2Fs3%2Faws4_request&amp;X-Amz-Signature=0ec2c8849bba368b65e7e5fe92ac4548c3db4e247c5de74ad092c516a9e10c83">flipping through the slides</a></strong>.</p><h3><strong>5. &#8220;Agentic Coding at Airbnb&#8221; - Airbnb</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Jmr9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faec7349c-61e3-465a-b768-25add71e5e4b_744x360.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Jmr9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faec7349c-61e3-465a-b768-25add71e5e4b_744x360.png 424w, https://substackcdn.com/image/fetch/$s_!Jmr9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faec7349c-61e3-465a-b768-25add71e5e4b_744x360.png 848w, https://substackcdn.com/image/fetch/$s_!Jmr9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faec7349c-61e3-465a-b768-25add71e5e4b_744x360.png 1272w, https://substackcdn.com/image/fetch/$s_!Jmr9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faec7349c-61e3-465a-b768-25add71e5e4b_744x360.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Jmr9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faec7349c-61e3-465a-b768-25add71e5e4b_744x360.png" width="744" height="360" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aec7349c-61e3-465a-b768-25add71e5e4b_744x360.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:360,&quot;width&quot;:744,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Jmr9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faec7349c-61e3-465a-b768-25add71e5e4b_744x360.png 424w, https://substackcdn.com/image/fetch/$s_!Jmr9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faec7349c-61e3-465a-b768-25add71e5e4b_744x360.png 848w, https://substackcdn.com/image/fetch/$s_!Jmr9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faec7349c-61e3-465a-b768-25add71e5e4b_744x360.png 1272w, https://substackcdn.com/image/fetch/$s_!Jmr9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faec7349c-61e3-465a-b768-25add71e5e4b_744x360.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong><a href="https://www.linkedin.com/article/edit/7460452881494790144/#">Szczepan Faber</a></strong> - yes, the Mockito creator, currently Engineering Leadership at Airbnb - on how they brought agentic coding into a monorepo with tens of millions of lines of code. Applications that have to be secure and compliant. Trade-offs, learnings, productivity impact. A very pragmatic approach to most of the problems - some things they have solved, some are still open, and they say so openly. A general overview of &#8220;how it&#8217;s done at Airbnb&#8221;. Refreshing.</p><p><strong><a href="https://nfjs-slides.s3.us-east-2.amazonaws.com/slides/2026/szczepan_faber/297947_Agentic%20Coding%20at%20Airbnb%20Code%20Remix.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Date=20260513T223212Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=259199&amp;X-Amz-Credential=AKIAUWBVM35YRO7WMCVA%2F20260513%2Fus-east-2%2Fs3%2Faws4_request&amp;X-Amz-Signature=5c88f57ce69dcbab091b4ab7a9e49a3ccd8fd9115c747a513b0d907ea2327f82">Slides</a></strong></p><h3><strong>6. &#8220;Shepherd: How We Handle Uber-Scale Migrations at Uber&#8221; - Uber</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uN9X!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F155222dd-15b0-4d86-8578-8b16e9e577f9_2554x1324.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uN9X!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F155222dd-15b0-4d86-8578-8b16e9e577f9_2554x1324.png 424w, https://substackcdn.com/image/fetch/$s_!uN9X!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F155222dd-15b0-4d86-8578-8b16e9e577f9_2554x1324.png 848w, https://substackcdn.com/image/fetch/$s_!uN9X!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F155222dd-15b0-4d86-8578-8b16e9e577f9_2554x1324.png 1272w, https://substackcdn.com/image/fetch/$s_!uN9X!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F155222dd-15b0-4d86-8578-8b16e9e577f9_2554x1324.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uN9X!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F155222dd-15b0-4d86-8578-8b16e9e577f9_2554x1324.png" width="1456" height="755" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/155222dd-15b0-4d86-8578-8b16e9e577f9_2554x1324.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:755,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!uN9X!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F155222dd-15b0-4d86-8578-8b16e9e577f9_2554x1324.png 424w, https://substackcdn.com/image/fetch/$s_!uN9X!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F155222dd-15b0-4d86-8578-8b16e9e577f9_2554x1324.png 848w, https://substackcdn.com/image/fetch/$s_!uN9X!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F155222dd-15b0-4d86-8578-8b16e9e577f9_2554x1324.png 1272w, https://substackcdn.com/image/fetch/$s_!uN9X!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F155222dd-15b0-4d86-8578-8b16e9e577f9_2554x1324.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>The gem of the conference.<strong> <a href="https://www.linkedin.com/article/edit/7460452881494790144/#">Anshuman Chadha</a></strong> and <strong><a href="https://www.linkedin.com/article/edit/7460452881494790144/#">Sung Yoon Whang</a></strong> showed off Shepherd - Uber&#8217;s migration platform. 4.3M lines of code reworked, 30,000+ diffs across five monorepos, migrations going from &#8220;quarters of manual coordination&#8221; to &#8220;weeks with observability&#8221;. Deterministic compiler-aware transformations + AI-assisted remediation + ownership-aware routing + integrated validation.</p><p>I walked out of the session and immediately started looking for Shepherd-like solutions in the open source world - and I didn&#8217;t find any. This is exactly the level of abstraction where tools are missing today.</p><p>If you&#8217;ve got tokens to burn, you know what to do with them.</p><p><strong><a href="https://nfjs-slides.s3.us-east-2.amazonaws.com/slides/2026/anshuman_chadha/297943_Code%20Remix%20Presentation%20-%20Slides.pptx%20%282%29.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Date=20260513T224833Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=259200&amp;X-Amz-Credential=AKIAUWBVM35YRO7WMCVA%2F20260513%2Fus-east-2%2Fs3%2Faws4_request&amp;X-Amz-Signature=27dbe12b18c638e2f20db55b1c061083c547643954b401c238508cd8dfb52d63">Slides</a></strong></p><h3><strong>7. &#8220;Netflix&#8217;s Journey to Confident Automated Changes&#8221; - Netflix</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VICh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09629a19-59d2-42d4-b1d4-526834f09af3_744x307.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VICh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09629a19-59d2-42d4-b1d4-526834f09af3_744x307.png 424w, https://substackcdn.com/image/fetch/$s_!VICh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09629a19-59d2-42d4-b1d4-526834f09af3_744x307.png 848w, https://substackcdn.com/image/fetch/$s_!VICh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09629a19-59d2-42d4-b1d4-526834f09af3_744x307.png 1272w, https://substackcdn.com/image/fetch/$s_!VICh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09629a19-59d2-42d4-b1d4-526834f09af3_744x307.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VICh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09629a19-59d2-42d4-b1d4-526834f09af3_744x307.png" width="744" height="307" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/09629a19-59d2-42d4-b1d4-526834f09af3_744x307.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:307,&quot;width&quot;:744,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!VICh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09629a19-59d2-42d4-b1d4-526834f09af3_744x307.png 424w, https://substackcdn.com/image/fetch/$s_!VICh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09629a19-59d2-42d4-b1d4-526834f09af3_744x307.png 848w, https://substackcdn.com/image/fetch/$s_!VICh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09629a19-59d2-42d4-b1d4-526834f09af3_744x307.png 1272w, https://substackcdn.com/image/fetch/$s_!VICh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09629a19-59d2-42d4-b1d4-526834f09af3_744x307.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong><a href="https://www.linkedin.com/article/edit/7460452881494790144/#">Roberto P&#233;rez Alcolea &#127474;&#127485;</a></strong> and <strong><a href="https://www.linkedin.com/article/edit/7460452881494790144/#">Aubrey Chipman</a></strong> (what an energy, loved that!) showed how Netflix built a platform for deploying automated changes across thousands of repositories. The emphasis was on developer trust in automation: shift-left validation, feedback loops, impact analysis.</p><p>A few good ideas - for me mostly the thread around MCP as an interface to all this machinery, and the &#8220;beyond basic&#8221; skill repository.</p><p>Oh, and the <strong><a href="https://nfjs-slides.s3.us-east-2.amazonaws.com/slides/2026/aubrey_chipman/297927_2026%20Code%20Remix%20Presentation%20-%20Netflix%3Fs%20Journey%20to%20Confident%20Automated%20Changes.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Date=20260513T225011Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=259200&amp;X-Amz-Credential=AKIAUWBVM35YRO7WMCVA%2F20260513%2Fus-east-2%2Fs3%2Faws4_request&amp;X-Amz-Signature=2e38e6f0f740756f16e620b4e8482c44af3b3aa37f2cfcc8042c5919bd9944e1">slides were just fantastic design-wise</a></strong>, straight out of Wynwood Walls.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Pz5l!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76810685-dc2b-4bc1-8ae4-15e806ab6d04_1440x900.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Pz5l!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76810685-dc2b-4bc1-8ae4-15e806ab6d04_1440x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Pz5l!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76810685-dc2b-4bc1-8ae4-15e806ab6d04_1440x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Pz5l!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76810685-dc2b-4bc1-8ae4-15e806ab6d04_1440x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Pz5l!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76810685-dc2b-4bc1-8ae4-15e806ab6d04_1440x900.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Pz5l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76810685-dc2b-4bc1-8ae4-15e806ab6d04_1440x900.jpeg" width="1440" height="900" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/76810685-dc2b-4bc1-8ae4-15e806ab6d04_1440x900.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:900,&quot;width&quot;:1440,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Pz5l!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76810685-dc2b-4bc1-8ae4-15e806ab6d04_1440x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Pz5l!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76810685-dc2b-4bc1-8ae4-15e806ab6d04_1440x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Pz5l!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76810685-dc2b-4bc1-8ae4-15e806ab6d04_1440x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Pz5l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76810685-dc2b-4bc1-8ae4-15e806ab6d04_1440x900.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3><strong>8. &#8220;Upgrade Your Java with AI: From Legacy Code to High-Performance Workloads&#8221; - AWS</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DR0U!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F712c43d7-5236-4b27-b4e5-ebc8c1397f15_1488x832.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DR0U!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F712c43d7-5236-4b27-b4e5-ebc8c1397f15_1488x832.png 424w, https://substackcdn.com/image/fetch/$s_!DR0U!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F712c43d7-5236-4b27-b4e5-ebc8c1397f15_1488x832.png 848w, https://substackcdn.com/image/fetch/$s_!DR0U!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F712c43d7-5236-4b27-b4e5-ebc8c1397f15_1488x832.png 1272w, https://substackcdn.com/image/fetch/$s_!DR0U!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F712c43d7-5236-4b27-b4e5-ebc8c1397f15_1488x832.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DR0U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F712c43d7-5236-4b27-b4e5-ebc8c1397f15_1488x832.png" width="1456" height="814" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/712c43d7-5236-4b27-b4e5-ebc8c1397f15_1488x832.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:814,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!DR0U!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F712c43d7-5236-4b27-b4e5-ebc8c1397f15_1488x832.png 424w, https://substackcdn.com/image/fetch/$s_!DR0U!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F712c43d7-5236-4b27-b4e5-ebc8c1397f15_1488x832.png 848w, https://substackcdn.com/image/fetch/$s_!DR0U!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F712c43d7-5236-4b27-b4e5-ebc8c1397f15_1488x832.png 1272w, https://substackcdn.com/image/fetch/$s_!DR0U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F712c43d7-5236-4b27-b4e5-ebc8c1397f15_1488x832.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Closing out my list.<strong> <a href="https://www.linkedin.com/article/edit/7460452881494790144/#">Vinicius Senger</a></strong> and <strong><a href="https://www.linkedin.com/article/edit/7460452881494790144/#">Jonathan Vogel</a></strong> (both Senior Developer Advocates at AWS) - tying AI-assisted refactoring of legacy Java together with runtime analysis (Java Flight Recorder), a workflow built on top of Embabel agents. So not just &#8220;AI changes the code&#8221;, but also &#8220;AI checks whether the changed code actually runs faster in production&#8221;.</p><p>That missing loop - modernisation &#8594; measurable performance - is what a lot of tools still don&#8217;t have. Nice to see someone trying to close it. There&#8217;s a practical implementation - <strong><a href="https://github.com/embabel/modernizer">embabel/modernizer</a></strong> - to clone and play with on your own.</p><p>On top of that, if you remember Jonathan&#8217;s pieces from my &#8220;Rest of the Story&#8221; editions, here you could see the results of the research in practice... with a few extra goodies ready for part three &#128513;</p><div><hr></div><h3><strong>Now a word about Moderne itself</strong></h3><p>After three days of listening to how Meta, Uber, Netflix, Morgan Stanley and Airbnb are putting OpenRewrite to work on production migrations, one common thread emerges. And this, in my view, is Moderne&#8217;s most important ideological move.</p><p>In a world where everything is heading toward the probabilistic - LLMs, agents, &#8220;maybe it&#8217;ll work, maybe not, but give it a shot&#8221; - Moderne is going against the grain. <strong>Deterministic, compiler-aware code transformations as the foundation. AI as a remedial layer where determinism ends. Not the other way around.</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OiTD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe02e4843-d31d-4c51-9336-6440fb5232e5_940x1500.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OiTD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe02e4843-d31d-4c51-9336-6440fb5232e5_940x1500.png 424w, https://substackcdn.com/image/fetch/$s_!OiTD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe02e4843-d31d-4c51-9336-6440fb5232e5_940x1500.png 848w, https://substackcdn.com/image/fetch/$s_!OiTD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe02e4843-d31d-4c51-9336-6440fb5232e5_940x1500.png 1272w, https://substackcdn.com/image/fetch/$s_!OiTD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe02e4843-d31d-4c51-9336-6440fb5232e5_940x1500.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OiTD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe02e4843-d31d-4c51-9336-6440fb5232e5_940x1500.png" width="940" height="1500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e02e4843-d31d-4c51-9336-6440fb5232e5_940x1500.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1500,&quot;width&quot;:940,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!OiTD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe02e4843-d31d-4c51-9336-6440fb5232e5_940x1500.png 424w, https://substackcdn.com/image/fetch/$s_!OiTD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe02e4843-d31d-4c51-9336-6440fb5232e5_940x1500.png 848w, https://substackcdn.com/image/fetch/$s_!OiTD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe02e4843-d31d-4c51-9336-6440fb5232e5_940x1500.png 1272w, https://substackcdn.com/image/fetch/$s_!OiTD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe02e4843-d31d-4c51-9336-6440fb5232e5_940x1500.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>And that is a hugely healthy distribution of responsibility. If you know that a given refactor will <em>always</em> produce the same result on 4.3M lines of code - you can run it overnight without staring at the terminal. If you know an agent has bad days - you don&#8217;t want it deciding whether @RunWith gets swapped for @ExtendWith. Each of these talks - Meta with DRS, Uber with Shepherd, Netflix with their observability - was effectively about finding that boundary. Where does the deterministic part of the migration end, and where does &#8220;this is where the LLM has to step in&#8221; begin.</p><p>And this isn&#8217;t an idea that belongs to Moderne alone. Google has <strong><a href="https://abseil.io/resources/swe-book/html/ch22.html">their Rosie</a></strong> - described in detail in <em>Software Engineering at Google</em>, and in the original Potvin/Levenberg CACM paper about the monorepo. Uber has Shepherd in a company-specific variant - the same piece from Anshuman Chadha&#8217;s talk, the same one they used to drive the JUnit 4 &#8594; 5 migration (orchestrating diffs across thousands of Bazel targets). Sourcegraph has been growing <strong><a href="https://sourcegraph.com/batch-changes">their Batch Changes</a></strong> since 2021, with changelog updates still going strong in April 2026.</p><p>And I have to admit - one of the bigger lessons from this trip was realising <strong>how much of this is out there in the industry</strong>. Listening to one talk after another, you can see that practically every organisation above a certain scale threshold has built its own variant of a large-scale-changes orchestrator. Most of them don&#8217;t have the motivation to talk about it publicly. And that&#8217;s exactly why a conference like Code Remix makes a difference - it&#8217;s one of the few moments in the year when these internal tools come out into the light.</p><p>The organisational problem of scaling changes can&#8217;t be solved with LLMs alone. LLMs are great at writing code. They&#8217;re poor at predictably repeating the same change 30,000 times in a row and reporting what went wrong.</p><p>Moderne is turning this into a product for the whole industry. Take <strong><a href="https://docs.moderne.io/user-documentation/agent-tools/prethink/">Prethink</a></strong> - the concept is charmingly simple: instead of letting Claude search the codebase using tokens at runtime (expensive, slow, non-deterministic), you precompute a map of the system first. A set of OpenRewrite recipes generates data tables from the LST, the full dependency tree including transitive ones, an optional knowledge graph, plus architecture diagrams in <strong><a href="https://calm.finos.org/">FINOS CALM</a></strong> and Mermaid format. The result lands in <strong><a href="http://claude.md/">CLAUDE.md</a></strong> and associated files - and the agent has it at hand before it even starts writing.</p><p>The open-source component lives under <strong><a href="https://github.com/openrewrite/rewrite-prethink">openrewrite/rewrite-prethink</a></strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!i62E!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc81013ad-edb6-45f5-8a55-cc1ff8755459_1488x858.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!i62E!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc81013ad-edb6-45f5-8a55-cc1ff8755459_1488x858.png 424w, https://substackcdn.com/image/fetch/$s_!i62E!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc81013ad-edb6-45f5-8a55-cc1ff8755459_1488x858.png 848w, https://substackcdn.com/image/fetch/$s_!i62E!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc81013ad-edb6-45f5-8a55-cc1ff8755459_1488x858.png 1272w, https://substackcdn.com/image/fetch/$s_!i62E!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc81013ad-edb6-45f5-8a55-cc1ff8755459_1488x858.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!i62E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc81013ad-edb6-45f5-8a55-cc1ff8755459_1488x858.png" width="1456" height="840" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c81013ad-edb6-45f5-8a55-cc1ff8755459_1488x858.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:840,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!i62E!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc81013ad-edb6-45f5-8a55-cc1ff8755459_1488x858.png 424w, https://substackcdn.com/image/fetch/$s_!i62E!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc81013ad-edb6-45f5-8a55-cc1ff8755459_1488x858.png 848w, https://substackcdn.com/image/fetch/$s_!i62E!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc81013ad-edb6-45f5-8a55-cc1ff8755459_1488x858.png 1272w, https://substackcdn.com/image/fetch/$s_!i62E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc81013ad-edb6-45f5-8a55-cc1ff8755459_1488x858.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>A small detail that closed the loop for me after I got back: CALM - that format Prethink uses for architecture diagrams - was <strong><a href="https://devops.com/morgan-stanley-open-sources-calm-the-architecture-as-code-solution-transforming-enterprise-devops/">open-sourced by Morgan Stanley in August 2025</a></strong>. The same firm that opened Code Remix with a talk about its year with OpenRewrite. The whole ecosystem is growing together, and you can see it.</p><p>Moderne&#8217;s cleanest framing goes like this: <strong>we&#8217;re shifting work from GPU inference to CPU precomputation</strong>. Cheap, deterministic calculation in the background. Expensive, probabilistic decisions in the foreground. And Prethink is the tangible form of that idea - something you can pull from GitHub and run today.</p><p>There&#8217;s also the community angle. Because just like with <strong><a href="https://www.jobrunr.io/">JobRunr</a></strong> - it&#8217;s really nice to see another generation of products growing out of Java open source. <strong><a href="https://www.linkedin.com/article/edit/7460452881494790144/#">JobRunr</a></strong> grew from a library into a solid platform with a commercial variant. OpenRewrite grew from a little refactoring library into Moderne - a whole infrastructure for agents, an agent-tools company, as they now call themselves. This is exactly what the JVM ecosystem needs. Good patterns.</p><p><strong>Cheers, Moderne team. <a href="https://www.linkedin.com/article/edit/7460452881494790144/#">Jonathan Schneider</a></strong> <strong><a href="https://www.linkedin.com/article/edit/7460452881494790144/#">Rooz Mohazzabi</a></strong> <strong><a href="https://www.linkedin.com/article/edit/7460452881494790144/#">Paula Paul</a></strong> <strong><a href="https://www.linkedin.com/article/edit/7460452881494790144/#">Tim te Beek</a></strong> <strong><a href="https://www.linkedin.com/article/edit/7460452881494790144/#">Matt Finkelstein</a></strong> <strong><a href="https://www.linkedin.com/article/edit/7460452881494790144/#">Robert Sobieski</a></strong> (Poland strong!) <strong><a href="https://www.linkedin.com/article/edit/7460452881494790144/#">Jaida Olvera Alters</a></strong> <strong><a href="https://www.linkedin.com/article/edit/7460452881494790144/#">Antony Austin</a></strong> <strong><a href="https://www.linkedin.com/article/edit/7460452881494790144/#">Jente Sondervorst</a></strong> and all the rest - it was a great job &#128522;</p><p>Also, I loved the dog - it was charming.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qpTC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0142323f-d11f-41ca-9feb-aedd1d6c4345_2534x1246.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qpTC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0142323f-d11f-41ca-9feb-aedd1d6c4345_2534x1246.png 424w, https://substackcdn.com/image/fetch/$s_!qpTC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0142323f-d11f-41ca-9feb-aedd1d6c4345_2534x1246.png 848w, https://substackcdn.com/image/fetch/$s_!qpTC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0142323f-d11f-41ca-9feb-aedd1d6c4345_2534x1246.png 1272w, https://substackcdn.com/image/fetch/$s_!qpTC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0142323f-d11f-41ca-9feb-aedd1d6c4345_2534x1246.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qpTC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0142323f-d11f-41ca-9feb-aedd1d6c4345_2534x1246.png" width="1456" height="716" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0142323f-d11f-41ca-9feb-aedd1d6c4345_2534x1246.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:716,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!qpTC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0142323f-d11f-41ca-9feb-aedd1d6c4345_2534x1246.png 424w, https://substackcdn.com/image/fetch/$s_!qpTC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0142323f-d11f-41ca-9feb-aedd1d6c4345_2534x1246.png 848w, https://substackcdn.com/image/fetch/$s_!qpTC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0142323f-d11f-41ca-9feb-aedd1d6c4345_2534x1246.png 1272w, https://substackcdn.com/image/fetch/$s_!qpTC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0142323f-d11f-41ca-9feb-aedd1d6c4345_2534x1246.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>PS: I still remember the party at Devoxx Belgium 2024, BTW &#128522;</p><p>Whether you use OpenRewrite or not - &#8220;what&#8217;s deterministic and what&#8217;s probabilistic in my pipeline&#8221; is the question every mature developer platform will be asking itself in 2026.</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!humD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f42b9ba-923c-4e5f-b5d2-260026855a50_1017x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!humD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f42b9ba-923c-4e5f-b5d2-260026855a50_1017x1000.png 424w, https://substackcdn.com/image/fetch/$s_!humD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f42b9ba-923c-4e5f-b5d2-260026855a50_1017x1000.png 848w, https://substackcdn.com/image/fetch/$s_!humD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f42b9ba-923c-4e5f-b5d2-260026855a50_1017x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!humD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f42b9ba-923c-4e5f-b5d2-260026855a50_1017x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!humD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f42b9ba-923c-4e5f-b5d2-260026855a50_1017x1000.png" width="1017" height="1000" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8f42b9ba-923c-4e5f-b5d2-260026855a50_1017x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1000,&quot;width&quot;:1017,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!humD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f42b9ba-923c-4e5f-b5d2-260026855a50_1017x1000.png 424w, https://substackcdn.com/image/fetch/$s_!humD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f42b9ba-923c-4e5f-b5d2-260026855a50_1017x1000.png 848w, https://substackcdn.com/image/fetch/$s_!humD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f42b9ba-923c-4e5f-b5d2-260026855a50_1017x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!humD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f42b9ba-923c-4e5f-b5d2-260026855a50_1017x1000.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong>-PS:</strong> A really nice moment - completely by chance I bumped into <strong><a href="https://www.linkedin.com/article/edit/7460452881494790144/#">Jonathan Vogel</a></strong> in person (yes, the one from the AWS talk), who you may know from recent <em>Rest of the Story</em> editions. The internet is a weird place, but conferences still make a difference.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_1cG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f71274a-e0e6-4279-afa1-64603bd8f727_1488x841.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_1cG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f71274a-e0e6-4279-afa1-64603bd8f727_1488x841.png 424w, https://substackcdn.com/image/fetch/$s_!_1cG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f71274a-e0e6-4279-afa1-64603bd8f727_1488x841.png 848w, https://substackcdn.com/image/fetch/$s_!_1cG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f71274a-e0e6-4279-afa1-64603bd8f727_1488x841.png 1272w, https://substackcdn.com/image/fetch/$s_!_1cG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f71274a-e0e6-4279-afa1-64603bd8f727_1488x841.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_1cG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f71274a-e0e6-4279-afa1-64603bd8f727_1488x841.png" width="1456" height="823" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2f71274a-e0e6-4279-afa1-64603bd8f727_1488x841.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:823,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!_1cG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f71274a-e0e6-4279-afa1-64603bd8f727_1488x841.png 424w, https://substackcdn.com/image/fetch/$s_!_1cG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f71274a-e0e6-4279-afa1-64603bd8f727_1488x841.png 848w, https://substackcdn.com/image/fetch/$s_!_1cG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f71274a-e0e6-4279-afa1-64603bd8f727_1488x841.png 1272w, https://substackcdn.com/image/fetch/$s_!_1cG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f71274a-e0e6-4279-afa1-64603bd8f727_1488x841.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong>PS2:</strong> Tomorrow we&#8217;ll see each other at <strong><a href="https://www.linkedin.com/article/edit/7460452881494790144/#">geecon</a></strong> in Krak&#243;w. I have a talk there about agentic architectures based on my Kotlin NES emulator that plays Final Fantasy I. Drop by - let&#8217;s chat in person.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!twPZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5136753d-be36-4880-b353-91b8ab78ca67_1333x1000.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!twPZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5136753d-be36-4880-b353-91b8ab78ca67_1333x1000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!twPZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5136753d-be36-4880-b353-91b8ab78ca67_1333x1000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!twPZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5136753d-be36-4880-b353-91b8ab78ca67_1333x1000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!twPZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5136753d-be36-4880-b353-91b8ab78ca67_1333x1000.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!twPZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5136753d-be36-4880-b353-91b8ab78ca67_1333x1000.jpeg" width="1333" height="1000" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5136753d-be36-4880-b353-91b8ab78ca67_1333x1000.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1000,&quot;width&quot;:1333,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!twPZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5136753d-be36-4880-b353-91b8ab78ca67_1333x1000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!twPZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5136753d-be36-4880-b353-91b8ab78ca67_1333x1000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!twPZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5136753d-be36-4880-b353-91b8ab78ca67_1333x1000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!twPZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5136753d-be36-4880-b353-91b8ab78ca67_1333x1000.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong>PS3:</strong> From the JVM Weekly in Strange Places series: Miami Airport.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Thread-Safe Native Memory in Java: VarHandle Access Modes Explained with David Vlijmincx - JVM Weekly vol. 174]]></title><description><![CDATA[This month: VarHandle access modes for the FFM API, six years of Foojay, OpenJDK distribution shopping, Azul Zulu joining Docker Official Images, Spring I/O 2026 field notes.]]></description><link>https://www.jvm-weekly.com/p/thread-safe-native-memory-in-java</link><guid isPermaLink="false">https://www.jvm-weekly.com/p/thread-safe-native-memory-in-java</guid><dc:creator><![CDATA[Artur Skowronski]]></dc:creator><pubDate>Thu, 07 May 2026 13:03:17 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-0cJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd01ebac3-174d-47af-989d-364ff488134c_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-0cJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd01ebac3-174d-47af-989d-364ff488134c_1456x1048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-0cJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd01ebac3-174d-47af-989d-364ff488134c_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!-0cJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd01ebac3-174d-47af-989d-364ff488134c_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!-0cJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd01ebac3-174d-47af-989d-364ff488134c_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!-0cJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd01ebac3-174d-47af-989d-364ff488134c_1456x1048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-0cJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd01ebac3-174d-47af-989d-364ff488134c_1456x1048.png" width="1456" height="1048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d01ebac3-174d-47af-989d-364ff488134c_1456x1048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1048,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1695777,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/196628845?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd01ebac3-174d-47af-989d-364ff488134c_1456x1048.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-0cJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd01ebac3-174d-47af-989d-364ff488134c_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!-0cJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd01ebac3-174d-47af-989d-364ff488134c_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!-0cJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd01ebac3-174d-47af-989d-364ff488134c_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!-0cJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd01ebac3-174d-47af-989d-364ff488134c_1456x1048.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>As a hub for the &#8220;Friends of OpenJDK,&#8221; <strong><a href="http://foojay.io/">Foojay.io</a></strong> continues to be one of the better places to track what is actually happening in the JVM ecosystem month-to-month. And this month I want to start with a piece that has been sitting on my &#8220;must cover&#8221; list since it landed.</p><p>This month&#8217;s main feature comes from <strong><a href="https://www.linkedin.com/in/david-vlijmincx/">David Vlijmincx</a></strong>, Senior Java Developer and Oracle Ace, who has been quietly writing one of the more useful FFM API series I&#8217;ve come across. His <strong><a href="https://foojay.io/today/java-native-memory-allocation-ffm-api/">earlier piece on Arenas, malloc, and custom pools</a></strong> covered the spectrum from Arena.ofConfined() (safe, scoped, easy) to raw malloc/free via FFM (you&#8217;re basically writing C now). What that piece didn&#8217;t tackle is what happens the moment you create a MemorySegment that more than one thread can see - which is exactly what the next installment goes after.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>I want to focus on this one because it tackles the problem most FFM tutorials handwave: ARM and x86 do not behave the same way under contention, and your code is going to ship to both. Let&#8217;s dig in.</p><div><hr></div><h2><strong>Thread-Safe Native Memory in Java: VarHandle Access Modes Explained</strong></h2><h3><strong>What is Memory Order and Why Does It Matter for Native Memory?</strong></h3><p>The Foreign Function and Memory (FFM) API is Java&#8217;s way of interacting with native code and memory. In the previous post, you learned how to do so using Java&#8217;s built-in <code>Arena</code> types. The Arena provides temporal safety and bounds checks, but what about thread safety? MemorySegments created by <code>.ofShared()</code>, <code>.auto()</code>, and <code>.global()</code> can be used by multiple threads at the same time. Using a VarHandle with just get/set can backfire if you don&#8217;t use something like locking. The downside is that locks are slow and heavy. So let us take a look at a more granular, hardware-aware approach: using VarHandle access modes.</p><h3><strong>Why do you need all of this?</strong></h3><p>When you write concurrent code, you rely on the hardware to keep things in sync. Different CPU architectures handle memory ordering differently. On x86, the memory model is relatively strong. Reads and writes are mostly kept in order, meaning you can often get away with loose synchronization. ARM, however, has a weak memory model. The CPU is free to reorder reads and writes aggressively to optimize performance. If you write code assuming x86&#8217;s strict ordering and run it on an ARM processor (like Apple Silicon or AWS Graviton), your application will break in unpredictable ways. VarHandle has methods that help with these situations to make sure your code works everywhere.</p><p>To see exactly how these mechanics work, we will start with the least restrictive access mode and build our way up to a full memory fence. But before we do that, I want to show you how to actually test this.</p><h3><strong>Testing it using JCStress</strong></h3><p><strong><a href="https://github.com/openjdk/jcstress">Java Concurrency Stress</a></strong> is an experimental harness that helps you test the correctness of your concurrent code. It does this by running your test concurrently, accessing the same shared state. During execution, it collects the results of the observed state. The goal is to see how your code got rearranged and/or optimized and how it affected the state. One of the ways it does this is by running each thread using a different compilation mode like: interpreter, C1, or C2. JCStress tests each combination of compilation modes (interpreter, C1, C2) across the actors. With two actors, that&#8217;s nine combinations per run.</p><p>Creating these tests requires a bit of a different mindset. Normally, you want two threads to play nicely. Inside the JCStress test you want them to clash as often as possible to observe the possible states your code could end up in. This gets kind of confusing, so let&#8217;s use this example and let&#8217;s say you have two threads running the following code:</p><pre><code><code>synchronized (lock) {
// What you want to test
}</code></code></pre><p>If you used this with JCStress the threads would basically run synchronized one after the other. Of course, it&#8217;ll work, but it doesn&#8217;t prove anything. So in the examples to come, keep in mind that we want the threads interleaving with each other and just hammer the state to see what happens. Just as it would in the real world. Another tip for when using JCStress is to not test too much inside a single test. You get a big state with lots of possibilities. To keep the tests fast and snappy, focus the test to tackle one synchronization/thread interleaving problem.</p><p>So what does the output look like? Like this:</p><pre><code><code>RESULT SAMPLES FREQ EXPECT DESCRIPTION

-1 104,287,516 37.93% Acceptable Ready flag not seen yet.
0 1,364 &lt;0.01% Interesting Visibility failure: saw ready flag but missed the data.
42 170,677,819 62.07% Acceptable Data seen correctly.</code></code></pre><p>It shows the sampling results and how often they were encountered. The developer sets the expectations and descriptions, so they depend on the case.</p><h3><strong>Plain Access (Get/Set)</strong></h3><p>Plain access is the simplest mode there is. No rules or any fence! This works like any other get/set/read/assignment that you are used to in Java like <code>var x = 1</code> for example. Get/Set work the same way for MemorySegments, it simply sets and gets a value. This is perfectly fine if you are working inside a single thread and don&#8217;t share your state with other threads. In this mode the compilers, CPU, and cache are allowed to optimize your code and reorder the instructions. As long as the end result looks like it executed your code as you wrote it. This illusion is true as long as you don&#8217;t create race conditions using multiple threads. So what does this look like? Let&#8217;s break this illusion with two threads and JCStress. The next example, has a shared MemorySegment that is used to communicate a ready flag and some data. One thread set the data, and the other thread reads the result.</p><pre><code><code>@JCStressTest
@Outcome(id = "42", expect = Expect.ACCEPTABLE, desc = "Data seen correctly.")
@Outcome(id = "-1", expect = Expect.ACCEPTABLE, desc = "Ready flag not seen yet.")
@Outcome(id = "0", expect = Expect.ACCEPTABLE_INTERESTING, desc = "Saw ready flag but missed the data.")
@State
public class NativeMemoryPlainAccess {

    private final MemorySegment segment;
    private static final VarHandle VH_INT = ValueLayout.JAVA_INT.varHandle();

    public NativeMemoryPlainAccess() {
        this.segment = Arena.ofAuto().allocate(8);
    }

    @Actor
    public void actor1() {
        VH_INT.set(segment, 0L, 42);
        VH_INT.set(segment, 4L, 1);
    }

    @Actor
    public void actor2(I_Result r) {
        int ready = (int) VH_INT.get(segment, 4L);
        if (ready == 1) {
            r.r1 = (int) VH_INT.get(segment, 0L);
        } else {
            r.r1 = -1;
        }
    }
}</code></code></pre><p>These threads are passing a message, one thread sets some data, and the other thread reads it. There is no synchronization or fence inside this example, so everything is free to be reordered. This is going to introduce race conditions. This table shows all the different states observed while running the code:</p><pre><code><code>RESULT SAMPLES FREQ EXPECT DESCRIPTION

-1 104,287,516 37.93% Acceptable Ready flag not seen yet.

0 1,364 &lt;0.01% Interesting Visibility failure: saw ready flag but missed the data.

42 170,677,819 62.07% Acceptable Data seen correctly.</code></code></pre><p>JCStress ran the code using different combinations of compilers (interpreter, C1, C2), and as you can see we got three different combinations. Some of the time the ready flag was set, and it got the value <code>42</code>, other times the flag wasn&#8217;t set. Both of these are correct states. But <code>0</code> is an interesting state... It means that the flag was set, but the data wasn&#8217;t there yet. The code got reordered! This is not a correct state to be in as 0 shouldn&#8217;t be possible, right? To fix this issue, we need Acquire/Release, but let&#8217;s look at <code>Opaque</code> first as it is the next mode in the hierarchy.</p><h3><strong>Opaque Access</strong></h3><p>Opaque is the odd one out. Opaque doesn&#8217;t insert memory fences and provides no ordering guarantees between different variables. What it does provide is: bitwise atomicity (no word tearing), coherence (all threads see writes to the same variable in the same order), and progress (writes will eventually become visible). It also prevents the compiler from eliminating access to that specific variable. This is handy for liveness checks, for example. Let&#8217;s say you have two threads. thread_1 runs a while loop until it gets the signal to stop. Thread_0 is in control of this signal. Without Opaque, the compiler is allowed to turn that loop into a while(true), Thread_1 would never stop. JCStress is not really made for this specific scenario, so let&#8217;s look at another example instead. In the example, Thread_1 will write <code>1</code> and <code>2</code> to the same place in the <code>MemorySegment</code>. Thread_2 does two reads to see the intermediate/end results. Again, the goal is to make the threads clash as often as possible.</p><pre><code><code>@JCStressTest
@Outcome(id = "1, 2", expect = Expect.ACCEPTABLE_INTERESTING, desc = "Observed intermediate state reliably.")
@Outcome(expect = Expect.ACCEPTABLE, desc = "Other observable states (0,0 / 2,2 / 0,2).")
@State
public class OpaqueNativeOpaqueAccess {

    private final MemorySegment segment;
    private static final VarHandle VH_INT = ValueLayout.JAVA_INT.varHandle();

    public OpaqueNativeOpaqueAccess() {
        this.segment = Arena.ofAuto().allocate(4);
    }

    @Actor
    public void actor1() {
        VH_INT.setOpaque(segment, 0L, 1);
        VH_INT.setOpaque(segment, 0L, 2);
    }

    @Actor
    public void actor2(II_Result r) {
        r.r1 = (int) VH_INT.getOpaque(segment, 0L);
        r.r2 = (int) VH_INT.getOpaque(segment, 0L);
    }
}</code></code></pre><p>The results show that even though Opaque prevents extreme compiler optimizations, it does not guarantee immediate visibility across threads. The vast majority of the time, the second actor sees either the initial state (0, 0) or the final state (2, 2). However, we also observe intermediate states like (1, 2) or ordered reads like (0, 2). Because there are no ordering constraints or memory fences, the CPU and caches can still delay when the writes from actor1 become visible to actor2. The presence of (1, 2) confirms that the intermediate write of 1 is occasionally caught in transit.</p><pre><code><code>  --- OPAQUE ACCESS ---
  RESULT      SAMPLES     FREQ       EXPECT  DESCRIPTION
    0, 0  114,615,126   41.45%   Acceptable  Other observable states (0,0 / 2,2 / 0,2).
    0, 1       73,653    0.03%   Acceptable  Other observable states (0,0 / 2,2 / 0,2).
    0, 2      577,951    0.21%   Acceptable  Other observable states (0,0 / 2,2 / 0,2).
    1, 1      283,707    0.10%   Acceptable  Other observable states (0,0 / 2,2 / 0,2).
    1, 2      114,550    0.04%  Interesting  Observed intermediate state reliably.
    2, 2  160,817,232   58.17%   Acceptable  Other observable states (0,0 / 2,2 / 0,2).

    --- PLAIN ACCESS ---
    RESULT      SAMPLES     FREQ       EXPECT  DESCRIPTION
    0, 0  125,004,639   45.55%   Acceptable  Other observable states (0,0 / 2,2 / 0,2).
    0, 1       38,798    0.01%   Acceptable  Other observable states (0,0 / 2,2 / 0,2).
    0, 2      311,919    0.11%   Acceptable  Other observable states (0,0 / 2,2 / 0,2).
    1, 1      362,391    0.13%   Acceptable  Other observable states (0,0 / 2,2 / 0,2).
    1, 2       68,803    0.03%  Interesting  Observed intermediate state.
    2, 2  148,668,149   54.17%   Acceptable  Other observable states (0,0 / 2,2 / 0,2).</code></code></pre><p>When the C2 compiler steps in, it optimizes the code heavily. With Plain access, C2 often optimizes away the intermediate <code>write</code> entirely, assuming it&#8217;s redundant since the final value is 2. This is why you see almost zero (1, 2) results in the Plain Access C2 table. Opaque access, however, explicitly forbids the compiler from removing that intermediate write. Consequently, the C2 table for Opaque still shows a noticeable number of (1, 2) results. The compiler was forced to keep both writes, and the hardware&#8217;s lack of fencing allowed the intermediate state to be observed.</p><pre><code><code>  --- OPAQUE ACCESS  C2 ---
  RESULT     SAMPLES     FREQ       EXPECT  DESCRIPTION
    0, 0   9,721,273   34.26%   Acceptable  Other observable states (0,0 / 2,2 / 0,2).
    0, 1         677   &lt;0.01%   Acceptable  Other observable states (0,0 / 2,2 / 0,2).
    0, 2      32,666    0.12%   Acceptable  Other observable states (0,0 / 2,2 / 0,2).
    1, 1      17,747    0.06%   Acceptable  Other observable states (0,0 / 2,2 / 0,2).
    1, 2         561   &lt;0.01%  Interesting  Observed intermediate state reliably.
    2, 2  18,600,087   65.56%   Acceptable  Other observable states (0,0 / 2,2 / 0,2).

    --- PLAIN ACCESS C2 ---
   RESULT     SAMPLES     FREQ       EXPECT  DESCRIPTION
    0, 0  14,047,744   50.31%   Acceptable  Other observable states (0,0 / 2,2 / 0,2).
    0, 1           2   &lt;0.01%   Acceptable  Other observable states (0,0 / 2,2 / 0,2).
    0, 2         106   &lt;0.01%   Acceptable  Other observable states (0,0 / 2,2 / 0,2).
    1, 1           1   &lt;0.01%   Acceptable  Other observable states (0,0 / 2,2 / 0,2).
    1, 2           4   &lt;0.01%  Interesting  Observed intermediate state.
    2, 2  13,874,594   49.69%   Acceptable  Other observable states (0,0 / 2,2 / 0,2).</code></code></pre><p>So in the end, Opaque is the combination of:</p><ul><li><p>Plain access: the get and set from the section above.</p></li><li><p>Access atomicity: Reads and writes happen as a single, indivisible unit. No word tearing, even for 64-bit types like <code>long</code> and <code>double</code>.</p></li><li><p>Coherence: writes to the same variable are observed in the same order for all observers.</p></li><li><p>Progress: The writes will be eventually visible.</p></li></ul><p>Opaque is useful in specific scenarios but too weak for most concurrent patterns. One example that would be a good fit is a variable that you want to broadcast to other reader(s). A counter that is owned by one thread and collected by other threads would be an example of this.</p><p>Let&#8217;s go one level deeper and see what happens when you add causality to the mix.</p><h3><strong>Acquire/Release</strong></h3><p>Acquire and Release offer a stricter mode than Opaque by including all of Opaque&#8217;s guarantees and adding a happens-before relationship. This means it is stricter than Opaque, but still lighter than volatile. Release and Acquire are two separate methods:</p><ul><li><p><strong>setRelease()</strong>: The compiler/CPU is not allowed to move a read or write instruction that happens before the Release to happen after it.</p></li><li><p><strong>getAcquire()</strong>: All reads and writes after this point are guaranteed to see at least the data that was visible at the point of the corresponding setRelease(). The compiler/CPU is not allowed to move an instruction that happens after the Acquire to before it.</p></li></ul><p>Let&#8217;s see how these rules play out in the real world. In the following code actor1 sets three values to a MemorySegment. The <code>setRelease</code> is used to set a flag that the data is ready to be read. Actor2 watches the flag for a change. When it reads a <code>1</code>, it fetches the data from the segment.</p><pre><code><code>@JCStressTest
@State
public class HappensBeforeAndAfter {

    private final MemorySegment segment;
    private static final VarHandle VH_INT = ValueLayout.JAVA_INT.varHandle();

    public HappensBeforeAndAfter() {
        this.segment = Arena.ofAuto().allocate(64);
    }

    @Actor
    public void actor1() {
        VH_INT.set(segment, 0L, 1); // Plain writes &#8212; made visible by the setRelease below
        VH_INT.set(segment, 0L, 2);
        VH_INT.set(segment, 0L, 3);
        VH_INT.setRelease(segment, 12L, 1);
    }

    @Actor
    public void actor2(I_Result r) {
        int ready = (int) VH_INT.getAcquire(segment, 12L);
        if (ready == 1) {
            r.r1 = (int) VH_INT.get(segment, 0L);
        } else {
            r.r1 = -1;
        }
    }
}</code></code></pre><p>When running this code with JCStress, I got the following results. Both results are valid <code>-1</code> just means that the flag wasn&#8217;t set yet and there was no attempt to read the data. And <code>3</code> means that the data from the last write was read.</p><pre><code><code>  RESULT      SAMPLES     FREQ
      -1  167,565,777   62.57%
       3  100,243,162   37.43%</code></code></pre><p>Doing the same with just a plain set/get will result in the compiler and CPU reordering the code as there is no happens-before anymore. The result of running it with plain access is like this:</p><pre><code><code>  RESULT      SAMPLES     FREQ
      -1  174,727,852   64.82%
       0        3,906   &lt;0.01%
       1           75   &lt;0.01%
       2           94   &lt;0.01%
       3   94,828,052   35.18%</code></code></pre><p>This isn&#8217;t pretty when we want to only read the data only when it is actually available. The values 0, 1, and 2 mean the ready flag appeared set before the data was actually written. This shows that Release/Acquire excels in cases like producer-consumer designs, message-passing designs.</p><h3><strong>Volatile</strong></h3><p>This is the last and strictest mode, designed to enforce sequential consistency and a total order of operations across all threads. When you use volatile, it prevents aggressive instruction reorderings. Such as a newer read bypassing an older write. Or by ensuring that prior volatile stores are drained from the hardware&#8217;s store buffer to the coherent cache before processing new loads. While it doesn&#8217;t freeze the CPU to provide instant, wall-clock visibility, it guarantees that all cores will eventually agree on the exact same sequence of events. Because every read will observe the most recently written value within that agreed-upon memory order, volatile is the safest and most reliable mode for synchronizing state across multiple variables.</p><pre><code><code>@JCStressTest
@Outcome(id = "0, 0", expect = Expect.FORBIDDEN, desc = "Read visibility failure")
@Outcome(id = "1, 1", expect = Expect.ACCEPTABLE, desc = "Data seen correctly.")
@Outcome(id = "1, 0", expect = Expect.ACCEPTABLE_INTERESTING, desc = "One actor got shuffled")
@Outcome(id = "0, 1", expect = Expect.ACCEPTABLE_INTERESTING, desc = "One actor got shuffled")
@State
public class NativeMemoryFullFence {

    public static final GroupLayout LAYOUT = MemoryLayout.structLayout(
            ValueLayout.JAVA_INT.withName("x"),
            ValueLayout.JAVA_INT.withName("y")
    );
    private static final VarHandle VH_X = LAYOUT.varHandle(groupElement("x"));
    private static final VarHandle VH_Y = LAYOUT.varHandle(groupElement("y"));

    private final MemorySegment segment;

    public NativeMemoryFullFence() {
        this.segment = Arena.ofAuto().allocate(LAYOUT);
        VH_X.set(segment, 0L, 0);
        VH_Y.set(segment, 0L, 0);
    }

    @Actor
    public void actor1(II_Result r) {
        VH_X.setVolatile(segment, 0L, 1);           // Store X
         r.r1 = (int) VH_Y.getVolatile(segment, 0L); // Load Y
    }

    @Actor
    public void actor2(II_Result r) {
        VH_Y.setVolatile(segment, 0L, 1);           // Store Y
        r.r2 = (int) VH_X.getVolatile(segment, 0L); // Load X
    }

}</code></code></pre><p>The two actors are reading and writing to two different places inside the memorySegment. By using volatile, the <code>write</code> is guaranteed to be fully visible to all threads before any subsequent operation in this thread proceeds. This is slower but guarantees all threads agree on the order of operations.</p><pre><code><code>  RESULT      SAMPLES     FREQ       EXPECT  DESCRIPTION
    0, 0            0    0.00%    Forbidden  Read visibility failure
    0, 1  142,965,429   53.47%  Interesting  One actor got shuffled
    1, 0  123,397,941   46.15%  Interesting  One actor got shuffled
    1, 1      995,009    0.37%   Acceptable  Data seen correctly.</code></code></pre><p>If a weaker model like Release/Acquire is used, the CPU does not wait for the prior write to be drained to the coherent cache before executing the next read to a different address. You fire the write action and continue directly with the next read. Because each CPU is its own environment with its own physical clock, they have no clue how time is progressing on other cores. This lack of a total order means you can end up with a cycle in your memory order, observing the forbidden 0, 0 state when synchronizing across two or more variables, as shown here:</p><pre><code><code>  RESULT      SAMPLES     FREQ       EXPECT  DESCRIPTION
    0, 0      205,803    0.08%    Forbidden  Read visibility failure
    0, 1  123,619,023   47.36%  Interesting  One actor got shuffled
    1, 0  136,207,596   52.18%  Interesting  One actor got shuffled
    1, 1      977,157    0.37%   Acceptable  Data seen correctly.</code></code></pre><p>Release/Acquire is fine when you have a single variable that you care about, but when you need to synchronize across two or more variables, it fails and you need the stronger volatile mode.</p><h3><strong>TL;DR</strong></h3><p>Just use Get/Set and Volatile and have a peaceful life. If that&#8217;s really not enough, and you <em>really</em> need this fine-grained control. Maybe consider still using get/set and volatile. If I really can&#8217;t convince you, then the other modes are great for those special cases where volatile causes too much of a performance issue.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-ZVF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9e87448-264a-4e69-97f3-8349a477f6db_2156x930.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-ZVF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9e87448-264a-4e69-97f3-8349a477f6db_2156x930.png 424w, https://substackcdn.com/image/fetch/$s_!-ZVF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9e87448-264a-4e69-97f3-8349a477f6db_2156x930.png 848w, https://substackcdn.com/image/fetch/$s_!-ZVF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9e87448-264a-4e69-97f3-8349a477f6db_2156x930.png 1272w, https://substackcdn.com/image/fetch/$s_!-ZVF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9e87448-264a-4e69-97f3-8349a477f6db_2156x930.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-ZVF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9e87448-264a-4e69-97f3-8349a477f6db_2156x930.png" width="1456" height="628" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e9e87448-264a-4e69-97f3-8349a477f6db_2156x930.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:628,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!-ZVF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9e87448-264a-4e69-97f3-8349a477f6db_2156x930.png 424w, https://substackcdn.com/image/fetch/$s_!-ZVF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9e87448-264a-4e69-97f3-8349a477f6db_2156x930.png 848w, https://substackcdn.com/image/fetch/$s_!-ZVF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9e87448-264a-4e69-97f3-8349a477f6db_2156x930.png 1272w, https://substackcdn.com/image/fetch/$s_!-ZVF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9e87448-264a-4e69-97f3-8349a477f6db_2156x930.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3><strong>Conclusion</strong></h3><p>Working with native memory across multiple threads forces you to confront how hardware actually executes your code. While the FFM API provides a direct bridge to native memory, it doesn&#8217;t shield you from CPU reordering or cache visibility issues. Plain access is perfectly fine for single-threaded tasks, but once you share memory segments, you need to apply the right VarHandle access modes. Volatile is the safest default, providing strict ordering at the cost of performance. If profiling indicates volatile is a bottleneck, you can step down to Acquire/Release or Opaque, but you take on the responsibility of managing the memory order yourself. Always test concurrent memory access thoroughly, as architectural differences between x86 and ARM will easily expose any flaws in your assumptions.</p><h3><strong>Bonus: Word Tearing</strong></h3><p>Word tearing occurs when a read or write operation on a piece of memory is not atomic. If you write a 64-bit value to unaligned memory, or on a 32-bit system, the CPU might execute it as two separate 32-bit operations. If another thread reads that memory in between those two operations, it will get half of the old value and half of the new value. Using <code>Opaque</code> would prevent this from happening. For demonstration purposes let&#8217;s look at an example using unaligned memory access.</p><pre><code><code>@JCStressTest
@Outcome(id = "0, 0", expect = Expect.ACCEPTABLE)
@Outcome(id = "0, 9223372036854775806", expect = Expect.ACCEPTABLE)
@Outcome(id = "0, 9223372036854775807", expect = Expect.ACCEPTABLE)
@Outcome(id = "9223372036854775806, 9223372036854775806", expect = Expect.ACCEPTABLE)
@Outcome(id = "9223372036854775806, 9223372036854775807", expect = Expect.ACCEPTABLE)
@Outcome(id = "9223372036854775807, 9223372036854775807", expect = Expect.ACCEPTABLE)
@Outcome(expect = Expect.ACCEPTABLE_INTERESTING)
@State
public class WordTearingWithPlain {

    private final MemorySegment segment;
    private static final VarHandle VH_LONG = JAVA_LONG.withByteAlignment(1).varHandle();

    public WordTearingWithPlain() {
        this.segment = Arena.ofAuto().allocate(JAVA_LONG.byteSize() * 2,1);
    }

    @Actor
    public void actor1() {
        VH_LONG.set(segment, 4L, Long.MAX_VALUE - 1);
        VH_LONG.set(segment, 4L, Long.MAX_VALUE);
    }

    @Actor
    public void actor2(LL_Result r) {
        r.r1 = (long) VH_LONG.get(segment, 4L);
        r.r2 = (long) VH_LONG.get(segment, 4L);
    }
}</code></code></pre><p>The results explicitly show word tearing in action. Value 4294967294 is not the initial <code>0</code> or the intended <code>Long.MAX_VALUE</code> or <code>Long.MAX_VALUE - 1</code>. Because the MemorySegment was accessed with an unaligned layout (1-byte alignment for an 8-byte long), the JVM and CPU could not write the 64-bit <code>long</code> in a single, atomic hardware instruction. Instead, it was split. Actor2 managed to read the memory exactly when only half of the new value had been written, resulting in a corrupted, blended value. This highlights why alignment and proper access modes are necessary when managing memory manually.</p><pre><code><code>                                    RESULT      SAMPLES     FREQ       EXPECT
                                      0, 0   24,373,979    9.07%   Acceptable
                             0, 4294967294            2   &lt;0.01%  Interesting
                    0, 9223372036854775806       38,613    0.01%   Acceptable
                    0, 9223372036854775807      726,094    0.27%   Acceptable
                    4294967294, 4294967294            2   &lt;0.01%  Interesting
           4294967294, 9223372036854775806            1   &lt;0.01%  Interesting
  9223372036854775806, 9223372036854775806       21,715   &lt;0.01%   Acceptable
  9223372036854775806, 9223372036854775807      145,851    0.05%   Acceptable
  9223372036854775807, 9223372036854775807  243,455,002   90.58%   Acceptable</code></code></pre><div><hr></div><h2><strong>Also on Foojay This Month</strong></h2><div id="youtube2-no5HAfb4De0" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;no5HAfb4De0&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/no5HAfb4De0?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Foojay Podcast #94: More Than a Blog</strong></h3><p>Foojay turned six this month, and <strong><a href="https://www.linkedin.com/in/frankdelporte/">Frank Delporte</a></strong> (Java Champion at Azul) marked it the way Frank tends to mark things - by heading to JCON Cologne with a microphone and not leaving until he had talked to twelve community members about what Foojay means to them. The result is the <strong><a href="https://foojay.io/today/foojay-podcast-94-more-than-a-blog-how-foojay-connects-sustains-and-evolves-the-java-community/">Foojay Podcast #94</a></strong>.</p><p>The thesis is right there in the title - <strong>&#8220;more than a blog&#8221;</strong> - and the episode lays out the case. Six years in, Foojay is also a Mastodon server, a Slack community, the Disco API behind SDKMAN and Gradle, a book on sustainability, this podcast, and (as of recently) an education catalog. The twelve guests are the receipts: <strong><a href="https://www.linkedin.com/in/sharatchander?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAAAkGOwBEza5JNeYVOURkex9cEG9BSVN2JQ">Sharat Chander, MBA</a></strong> on 25 years of Java community history, <strong><a href="https://www.linkedin.com/in/markuswestergren?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAAB0_r4BI8vwYvLUlLfRQZ26CVmsua-TWek">Markus Westergren</a></strong> and <strong><a href="https://www.linkedin.com/in/iryna-dohndorf?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAADEFx2wBY_7hv-cE09Q-kQ5bkK4sVGTDKtc">Iryna Dohndorf</a></strong> on developer sustainability in the AI era, <strong><a href="https://www.linkedin.com/in/reneschwietzke?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAAAkt4EBLjvlieahCIQ71oSJM72tIF3OPqA">Ren&#233; Schwietzke</a></strong> on JIT and the 1B row challenge in pure safe Java, <strong><a href="https://www.linkedin.com/in/gerritgrunwald?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAAFk3CwBdHiCw6H4ymoKhE3qje6--AreOQU">Gerrit Grunwald</a></strong> on the Disco API, <strong><a href="https://www.linkedin.com/in/cat-edelveis?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAEqcQv8BdZYWumxqeDXMylxmmDtRqGv4yqA">Catherine Edelveis</a></strong> on container-size economics, <strong><a href="https://www.linkedin.com/in/jagod?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAAnJG2IBBgNQUGiDoQgDCzh02wLDU96OyB0">&#9881;&#65039;Jago de Vreede</a></strong> on a JavaFX UI for SDKMAN, <strong><a href="https://www.linkedin.com/in/anneloredev?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAACxEVRQB-7RuSx3JV-di7X_EZm7ussHw_bc">Annelore Egger</a></strong> on mentoring future conference speakers, <strong><a href="https://www.linkedin.com/in/buhake-sindi?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAAEOjDABYa_ed961t3ysak0QMTNEml_TlJ8">Buhake Sindi</a></strong> on Jakarta EE meets LangChain4J, <strong><a href="https://www.linkedin.com/in/fran%C3%A7oismartin?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAACM_RdcBwYju0btJ46KQv0YMzezeJ6xIyQw">Fran&#231;ois Martin</a></strong> on flaky tests, <strong><a href="https://www.linkedin.com/in/dominikatasarz?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAAS5ZfQBk9nPrpQCNqiSLBcOywEwl7I0JkU">Dominika Tasarz</a></strong> (Frank&#8217;s new Foojay colleague) on what&#8217;s next - and <strong><a href="https://www.linkedin.com/in/geertjanwielenga?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAABHatIBijDUBa0SEWMbxu3DZNMN5rOJKBM">Geertjan Wielenga</a></strong> , who started the whole thing six years ago, joining remotely from under a lighthouse in Ireland. A sentence I never expected to write. Solid hour, useful chapter timestamps if you want to skip around.</p><div><hr></div><h3><strong><a href="https://foojay.io/today/which-java-runtime-should-you-use-in-production-comparing-openjdk-distributions/">Which Java Runtime Should You Use in Production?</a></strong></h3><p><strong><a href="https://www.linkedin.com/in/cat-edelveis?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAEqcQv8BdZYWumxqeDXMylxmmDtRqGv4yqA">Catherine Edelveis</a></strong> (Developer Advocate at <strong><a href="https://www.linkedin.com/company/bell-sw/">BellSoft</a></strong> ) wrote a <strong><a href="https://foojay.io/today/which-java-runtime-should-you-use-in-production-comparing-openjdk-distributions/">comparison of eight major OpenJDK distributions</a></strong> - Temurin, Liberica, Zulu, Corretto, Semeru, Red Hat, SapMachine, Microsoft. She is up-front that she works for one of the vendors and Liberica gets a favorable description, but the framing of the article is genuinely useful: the binaries are essentially the same (all start from the same OpenJDK source), and what you are actually picking is <strong>support ownership and vendor accountability</strong>.</p><p>The interesting bits: SapMachine and Microsoft both occasionally include patches that have not been backported upstream - fine while you&#8217;re on those distributions, an interesting compatibility story the day you migrate off them. For teams without strong platform alignment (no AWS lock-in, no RHEL subscription, no SAP estate), Catherine lands on a clean framing: BellSoft and Azul stand apart because Java is their actual product, not one item in a broader portfolio. That shows up in support window length, legacy version coverage (both still offer commercial support for Java 6 and 7), and toolchain depth. Pair this with the Docker Official Images piece below.</p><div><hr></div><h3><strong><a href="https://foojay.io/today/the-road-to-docker-official-images-for-java-the-azul-zulu-story/">The Road to Docker Official Images for Java: The Azul Zulu Story</a></strong></h3><p>After more than two years of back-and-forth (the original PR was opened in January 2024, finally merged on March 17, 2026), Azul Zulu builds are now <strong><a href="https://foojay.io/today/the-road-to-docker-official-images-for-java-the-azul-zulu-story/">Docker Official Images</a></strong>. <strong><a href="https://www.linkedin.com/in/frankdelporte?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAAAkoP8BgaEo6gq3fwZtzrC-kGrvT-2-3WE">Frank Delporte</a></strong> walks through what it actually took to get there - and the process is the interesting part, not the brand.</p><p>What I&#8217;d flag: the separation between &#8220;vendor provides Dockerfile + validation&#8221; and &#8220;Docker builds the image on their infrastructure&#8221; is what makes the program trustworthy. Even Azul has to file a PR and wait for Docker&#8217;s review and rebuild process before anything lands on Docker Hub - they cannot ship images directly. The other commitment Azul had to make was supporting <strong>all Java versions, not just LTS</strong> - because many developers test against upcoming versions and prepare codebases before the next LTS lands. From now on you can FROM azul-zulu instead of FROM azul/zulu-openjdk. The pre-existing azul/zulu-openjdk images are scheduled for deprecation later in 2026, so factor that into your migration calendar.</p><div><hr></div><h3><strong><a href="https://foojay.io/today/spring-i-o-2026-field-notes-from-barcelona/">Spring I/O 2026: Field Notes from Barcelona</a></strong></h3><p><strong><a href="https://www.linkedin.com/in/noregressions?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAAJBNtsBlM3m9tMj3z0s_nbYr_k754Czfpo">Steve Poole</a></strong> summarized Spring I/O 2026 in <strong><a href="https://foojay.io/today/spring-i-o-2026-field-notes-from-barcelona/">one sentence</a></strong>: &#8220;It was a Spring AI conference with a Spring Boot conference attached.&#8221; About one in three main-stage sessions over the two-day programme covered Spring AI, the MCP protocol, agents, or LLM-based application development. Josh Long opened Day 2 with <em>Bootiful Spring Boot 4</em>. By midday the auditorium had moved on to <em>The Spring AI Ecosystem in 2026: From Foundations to Agents</em>.</p><p>The data point Steve flags that I keep thinking about: Rod Johnson - Spring&#8217;s original creator - is currently touring with the same talk in two cities in one week, <em>Building Killer AI Agents on Your Spring Stack with Embabel</em>. When someone with that legacy in the Java world picks one topic and runs with it, the choice of topic is itself the headline. Spring is not just a web framework anymore; it is positioning itself as an agent platform, and that transition is going to keep getting louder through the rest of 2026. The classic Java-platform talks still happened - just in side rooms, with smaller crowds, after the main programme ended.</p><div><hr></div><h3><strong><a href="https://foojay.io/today/building-a-personalized-content-delivery-system/">Building a Personalized Content Delivery System</a></strong></h3><p><strong><a href="https://www.linkedin.com/in/farhanhasin?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAABwL8S0BvIL8HU5mJlNZ4rRobhDmuVq5bKM">Farhan Hasin Chowdhury</a></strong> wrote a <strong><a href="https://foojay.io/today/building-a-personalized-content-delivery-system/">thorough walkthrough</a></strong> of building a hybrid recommendation engine with Spring Boot 3.x, Spring Data MongoDB, and Spring AI on Java 21. There&#8217;s a <strong><a href="https://github.com/fhsinchy/indie-game-discovery">companion repo</a></strong>, so it works as a tutorial - but the architectural decisions are the part worth attention.</p><p>Two scoring layers: content-based scoring using Map&lt;String, Double&gt; user preferences and a MongoDB aggregation pipeline ($objectToArray + $setIntersection + $reduce to compute the score server-side), and embedding-based similarity using Spring AI + Atlas Vector Search to catch matches the literal-tag layer misses (a game tagged &#8220;exploration&#8221; can surface for a user who specified &#8220;adventure&#8221;). Both scores normalize to 0-1 and combine with a weighted formula (default 0.6 content + 0.4 similarity). User ratings close the feedback loop with an exponential moving average that keeps weights bounded between 0 and 1 by construction. The article is also a useful reality check on what Spring AI actually does in this kind of system: most of the work is plain MongoDB aggregation, and Spring AI&#8217;s role is the embedding API. That is a sane shape for production.</p><div><hr></div><h3><strong><a href="https://foojay.io/today/introducing-floci-a-high-performance-graalvm-powered-aws-emulator/">Introducing Floci: A High-Performance, GraalVM-Powered AWS Emulator</a></strong></h3><p><strong><a href="https://www.linkedin.com/in/hectorvent?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAABPxwT0BKeRQeE8EsmrsIsGIZ6eMbdiXYvM">Hector Ventura</a></strong> introduced <strong><a href="https://foojay.io/today/introducing-floci-a-high-performance-graalvm-powered-aws-emulator/">Floci</a></strong>, a LocalStack-style AWS emulator built with Quarkus + Vert.x and compiled to a native binary with GraalVM. The numbers: ~24ms startup, ~13 MiB idle memory, ~90 MB image size, 25+ AWS services emulated (S3 with Object Lock, DynamoDB with Streams, SQS Standard/FIFO, Lambda, Step Functions, EventBridge, Cognito, IAM, KMS, more), passing 400+ AWS SDK compatibility tests. MIT-licensed, no auth, no API keys, no telemetry, no accounts.</p><p><em>docker run -p 4566:4566 hectorvent/floci </em>and you&#8217;re going. If you&#8217;ve been spinning up Testcontainers around LocalStack and feeling the warmup tax getting silly, this is a serious alternative to bookmark. Also a nice case study for the broader &#8220;GraalVM native is a serious infrastructure choice&#8221; argument - the fact that a individual-led open-source project can hit a 24ms cold start with a 13 MiB resident set is the kind of number that simply did not exist for JVM tooling five years ago. </p><p>Repo: <strong><a href="http://github.com/hectorvent/floci">github.com/hectorvent/floci</a></strong>.</p><div><hr></div><p>And that&#8217;s all, folks.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5aK0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34427279-94bd-4776-8e00-e6cd2eafee79_2194x1466.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5aK0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34427279-94bd-4776-8e00-e6cd2eafee79_2194x1466.png 424w, https://substackcdn.com/image/fetch/$s_!5aK0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34427279-94bd-4776-8e00-e6cd2eafee79_2194x1466.png 848w, https://substackcdn.com/image/fetch/$s_!5aK0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34427279-94bd-4776-8e00-e6cd2eafee79_2194x1466.png 1272w, https://substackcdn.com/image/fetch/$s_!5aK0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34427279-94bd-4776-8e00-e6cd2eafee79_2194x1466.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5aK0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34427279-94bd-4776-8e00-e6cd2eafee79_2194x1466.png" width="1456" height="973" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/34427279-94bd-4776-8e00-e6cd2eafee79_2194x1466.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:973,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5319279,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/196628845?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34427279-94bd-4776-8e00-e6cd2eafee79_2194x1466.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!5aK0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34427279-94bd-4776-8e00-e6cd2eafee79_2194x1466.png 424w, https://substackcdn.com/image/fetch/$s_!5aK0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34427279-94bd-4776-8e00-e6cd2eafee79_2194x1466.png 848w, https://substackcdn.com/image/fetch/$s_!5aK0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34427279-94bd-4776-8e00-e6cd2eafee79_2194x1466.png 1272w, https://substackcdn.com/image/fetch/$s_!5aK0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34427279-94bd-4776-8e00-e6cd2eafee79_2194x1466.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[The Rest of the Story: April Edition - JVM Weekly vol. 173]]></title><description><![CDATA[The last few editions were dominated by JDK 27 prep - JEP after JEP after JEP. Which means everything that wasn't a JEP got pushed to this edition.]]></description><link>https://www.jvm-weekly.com/p/the-rest-of-the-story-april-edition</link><guid isPermaLink="false">https://www.jvm-weekly.com/p/the-rest-of-the-story-april-edition</guid><dc:creator><![CDATA[Artur Skowronski]]></dc:creator><pubDate>Thu, 30 Apr 2026 13:02:30 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!X-SY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec443e02-8e8a-4ce5-a892-aaedfc0a5cb3_1920x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!X-SY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec443e02-8e8a-4ce5-a892-aaedfc0a5cb3_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!X-SY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec443e02-8e8a-4ce5-a892-aaedfc0a5cb3_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!X-SY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec443e02-8e8a-4ce5-a892-aaedfc0a5cb3_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!X-SY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec443e02-8e8a-4ce5-a892-aaedfc0a5cb3_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!X-SY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec443e02-8e8a-4ce5-a892-aaedfc0a5cb3_1920x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!X-SY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec443e02-8e8a-4ce5-a892-aaedfc0a5cb3_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ec443e02-8e8a-4ce5-a892-aaedfc0a5cb3_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2578860,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/195988393?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec443e02-8e8a-4ce5-a892-aaedfc0a5cb3_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!X-SY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec443e02-8e8a-4ce5-a892-aaedfc0a5cb3_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!X-SY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec443e02-8e8a-4ce5-a892-aaedfc0a5cb3_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!X-SY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec443e02-8e8a-4ce5-a892-aaedfc0a5cb3_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!X-SY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec443e02-8e8a-4ce5-a892-aaedfc0a5cb3_1920x1080.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>And the resulting pile is unusually rich in <em>stories</em>: people, governance moves, ecosystem direction, and a few projects that are quietly redrawing the JVM map. Let&#8217;s go.</p><h2><strong>1. April: The Rest of the Story</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9ie6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2713c1bf-8cac-4601-bf75-142f84aed588_870x576.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9ie6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2713c1bf-8cac-4601-bf75-142f84aed588_870x576.png 424w, https://substackcdn.com/image/fetch/$s_!9ie6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2713c1bf-8cac-4601-bf75-142f84aed588_870x576.png 848w, https://substackcdn.com/image/fetch/$s_!9ie6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2713c1bf-8cac-4601-bf75-142f84aed588_870x576.png 1272w, https://substackcdn.com/image/fetch/$s_!9ie6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2713c1bf-8cac-4601-bf75-142f84aed588_870x576.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9ie6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2713c1bf-8cac-4601-bf75-142f84aed588_870x576.png" width="870" height="576" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2713c1bf-8cac-4601-bf75-142f84aed588_870x576.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:576,&quot;width&quot;:870,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!9ie6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2713c1bf-8cac-4601-bf75-142f84aed588_870x576.png 424w, https://substackcdn.com/image/fetch/$s_!9ie6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2713c1bf-8cac-4601-bf75-142f84aed588_870x576.png 848w, https://substackcdn.com/image/fetch/$s_!9ie6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2713c1bf-8cac-4601-bf75-142f84aed588_870x576.png 1272w, https://substackcdn.com/image/fetch/$s_!9ie6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2713c1bf-8cac-4601-bf75-142f84aed588_870x576.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>You might remember from <strong><a href="https://www.jvm-weekly.com/p/the-rest-of-the-story-march-edition">last month&#8217;s ROTS</a></strong> that I covered <strong><a href="https://www.linkedin.com/in/jonathan-vogel-sw/">Jonathan Vogel</a></strong> <strong><a href="https://jvogel.me/posts/2026/java-is-fast-your-code-might-not-be">&#8220;Java Is Fast. Your Code Might Not Be&#8221;</a></strong> - the DevNexus-talk-turned-blog-post about how application-level inefficiencies bottleneck even the fastest runtime. I closed that section with &#8220;Thanks Jonathan, can&#8217;t wait for the followup articles!&#8221; Well - <strong><a href="https://jvogel.me/posts/2026/one-method-using-71-percent-of-cpu">Part 2 dropped in April</a></strong>, and it&#8217;s exactly what you&#8217;d want from a follow-up. Where Part 1 was the catalogue of anti-patterns, Part 2 is the actual investigation: open the JFR recording in JMC, look at the flame graph, watch one method consume 71% of CPU samples, fix it - and then watch what was previously buried in the noise become visible.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>If you read Part 1 and went &#8220;yeah but where do I actually start&#8221;, Part 2 is that walkthrough. Demo app on <strong><a href="https://github.com/jjvogel/java-order-processing-demo-sample">GitHub</a></strong> with main (anti-patterns intact) and performance-optimized (fixed) branches - diff them yourself. Part 3 is promised to look at automating the loop with tools that read JFR, rank anti-patterns by hot-path weight, write the code changes, and hand you a diff. I&#8217;m... cautiously optimistic about that one. We&#8217;ll see.</p><div><hr></div><p>JetBrains <strong><a href="https://blog.jetbrains.com/junie/2026/04/junie-cli-inside-your-jb-ide/">announced on April</a></strong> that <strong>Junie CLI</strong> - their coding agent introduced <strong><a href="https://blog.jetbrains.com/junie/2025/01/meet-junie-your-coding-agent-by-jetbrains/">back in January 2025</a></strong> - can now detect any JetBrains IDE running on your workstation and connect to it automatically. On the surface this sounds like a small UX improvement. It is not. This is the most strategically important thing JetBrains has shipped in the agent space this year, and it&#8217;s the move that finally makes the &#8220;Junie + Air + Central + ACP Registry&#8221; story (which we walked through in <strong><a href="https://www.jvm-weekly.com/p/the-rest-of-the-story-march-edition">vol. 168</a></strong>) feel coherent.</p><p>Two caveats. First, this is <strong>beta</strong> and a <strong>subscription service</strong> - the whole Junie offering is paywalled, this isn&#8217;t a free-tier expansion. Second, Android Studio support is &#8220;planned&#8221;, which means anyone doing serious KMP work today still has to make do with the IntelliJ side of the bridge.</p><p>But strategically: if JetBrains keeps this working reliably across their IDE family, &#8220;agent that thinks at the same level as my refactor tool&#8221; becomes a value proposition a generic CLI cannot match. This is the piece I expect to actually move enterprise adoption needles over the next two quarters.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!y5Mq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ca19027-6611-4b85-939e-7b2965a7a5ab_500x701.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!y5Mq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ca19027-6611-4b85-939e-7b2965a7a5ab_500x701.png 424w, https://substackcdn.com/image/fetch/$s_!y5Mq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ca19027-6611-4b85-939e-7b2965a7a5ab_500x701.png 848w, https://substackcdn.com/image/fetch/$s_!y5Mq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ca19027-6611-4b85-939e-7b2965a7a5ab_500x701.png 1272w, https://substackcdn.com/image/fetch/$s_!y5Mq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ca19027-6611-4b85-939e-7b2965a7a5ab_500x701.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!y5Mq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ca19027-6611-4b85-939e-7b2965a7a5ab_500x701.png" width="500" height="701" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3ca19027-6611-4b85-939e-7b2965a7a5ab_500x701.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:701,&quot;width&quot;:500,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!y5Mq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ca19027-6611-4b85-939e-7b2965a7a5ab_500x701.png 424w, https://substackcdn.com/image/fetch/$s_!y5Mq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ca19027-6611-4b85-939e-7b2965a7a5ab_500x701.png 848w, https://substackcdn.com/image/fetch/$s_!y5Mq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ca19027-6611-4b85-939e-7b2965a7a5ab_500x701.png 1272w, https://substackcdn.com/image/fetch/$s_!y5Mq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ca19027-6611-4b85-939e-7b2965a7a5ab_500x701.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><div><hr></div><p>The end of an era: Project Metropolis goes to a CFV. This one made me a bit melancholic. <strong><a href="https://www.linkedin.com/in/vladimir-kozlov-7a9a172/">Vladimir Kozlov</a></strong> initiated a Call For Votes on April 21 to withdraw HotSpot Group sponsorship from the OpenJDK Graal and Metropolis projects - operating under Lazy Consensus rules, voting period ending May 4. Effectively: dissolution.</p><p>If you weren&#8217;t around for it, <strong>Project Metropolis</strong> was - and I cannot overstate this - one of the most ambitious experimental tracks in OpenJDK&#8217;s history. The premise: rewrite significant parts of HotSpot&#8217;s C++ runtime in Java itself. &#8220;Java-on-Java.&#8221; Replace C2 with a self-hosted JIT compiler written in Java, statically compiled via Substrate VM. The vision was a JVM that bootstrapped itself out of its own legacy C++ codebase, using its own type system to catch its own bugs, with all the maintainability gains that implied. It was the kind of swing-for-the-fences proposal that only a community of people who genuinely believe in their tools makes.</p><p>What happened? GraalVM happened. Specifically, GraalVM thrived as an external runtime - and last September&#8217;s decision to formally <strong><a href="https://www.graalvm.org/2022/openjdk-announcement/">decouple GraalVM from the core Java release cycle</a></strong> made it clear that the strategic future for Graal-as-product was as a separate, vendor-led distribution rather than as the JIT inside mainline OpenJDK. Once that direction was set, the <em>internal</em> Metropolis project - whose entire reason for existing was integrating Graal as the HotSpot JIT - became orphaned by its own success on the outside. The Java-on-Java vision didn&#8217;t fail technically. It got out-strategized by ecosystem reality.</p><p>For JVM veterans, this is &#8220;end of an era&#8221; stuff. HotSpot&#8217;s C++ foundations are now officially the long-term future. There won&#8217;t be a self-hosted mainline JIT, at least not via this initiative. If you ever sat through one of John Rose&#8217;s talks about the implications of compiling the JVM in itself - yeah, that future is shelved.</p><p>GraalVM itself, of course, continues. It&#8217;s still an excellent runtime, still the basis for Native Image, still where most of the actual Graal innovation happens. But the ambition of folding it into the JDK proper is being formally retired. It&#8217;s a quiet end to a technically daring experiment, and worth marking the moment.</p><div><hr></div><p>Apparently February&#8217;s <strong><a href="https://www.jvm-weekly.com/p/jdk-26-and-javaone-when-the-conference">&#8220;Koog for Java&#8221; reveal at JavaOne</a></strong> wasn&#8217;t going to be the end of it. JetBrains <strong><a href="https://jb.gg/koog-springai">announced</a></strong> direct integration between Koog - their JVM-native AI agent orchestration runtime - and the Spring AI ecosystem.</p><p>The pitch is sensible: Spring AI handles the <em>what</em> (model communication, abstractions, vector stores, beans), Koog handles the <em>how</em> (agent state, history, flow, lifecycle). Koog acts as an &#8220;orchestration skin&#8221; - you keep using your Spring AI providers and vector stores, but the agent logic lives in Koog&#8217;s directed-graph workflow model. The properly interesting piece is what Koog manages on the lifecycle side: <strong>native crash recovery</strong> preserves execution state across restarts, and <strong>automated history compression</strong> mitigates LLM context window constraints transparently.</p><p>If you&#8217;ve built an agentic system in production, you know that &#8220;what happens when the JVM bounces mid-conversation&#8221; is one of those questions that has no good answer in vanilla LangChain4j or Spring AI alone. You either roll your own checkpointing (good luck) or accept that long-running agents will lose state on restart (also bad). Koog solving this at the framework level - and now plumbing into Spring AI cleanly - is genuinely useful.</p><div><hr></div><p>Spring patches three CVEs in one go - plus a Spring Cloud Gateway one Quick public-service announcement, because four CVEs in two weeks deserves a flag.</p><p><strong>Spring Framework 7.0.7 and 6.2.18</strong> <strong><a href="https://spring.io/blog/2026/04/17/spring-framework-6-2-18-and-7-0-7-available-now">shipped April 17</a></strong> and patch three CVEs:</p><ul><li><p><strong><a href="https://spring.io/security/cve-2026-22740">CVE-2026-22740</a></strong> - DoS via multipart temp files in WebFlux. Temp files from multipart requests can fail to be deleted, exhausting disk space.</p></li><li><p><strong><a href="https://spring.io/security/cve-2026-22741">CVE-2026-22741</a></strong> - Static resource cache poisoning in Spring MVC and WebFlux. Specially-crafted requests can poison the cache with wrongly-encoded resources, breaking the front-end for everyone else.</p></li><li><p><strong><a href="https://spring.io/security/cve-2026-22745">CVE-2026-22745</a></strong> - DoS in static resource handling on Windows specifically. Slow-resolving requests can keep HTTP connections open indefinitely.</p></li></ul><p>A week earlier, <strong><a href="https://spring.io/security/cve-2026-22750">Spring Cloud Gateway 4.2.0</a></strong> hit with <strong>CVE-2026-22750</strong> - and this one is a particularly sneaky failure mode. The spring.ssl.bundle configuration property was being <strong>silently ignored</strong>, defaulting to the default SSL configuration with no log message and no warning. If you set this property believing it was applying a custom bundle, you weren&#8217;t getting that bundle and you had no way to know. The &#8220;false sense of security&#8221; framing in Spring&#8217;s writeup is unusually honest and accurate.</p><p>None of these are RCE-class, but the cache-poisoning one has clean exploitation paths and the SSL-bundle bypass is <em>exactly</em> the kind of silent misconfiguration that survives in production for ages. If you&#8217;re on Spring 7.0.x or 6.2.x: patch. If you&#8217;re on Spring Cloud Gateway 4.2.0: patch. If you&#8217;re still on Spring 5.x: I&#8217;m sorry about your maintenance backlog, and you have bigger problems anyway.</p><div><hr></div><p><strong><a href="https://www.linkedin.com/in/ivargrimstad/">Ivar Grimstad</a></strong> <strong><a href="https://www.agilejava.eu/">weekly Hashtag Jakarta EE</a></strong> updates remain the most reliable signal on Jakarta EE 12 timing, and the <strong><a href="https://www.agilejava.eu/2026/04/19/hashtag-jakarta-ee-329/">April 19 edition</a></strong> gave us the cleanest milestone schedule we&#8217;ve seen so far. The Platform Project has now committed to:</p><ul><li><p><strong>M4 (Apr 1 &#8211; May 15, 2026)</strong> - Core Profile specs to show progress: REST 5.0-M1, CDI 5.0 milestone/beta (currently at Alpha4), JSON-P 2.2-M1, JSON-B 3.1-M1</p></li><li><p><strong>M7 (Aug 15 &#8211; Sep 30)</strong> - <em>Ideally</em> Core Profile released</p></li><li><p><strong>M9 (Jan &#8211; Feb 2027)</strong> - Finalize remaining specs</p></li><li><p><strong>M10 (Feb &#8211; Mar 2027)</strong> - Platform TCK with ratifying implementation</p></li></ul><p>So the realistic read: <strong>Core Profile in Q4 2026, Web Profile and full Platform in Q1&#8211;Q2 2027</strong>. Same shape as Jakarta EE 11, which is at least predictable.</p><p>The active debate worth flagging: <strong>whether Jakarta NoSQL gets included in EE 12 at all</strong>. Grimstad noted explicit resistance among some members, and called for community voices on either side. If you&#8217;ve been using Eclipse JNoSQL in production and want it standardized, this is your window - speak up on the Jakarta EE Platform mailing list before the inclusion decision sticks.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JXtE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cbbee3c-e0be-4284-af9d-c787e6f764ad_500x500.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JXtE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cbbee3c-e0be-4284-af9d-c787e6f764ad_500x500.png 424w, https://substackcdn.com/image/fetch/$s_!JXtE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cbbee3c-e0be-4284-af9d-c787e6f764ad_500x500.png 848w, https://substackcdn.com/image/fetch/$s_!JXtE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cbbee3c-e0be-4284-af9d-c787e6f764ad_500x500.png 1272w, https://substackcdn.com/image/fetch/$s_!JXtE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cbbee3c-e0be-4284-af9d-c787e6f764ad_500x500.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JXtE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cbbee3c-e0be-4284-af9d-c787e6f764ad_500x500.png" width="500" height="500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1cbbee3c-e0be-4284-af9d-c787e6f764ad_500x500.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:500,&quot;width&quot;:500,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!JXtE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cbbee3c-e0be-4284-af9d-c787e6f764ad_500x500.png 424w, https://substackcdn.com/image/fetch/$s_!JXtE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cbbee3c-e0be-4284-af9d-c787e6f764ad_500x500.png 848w, https://substackcdn.com/image/fetch/$s_!JXtE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cbbee3c-e0be-4284-af9d-c787e6f764ad_500x500.png 1272w, https://substackcdn.com/image/fetch/$s_!JXtE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cbbee3c-e0be-4284-af9d-c787e6f764ad_500x500.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>Other specs targeting M2 release: Jakarta Connectors 3.0, Faces 5.0, Transactions 2.1, JSON-P 2.2.</p><div><hr></div><p>Continuing the JetBrains-makes-everything-an-agent theme: a <strong><a href="https://kotl.in/kotlin-tooling-agp9-migration">specialized AI agent skill</a></strong> landed in the kotlin-agent-skills repository targeting Kotlin Multiplatform &#8594; Android Gradle Plugin 9.0 migrations. AGP 9.0 demands JDK 21 and Gradle 8.10.2, and the migration involves breaking changes to the build DSL plus the complete removal of the legacy PackagingOptions. Anyone who&#8217;s done this manually on a non-trivial KMP project knows the pain.</p><p>Couple of observations. First: this is the kind of &#8220;agentic skill&#8221; that LLMs are <em>actually</em> good at - narrowly-scoped, mechanical, structurally well-defined transformations on a constrained input grammar (Gradle DSL). It&#8217;s the agentic-coding sweet spot, and probably more reliably useful than the &#8220;vibe-code me a feature&#8221; style. Second: the necessity of such tools underscores how deep the Android-Kotlin build stack complexity has gotten. The fact that a major version bump now warrants its own purpose-built migration agent says something - and not entirely a flattering something - about where Gradle DSL ergonomics have ended up.</p><p>Either way: if you&#8217;re staring down an AGP 9.0 migration on a multi-module KMP codebase, this is worth a look before you do it by hand.</p><h2><strong>2. Release Radar</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2-4U!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe153c662-5291-4e67-adff-558b3e0ccd5d_1176x776.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2-4U!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe153c662-5291-4e67-adff-558b3e0ccd5d_1176x776.png 424w, https://substackcdn.com/image/fetch/$s_!2-4U!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe153c662-5291-4e67-adff-558b3e0ccd5d_1176x776.png 848w, https://substackcdn.com/image/fetch/$s_!2-4U!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe153c662-5291-4e67-adff-558b3e0ccd5d_1176x776.png 1272w, https://substackcdn.com/image/fetch/$s_!2-4U!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe153c662-5291-4e67-adff-558b3e0ccd5d_1176x776.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2-4U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe153c662-5291-4e67-adff-558b3e0ccd5d_1176x776.png" width="1176" height="776" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e153c662-5291-4e67-adff-558b3e0ccd5d_1176x776.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:776,&quot;width&quot;:1176,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!2-4U!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe153c662-5291-4e67-adff-558b3e0ccd5d_1176x776.png 424w, https://substackcdn.com/image/fetch/$s_!2-4U!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe153c662-5291-4e67-adff-558b3e0ccd5d_1176x776.png 848w, https://substackcdn.com/image/fetch/$s_!2-4U!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe153c662-5291-4e67-adff-558b3e0ccd5d_1176x776.png 1272w, https://substackcdn.com/image/fetch/$s_!2-4U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe153c662-5291-4e67-adff-558b3e0ccd5d_1176x776.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><h3><strong>TornadoVM 4.0.0 GA</strong></h3><p>We already mentioned it, but treat tis as a necessary due diligence.</p><p>The main feature of <strong><a href="https://github.com/beehive-lab/TornadoVM/releases">TornadoVM 4.0</a></strong> is genuinely big: <strong>a new hardware backend supporting Apple Silicon via the Apple Metal API</strong>. After years of Apple Silicon being a second-class citizen for serious GPU compute on the JVM, TornadoVM 4.0 now has a native path. Combined with the OpenCL, PTX, and SPIR-V backends, you can now legitimately develop and prototype heterogeneous Java workloads on a MacBook before deploying to NVIDIA, Intel, or AMD hardware. For anyone working on <strong><a href="http://gpullama3.java/">GPULlama3.java</a></strong>-style projects or AI inference in pure Java, this is the release that makes Mac local development viable.</p><h3><strong>Helidon 4.4.0</strong></h3><p><strong><a href="https://medium.com/helidon/helidon-4-4-0-released-d10be2fb8039">Helidon 4.4.0</a></strong> (released around JavaOne) is a substantial release: <strong>agentic LangChain4j patterns</strong>, <strong>Helidon JSON</strong> (compile-time JSON, incubating), expanded declarative APIs (WebClient, WebSocket, Health Checks, Telemetry, Metrics, CORS, Security), unified OpenTelemetry story including OTLP-exported metrics and configurable OpenTelemetry logging, plus formal entry into Oracle&#8217;s Java Verified Portfolio. Notable deprecations: the Jaeger tracing provider is deprecated (OpenTelemetry&#8217;s Jaeger exporter is gone), and CORS configuration moved from feature-specific to centralized top-level. Then <strong><a href="https://github.com/helidon-io/helidon/blob/4.4.1/CHANGELOG.md">4.4.1</a></strong> followed quickly with bug fixes (gRPC server-side error handling, Prometheus metrics performance, Netty <strong><a href="http://4.1.130.final/">4.1.130.Final</a></strong>, Apache commons-text 1.15.0). Upgrade path is clean - review the deprecations section, then jump.<strong><a href="https://github.com/langchain4j/langchain4j/releases/tag/1.13.0">Release notes</a></strong>.</p><h3><strong>Hibernate ORM 7.3.0</strong></h3><p>The headline of <strong><a href="https://in.relation.to/2026/04/07/orm-73/">the new Hibernate 7.3.0</a></strong> is <strong>improved natural ID support</strong>. New KeyType enumeration lets the overloaded find() and findMultiple() methods do natural-ID-based loading, and new @NaturalIdClass annotation mirrors @IdClass semantics for non-aggregated composite natural IDs. If you&#8217;ve wrestled with composite business keys (and who hasn&#8217;t), this finally aligns the natural-ID path with the JPA-standard identifier path.</p><h3><strong>LangChain4j 1.13.0</strong></h3><p>In <strong><a href="https://github.com/langchain4j/langchain4j/releases/tag/1.13.0">LangChain4j .1.13.0</a></strong> new <strong>RecoverabilityIT</strong> and <strong>PendingResponse</strong> classes make agentic execution state persistable and recoverable across restarts - solving the same problem Koog tackles from the JetBrains side, and confirming that resilient stateful agents are now a baseline expectation across the JVM AI stack.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VtuQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfe8bef4-7b5a-43cd-8772-66225bfacfd3_710x500.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VtuQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfe8bef4-7b5a-43cd-8772-66225bfacfd3_710x500.png 424w, https://substackcdn.com/image/fetch/$s_!VtuQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfe8bef4-7b5a-43cd-8772-66225bfacfd3_710x500.png 848w, https://substackcdn.com/image/fetch/$s_!VtuQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfe8bef4-7b5a-43cd-8772-66225bfacfd3_710x500.png 1272w, https://substackcdn.com/image/fetch/$s_!VtuQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfe8bef4-7b5a-43cd-8772-66225bfacfd3_710x500.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VtuQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfe8bef4-7b5a-43cd-8772-66225bfacfd3_710x500.png" width="710" height="500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cfe8bef4-7b5a-43cd-8772-66225bfacfd3_710x500.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:500,&quot;width&quot;:710,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!VtuQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfe8bef4-7b5a-43cd-8772-66225bfacfd3_710x500.png 424w, https://substackcdn.com/image/fetch/$s_!VtuQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfe8bef4-7b5a-43cd-8772-66225bfacfd3_710x500.png 848w, https://substackcdn.com/image/fetch/$s_!VtuQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfe8bef4-7b5a-43cd-8772-66225bfacfd3_710x500.png 1272w, https://substackcdn.com/image/fetch/$s_!VtuQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfe8bef4-7b5a-43cd-8772-66225bfacfd3_710x500.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Corporate want you to see difference between these two pictures.</figcaption></figure></div><p>Also: a new <strong>ClassPathSkillLoader</strong> (Anthropic-style &#8220;Skills&#8221; come to LangChain4j) and a new <strong>HibernateContentRetriever</strong> running HQL queries as a retrieval source - the Hibernate-as-knowledge-graph pattern Belladelli demoed at JCON Europe (see &#167;1) made flesh in code.</p><h3><strong>Keycloak 26.6.0</strong></h3><p>Full <strong>RFC 7523</strong> support (JWT profile for OAuth 2.0 client auth/authz grants), experimental support for the <strong><a href="https://www.ietf.org/archive/id/draft-ietf-oauth-client-id-metadata-document-01.html">OAuth Client ID Metadata Document</a></strong> draft - relevant for serving as an authorization server for the latest <strong><a href="https://modelcontextprotocol.io/specification/2025-11-25">MCP spec</a></strong> - and full support for the new Keycloak Test Framework on JUnit 6. The MCP-as-OAuth-resource-server piece is genuinely useful if you&#8217;re building agent infrastructure that needs proper auth instead of API-key duct tape. <strong><a href="https://github.com/keycloak/keycloak/releases/tag/26.6.0">Release notes</a></strong>.</p><h3><strong>Apache Camel 4.19.0</strong></h3><p>Possibly <strong><a href="https://camel.apache.org/releases/release-4.19.0/">the most feature-rich release on this list</a></strong>. New components: <strong><a href="https://camel.apache.org/components/next/azure-functions-component.html">Azure Functions</a></strong>, <strong><a href="https://camel.apache.org/components/next/dataformats/groovyJson-dataformat.html">Groovy JSON dataformat</a></strong>, and - interestingly - <strong><a href="https://camel.apache.org/components/next/spring-ai-image-component.html">Spring AI Image</a></strong>, bringing Spring AI&#8217;s image generation flow into Camel routes. The <strong><a href="https://camel.apache.org/components/next/pqc-component.html">PQC component</a></strong> now supports hybrid post-quantum cryptography, key lifecycle management, and platform-wide quantum-safe TLS readiness - which sounds aspirational but aligns with where JEP 527 is going on the JDK side. Plus support for <strong>Spring Boot 4.0</strong>.</p><h3><strong>Open Liberty 26.0.0.4 beta</strong></h3><p><strong><a href="https://openliberty.io/blog/2026/04/07/26.0.0.4-beta.html">JDK 26 support, new features for Jakarta EE 11 Platform</a></strong> (jakartaee-11.0) and Web Profile (webProfile-11.0), Authentication 3.1, Authorization 3.0, Security 6.0 (Jakarta Security 4.0). The mcpServer-1.0 feature now allows <strong>dynamic tool registration</strong>, which is the practical thing you need if you want to use MCP for anything beyond a static demo. Combined with last month&#8217;s MCP additions, Open Liberty continues being one of the first enterprise Java application servers to take MCP seriously.</p><h3><strong>CheerpJ 4.3</strong></h3><p><strong><a href="https://labs.leaningtech.com/blog/cheerpj-4.3">Leaning Tech shipped CheerpJ 4.3</a></strong> - the WebAssembly-based JVM that runs unmodified Java applications in the browser. The 4.3 release continues the steady iteration toward &#8220;yes, you can actually run this Swing app in your browser tab without installing anything.&#8221; For preservation work, edu-tech, and certain very specific enterprise reanimation cases, this remains a remarkable piece of engineering. The <strong><a href="https://www.reddit.com/r/java/comments/1srl9ke/cheerpj_43_run_unmodified_java_applications_in/">r/java thread</a></strong> had the usual mix of amazement and &#8220;but why&#8221; - both reasonable reactions.</p><h3><strong>Native Image Config Transformer 1.0.1</strong></h3><p><strong><a href="https://www.linkedin.com/in/michael-simons-196712139/">Michael Simons</a></strong> <strong><a href="https://codeberg.org/michael-simons/native-image-config-transformer">released v1.0.1</a></strong> of his native-image-config-transformer - a Maven Shade Plugin extension that bridges JAR shading and GraalVM&#8217;s static analysis requirements. If you&#8217;ve ever produced a fat JAR with Shade and then watched GraalVM&#8217;s reachability metadata go stale because the plugin renamed your packages but not the metadata files, this fixes that. v1.0.1 adds support for the reachability-metadata-schema-v1.2.0.json format. Niche, high-utility, exactly the kind of &#8220;small tool that quietly fixes a real-world pain point&#8221; the GraalVM ecosystem benefits from.</p><h3><strong>Amper 0.10.0</strong></h3><p>For those keeping track of the JetBrains-tries-to-fix-build-tooling saga: <strong><a href="https://blog.jetbrains.com/amper/2026/03/amper-0-10/">Amper continues</a></strong> iterating on its declarative-YAML-but-not-really build configuration model. Worth watching if you&#8217;re tired of Gradle Kotlin DSL complexity, but I&#8217;d still call this &#8220;interesting experiment, not yet a Gradle replacement for serious projects.&#8221;</p><h3><strong>JBang 0.138.0</strong></h3><p>JBang <strong><a href="https://github.com/jbangdev/jbang/releases/tag/v0.138.0">now executes WAR files</a></strong> with the same handling as JAR files. Small change, useful if you carry a WAR around for legacy testing reasons. The deprecated isJar() method on Project is preserved for backward compat.</p><div><hr></div><h2><strong>3. GitHub All-Stars</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qE3j!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e2c480-e59c-417c-b9ab-e727084684e0_1182x784.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qE3j!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e2c480-e59c-417c-b9ab-e727084684e0_1182x784.png 424w, https://substackcdn.com/image/fetch/$s_!qE3j!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e2c480-e59c-417c-b9ab-e727084684e0_1182x784.png 848w, https://substackcdn.com/image/fetch/$s_!qE3j!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e2c480-e59c-417c-b9ab-e727084684e0_1182x784.png 1272w, https://substackcdn.com/image/fetch/$s_!qE3j!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e2c480-e59c-417c-b9ab-e727084684e0_1182x784.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qE3j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e2c480-e59c-417c-b9ab-e727084684e0_1182x784.png" width="1182" height="784" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/95e2c480-e59c-417c-b9ab-e727084684e0_1182x784.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:784,&quot;width&quot;:1182,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!qE3j!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e2c480-e59c-417c-b9ab-e727084684e0_1182x784.png 424w, https://substackcdn.com/image/fetch/$s_!qE3j!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e2c480-e59c-417c-b9ab-e727084684e0_1182x784.png 848w, https://substackcdn.com/image/fetch/$s_!qE3j!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e2c480-e59c-417c-b9ab-e727084684e0_1182x784.png 1272w, https://substackcdn.com/image/fetch/$s_!qE3j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e2c480-e59c-417c-b9ab-e727084684e0_1182x784.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>A handful of community projects worth flagging this month - none release-worthy in the formal sense, but interesting enough that I&#8217;d hate to lose them in the noise.</p><h3><strong>Server-Components - Phoenix LiveView, on the JVM</strong></h3><p><strong><a href="https://github.com/vadimv/server-components">Server-components by vadimv</a></strong> brings the Elixir Phoenix LiveView model to the JVM. Stateful, server-driven rendering over WebSockets, no SPA stack required. The project&#8217;s architectural philosophy is the interesting bit: it deliberately rejects &#8220;magic&#8221; - strict avoidance of annotations and implicit execution flows, in favor of explicit control. Roughly 12,000 lines of modern Java, vertically integrated, near-zero runtime dependencies. The author explicitly cites AI-agent-friendliness as a design constraint - predictable, readable code structures are easier for both humans <em>and</em> LLMs to navigate.</p><p>I&#8217;m genuinely interested in this one. The &#8220;JS-less interactive UI&#8221; argument has resurfaced via HTMX, Hotwire, and now LiveView ports - and the JVM has been weirdly underrepresented in this conversation. Worth keeping an eye on.</p><h3><strong>AlgoFlow - bytecode-instrumentation-based algorithm visualizer</strong></h3><p><strong><a href="https://www.reddit.com/r/java/comments/1sd0pox/i_built_an_engine_that_autovisualizes_java/">AlgoFlow</a></strong> takes a different route to algorithm visualization: a Java Agent that injects visualization callbacks directly into JVM instructions, capturing state changes (array assignments with computed indices, etc.) without source-level integration. This is genuinely clever - the vast majority of educational visualization tools require either heavy code annotation or a step debugger, and AlgoFlow side-steps both via bytecode instrumentation.</p><p>The r/java response was polarized - the Java backend got praise, the AI-generated frontend less so. That&#8217;s a shame, because the core technique is the interesting bit. If the developer trades in the AI-generated UI for something more polished, this could be a real teaching tool. Watch this space.</p><h3><strong>WebAssembly4J 1.0.0 - unified Wasm API for the JVM</strong></h3><p><strong><a href="https://github.com/tegmentum/webassembly4j">WebAssembly4J</a></strong> provides a unified API across multiple Wasm runtimes (Wasmtime, WAMR, Chicory) with dual integration paths: JNI for Java 8/11 compatibility and <strong>Project Panama (FFM API)</strong> for Java 22+. Continues the trend we covered with <strong>swc4j</strong> in vol. 168 - the &#8220;black box script engine&#8221; era is giving way to more transparent, low-latency execution models where Wasm becomes a first-class JVM citizen. If you&#8217;re building plugins, sandboxes, or polyglot integration, the Wasm-on-JVM space is suddenly worth following again.</p><h3><strong>MelodyMatrix 1.0.0 - JavaFX + jdeploy as a delivery model</strong></h3><p><strong><a href="https://foojay.io/today/melodymatrix-v1-0-0-released-shipping-a-javafx-app-with-jdeploy-github-actions-and-auto-update/">MelodyMatrix</a></strong> by <strong><a href="https://www.linkedin.com/in/frankdelporte/">Frank Delporte</a></strong> isn&#8217;t important for what it does (it&#8217;s a music-related tool) - it&#8217;s important as a <strong>case study for how to ship a JavaFX desktop app in 2026</strong>. The release walkthrough on Foojay covers the full pipeline: jdeploy for cross-platform native installers, GitHub Actions for the build, auto-update integration, the works.</p><p>JavaFX in 2026 is in a much better shape than the discourse credits it for, and projects like this one are why. If you&#8217;ve been holding off on a desktop Java tool because &#8220;distribution is a nightmare,&#8221; read this.</p><div id="youtube2-_-IL7uHalIU" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;_-IL7uHalIU&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/_-IL7uHalIU?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><h3><strong>Shroom - &#8220;if jvm and c had a baby&#8221;</strong></h3><p>A small Polish-fronted curiosity that I genuinely enjoyed: <strong><a href="https://github.com/1grzyb1/shroom">shroom</a></strong> by <strong><a href="https://www.linkedin.com/in/wiktor-keska/">Wiktor K&#281;ska</a></strong> a tiny C-like language that compiles to JVM bytecode and uses <strong>Panama (Foreign Function &amp; Memory API)</strong> for manual memory management. You write code with pointers, malloc/free, and structs; the compiler turns it into .class files; under the hood, every pointer is a MemorySegment, every malloc is Arena.allocate(), and every dereference is segment.get()/segment.set(). The toolchain is the cool bit - <strong>ANTLR</strong> for parsing, walks an AST, then <strong>ASM</strong> to emit bytecode, then <strong>Panama Linker</strong> for native FFI when you want to call into libc.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!P7Hx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F430e4494-6dac-4747-8dff-a191c02eee47_787x630.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!P7Hx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F430e4494-6dac-4747-8dff-a191c02eee47_787x630.png 424w, https://substackcdn.com/image/fetch/$s_!P7Hx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F430e4494-6dac-4747-8dff-a191c02eee47_787x630.png 848w, https://substackcdn.com/image/fetch/$s_!P7Hx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F430e4494-6dac-4747-8dff-a191c02eee47_787x630.png 1272w, https://substackcdn.com/image/fetch/$s_!P7Hx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F430e4494-6dac-4747-8dff-a191c02eee47_787x630.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!P7Hx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F430e4494-6dac-4747-8dff-a191c02eee47_787x630.png" width="787" height="630" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/430e4494-6dac-4747-8dff-a191c02eee47_787x630.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:630,&quot;width&quot;:787,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!P7Hx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F430e4494-6dac-4747-8dff-a191c02eee47_787x630.png 424w, https://substackcdn.com/image/fetch/$s_!P7Hx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F430e4494-6dac-4747-8dff-a191c02eee47_787x630.png 848w, https://substackcdn.com/image/fetch/$s_!P7Hx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F430e4494-6dac-4747-8dff-a191c02eee47_787x630.png 1272w, https://substackcdn.com/image/fetch/$s_!P7Hx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F430e4494-6dac-4747-8dff-a191c02eee47_787x630.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>What sells it for me is that it&#8217;s a <em>complete loop</em>: source goes in, real .class files come out, and Kotlin/Java/Scala can call them via plain invokestatic - Sieve.countPrimes(1_000_000) compiles to a regular static method call. The arena modifiers (confined, shared, global, auto) are a particularly nice touch - you control memory lifetime per function, and the arena gets closed (freeing all mallocs in one go) when the function returns. It&#8217;s a great teaching artifact for anyone who wanted to understand how Panama, ANTLR, and ASM actually fit together.</p><p>And from the license section: <em>&#8220;Experimental. No license. Don&#8217;t use in production. If it breaks, you get to keep both pieces.&#8221;</em> Exactly the right energy.</p><p>Requires JDK 22+ (since Panama is finalized there). Star it for the educational value alone - this is the kind of repo I&#8217;ll be sending people who want to actually grok how the pieces of the modern JVM puzzle slot together.</p><h3><strong>Controller-Client - Spring Boot tests without the MockMvc boilerplate</strong></h3><p>From the same author as shroom: <strong><a href="https://github.com/1grzyb1/controller-client">controller-client</a></strong> is a much more <em>practical</em> offering - a Spring Boot testing library that wraps MockMvc with dynamic proxies so you can call your controller methods directly in tests, type-safe, no JSON-string-massaging required. Instead of the usual ceremony:</p><pre><code><code>String responseContent = mockMvc.perform(get("/example"))
    .andExpect(status().isOk())
    .andReturn()
    .getResponse()
    .getContentAsString();
ExampleResponse response = objectMapper.readValue(responseContent, ExampleResponse.class);</code></code></pre><p>you get</p><pre><code><code>@AutowireControllerClient
private ExampleController exampleController;

@Test
void basicGet() {
    var response = exampleController.exampleMethod();
    assertThat(response.message()).isEqualTo("Hello world!");
}</code></code></pre><p>That&#8217;s the whole pitch, and honestly it&#8217;s enough - anyone who&#8217;s written ten MockMvc tests has felt the boilerplate fatigue. The library is at v2.3.0 (December 2025), Spring Web only, and per the README &#8220;still in early stage, so it doesn&#8217;t support all spring web annotations&#8221; - but the core pattern is right and the customizer hook (ControllerClientAnnotationCustomizer, e.g. for adding CSRF tokens to every request) is extensible enough to cover the common needs.</p><p>Available on Maven Central as <strong><a href="https://github.com/1grzyb1/controller-client/releases/tag/v2.3.0">io.github.1grzyb1:controller-client:2.3.0</a></strong>. Worth a look if you&#8217;re tired of writing objectMapper.readValue(...) for the hundredth time.</p><div><hr></div><p><strong>PS:</strong> <strong><a href="https://kotlinconf.org/">KotlinConf 2026</a></strong> is around the corner - reminder that I&#8217;ll be there as media partner. Come say hi.</p><p><strong>PS2:</strong> Heads-up that next month is going to be heavy on retro, because both the <strong><a href="https://www.manning.com/books/vibe-engineering">Vibe Engineering MEAP</a></strong> is hitting milestones and there&#8217;s a <strong><a href="https://partiful.com/e/M7pXmV8sOXT11yHb9pKw">NYC Tech Week event in early June tied to the book</a></strong>. Expect some self-promotion. I&#8217;ll keep it short.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iBSs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf506637-8df6-43cd-9d75-97660158e76c_800x800.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iBSs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf506637-8df6-43cd-9d75-97660158e76c_800x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!iBSs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf506637-8df6-43cd-9d75-97660158e76c_800x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!iBSs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf506637-8df6-43cd-9d75-97660158e76c_800x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!iBSs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf506637-8df6-43cd-9d75-97660158e76c_800x800.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iBSs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf506637-8df6-43cd-9d75-97660158e76c_800x800.jpeg" width="800" height="800" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bf506637-8df6-43cd-9d75-97660158e76c_800x800.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!iBSs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf506637-8df6-43cd-9d75-97660158e76c_800x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!iBSs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf506637-8df6-43cd-9d75-97660158e76c_800x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!iBSs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf506637-8df6-43cd-9d75-97660158e76c_800x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!iBSs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf506637-8df6-43cd-9d75-97660158e76c_800x800.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Claude Plays Final Fantasy just before KotlinConf 2026 - JVM Weekly vol. 172]]></title><description><![CDATA[From JoyCons through REST and MCP to an autonomous agent - plus five Munich talks worth your time]]></description><link>https://www.jvm-weekly.com/p/claude-plays-final-fantasy-just-before</link><guid isPermaLink="false">https://www.jvm-weekly.com/p/claude-plays-final-fantasy-just-before</guid><dc:creator><![CDATA[Artur Skowronski]]></dc:creator><pubDate>Thu, 23 Apr 2026 13:03:04 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!6H_a!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c09606-8905-4cc6-b8b0-e70f4a2f82db_1928x1088.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6H_a!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c09606-8905-4cc6-b8b0-e70f4a2f82db_1928x1088.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6H_a!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c09606-8905-4cc6-b8b0-e70f4a2f82db_1928x1088.png 424w, https://substackcdn.com/image/fetch/$s_!6H_a!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c09606-8905-4cc6-b8b0-e70f4a2f82db_1928x1088.png 848w, https://substackcdn.com/image/fetch/$s_!6H_a!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c09606-8905-4cc6-b8b0-e70f4a2f82db_1928x1088.png 1272w, https://substackcdn.com/image/fetch/$s_!6H_a!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c09606-8905-4cc6-b8b0-e70f4a2f82db_1928x1088.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6H_a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c09606-8905-4cc6-b8b0-e70f4a2f82db_1928x1088.png" width="1456" height="822" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/65c09606-8905-4cc6-b8b0-e70f4a2f82db_1928x1088.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:822,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2301320,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/195050120?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c09606-8905-4cc6-b8b0-e70f4a2f82db_1928x1088.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!6H_a!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c09606-8905-4cc6-b8b0-e70f4a2f82db_1928x1088.png 424w, https://substackcdn.com/image/fetch/$s_!6H_a!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c09606-8905-4cc6-b8b0-e70f4a2f82db_1928x1088.png 848w, https://substackcdn.com/image/fetch/$s_!6H_a!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c09606-8905-4cc6-b8b0-e70f4a2f82db_1928x1088.png 1272w, https://substackcdn.com/image/fetch/$s_!6H_a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c09606-8905-4cc6-b8b0-e70f4a2f82db_1928x1088.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://www.linkedin.com/company/kotlinconf/">KotlinConf</a></strong> 2026 is right around the corner - May 20&#8211;22, Munich, ICM Messe. JVM Weekly once again has the pleasure of being a media partner for the event, and on that occasion I decided to do something I don&#8217;t usually do in this newsletter: write about my own project.</p><div id="youtube2-4A6aLK2KznU" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;4A6aLK2KznU&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/4A6aLK2KznU?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>A year ago I had the chance to stand on stage in Copenhagen with a talk called &#8220;<strong><a href="https://www.youtube.com/watch?v=4A6aLK2KznU">Build your own NES Emulator... with Kotlin</a></strong>&#8220;. kNES - <strong><a href="https://github.com/ArturSkowronski/kNES">my Kotlin NES emulator - had been living quietly on GitHub ever since.</a></strong></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Nszp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89b3b964-af15-428d-a105-5aeba8e250f9_1182x391.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Nszp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89b3b964-af15-428d-a105-5aeba8e250f9_1182x391.png 424w, https://substackcdn.com/image/fetch/$s_!Nszp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89b3b964-af15-428d-a105-5aeba8e250f9_1182x391.png 848w, https://substackcdn.com/image/fetch/$s_!Nszp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89b3b964-af15-428d-a105-5aeba8e250f9_1182x391.png 1272w, https://substackcdn.com/image/fetch/$s_!Nszp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89b3b964-af15-428d-a105-5aeba8e250f9_1182x391.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Nszp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89b3b964-af15-428d-a105-5aeba8e250f9_1182x391.png" width="1182" height="391" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/89b3b964-af15-428d-a105-5aeba8e250f9_1182x391.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:391,&quot;width&quot;:1182,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Nszp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89b3b964-af15-428d-a105-5aeba8e250f9_1182x391.png 424w, https://substackcdn.com/image/fetch/$s_!Nszp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89b3b964-af15-428d-a105-5aeba8e250f9_1182x391.png 848w, https://substackcdn.com/image/fetch/$s_!Nszp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89b3b964-af15-428d-a105-5aeba8e250f9_1182x391.png 1272w, https://substackcdn.com/image/fetch/$s_!Nszp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89b3b964-af15-428d-a105-5aeba8e250f9_1182x391.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Then it stopped being quiet. Because doing stuff these days is&#8230; easier. First I wanted to play with JoyCons instead of a keyboard, then I wanted to expose a REST API, then add MCP, and then Claude picked up the controller and started playing Final Fantasy 1. Each new layer was a single evening of work - because one small interface turned out to be enough for all of them.</p><p>Not even starting about having fun with NES in terminal.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;a1a519e7-0b11-45d2-b9a4-351dc6c08007&quot;,&quot;duration&quot;:null}"></div><p></p><p>With KotlinConf approaching, I figured it&#8217;s time to share what happened over the past year - especially since I&#8217;ve had some rather interesting journey &#128513;</p><p>I&#8217;m not speaking this year on conference, but I&#8217;m going to attend as JVM Weekly once again has opportunity to be a media partner of the event, so at the end - so at the end - five talks from this year&#8217;s agenda that I personally plan to attend.</p><div><hr></div><h3><strong>A Year After KotlinConf: How JoyCons in a Hotel Room Started an Avalanche</strong></h3><p>For those who didn&#8217;t see the talk: kNES is a NES emulator written in pure Kotlin - 6502 CPU, PPU, controllers, frame timing. Compose Desktop as the UI (probably worst UI you have ever seen, shame on my but it was never that important in that project), multi-module Gradle, zero native dependencies. A side-project that started during the pandemic as an exercise in low-level Kotlin and sealed classes, and at KotlinConf 2025 ended with a live demo of Super Mario Bros on stage.</p><p>After the conference, one question stuck with me - one I didn&#8217;t have time to properly answer from the stage: &#8220;OK, cool side-project, but what&#8217;s next?&#8221;</p><p>The answer started a few months later, at Kotlin Dev Days. Hotel room, evening, beer, an idea: &#8220;I&#8217;ll add JoyCon support.&#8221; JInput, polling on a separate thread, mapping axes and buttons - the usual. But to add gamepad support without gutting the entire CPU and PPU, I first had to refactor how the NES receives input. In the original version, KeyListener was hardwired into the emulator core through globals. To add a gamepad, I extracted it behind an interface:</p><pre><code><code>interface ControllerProvider {
    fun getKeyState(padKey: Int): Int  // 0x40 = released, 0x41 = pressed
}</code></code></pre><p>Two implementations - <em>KeyboardController</em> and <em>GamepadController</em> - one evening&#8217;s work, done.</p><p>And that&#8217;s where I should have closed the laptop. I didn&#8217;t. I was hooked and I wanted to push this thing to the absolute maximum. If ControllerProvider handles a keyboard and a gamepad, then why not HTTP? Why not MCP? Why not an autonomous agent? The 6502 CPU only knows one thing: &#8220;ask my ControllerProvider what&#8217;s happening with button number X.&#8221; It doesn&#8217;t care whether there&#8217;s a keyboard on the other end, a JoyCon over Bluetooth, a POST from curl, or an LLM talking to a server on stdio.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4P6z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6e24da1-b94e-4965-a6c9-77c9d400f76c_1199x1089.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4P6z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6e24da1-b94e-4965-a6c9-77c9d400f76c_1199x1089.png 424w, https://substackcdn.com/image/fetch/$s_!4P6z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6e24da1-b94e-4965-a6c9-77c9d400f76c_1199x1089.png 848w, https://substackcdn.com/image/fetch/$s_!4P6z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6e24da1-b94e-4965-a6c9-77c9d400f76c_1199x1089.png 1272w, https://substackcdn.com/image/fetch/$s_!4P6z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6e24da1-b94e-4965-a6c9-77c9d400f76c_1199x1089.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4P6z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6e24da1-b94e-4965-a6c9-77c9d400f76c_1199x1089.png" width="1199" height="1089" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a6e24da1-b94e-4965-a6c9-77c9d400f76c_1199x1089.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1089,&quot;width&quot;:1199,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!4P6z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6e24da1-b94e-4965-a6c9-77c9d400f76c_1199x1089.png 424w, https://substackcdn.com/image/fetch/$s_!4P6z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6e24da1-b94e-4965-a6c9-77c9d400f76c_1199x1089.png 848w, https://substackcdn.com/image/fetch/$s_!4P6z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6e24da1-b94e-4965-a6c9-77c9d400f76c_1199x1089.png 1272w, https://substackcdn.com/image/fetch/$s_!4P6z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6e24da1-b94e-4965-a6c9-77c9d400f76c_1199x1089.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>ApiController - the third implementation - took me two evenings. Ktor on port 6502 (naturally). The fourth layer, the MCP server, was a thin proxy over the same REST API. And just like that, the emulator that a year ago ran Super Mario from a keyboard got a new player - Claude Code (because it&#8217;s wonderful agents prototyping tool.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DXNX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bc04843-1d38-4776-9b36-5001764fd0a2_1194x652.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DXNX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bc04843-1d38-4776-9b36-5001764fd0a2_1194x652.png 424w, https://substackcdn.com/image/fetch/$s_!DXNX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bc04843-1d38-4776-9b36-5001764fd0a2_1194x652.png 848w, https://substackcdn.com/image/fetch/$s_!DXNX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bc04843-1d38-4776-9b36-5001764fd0a2_1194x652.png 1272w, https://substackcdn.com/image/fetch/$s_!DXNX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bc04843-1d38-4776-9b36-5001764fd0a2_1194x652.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DXNX!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bc04843-1d38-4776-9b36-5001764fd0a2_1194x652.png" width="1200" height="655.2763819095477" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2bc04843-1d38-4776-9b36-5001764fd0a2_1194x652.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:652,&quot;width&quot;:1194,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!DXNX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bc04843-1d38-4776-9b36-5001764fd0a2_1194x652.png 424w, https://substackcdn.com/image/fetch/$s_!DXNX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bc04843-1d38-4776-9b36-5001764fd0a2_1194x652.png 848w, https://substackcdn.com/image/fetch/$s_!DXNX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bc04843-1d38-4776-9b36-5001764fd0a2_1194x652.png 1272w, https://substackcdn.com/image/fetch/$s_!DXNX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bc04843-1d38-4776-9b36-5001764fd0a2_1194x652.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It sat down, loaded the Final Fantasy 1 ROM (dumped personally for that purpose, of course), created a party (Fighter / Thief / Black Belt / Red Mage, a classic), walked out of Cornelia Castle, fought five IMPs on the overworld, and wrote in my log</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Pr_5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b25d2e-551c-428c-a9ee-0bec5e13c151_1178x383.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Pr_5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b25d2e-551c-428c-a9ee-0bec5e13c151_1178x383.png 424w, https://substackcdn.com/image/fetch/$s_!Pr_5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b25d2e-551c-428c-a9ee-0bec5e13c151_1178x383.png 848w, https://substackcdn.com/image/fetch/$s_!Pr_5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b25d2e-551c-428c-a9ee-0bec5e13c151_1178x383.png 1272w, https://substackcdn.com/image/fetch/$s_!Pr_5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b25d2e-551c-428c-a9ee-0bec5e13c151_1178x383.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Pr_5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b25d2e-551c-428c-a9ee-0bec5e13c151_1178x383.png" width="1178" height="383" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/90b25d2e-551c-428c-a9ee-0bec5e13c151_1178x383.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:383,&quot;width&quot;:1178,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:147934,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/195050120?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b25d2e-551c-428c-a9ee-0bec5e13c151_1178x383.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Pr_5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b25d2e-551c-428c-a9ee-0bec5e13c151_1178x383.png 424w, https://substackcdn.com/image/fetch/$s_!Pr_5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b25d2e-551c-428c-a9ee-0bec5e13c151_1178x383.png 848w, https://substackcdn.com/image/fetch/$s_!Pr_5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b25d2e-551c-428c-a9ee-0bec5e13c151_1178x383.png 1272w, https://substackcdn.com/image/fetch/$s_!Pr_5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b25d2e-551c-428c-a9ee-0bec5e13c151_1178x383.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>VICTORY! All characters gained 7 XP. Gold went from 400 to 430. THIEF took the most damage (down to 12 HP) and the Red Mage dodged everything (still full at 30/30). That was a tough fight for level 1!</p><p>I could have said &#8220;neat side-project&#8221; and moved on. But the road from JoyCons to that VICTORY! turned out to be a surprisingly good testing ground for three things we usually write about separately: Kotlin in low-level contexts, designing APIs for LLMs, and how small interfaces scale in directions nobody imagined when writing them.</p><p>Below - a catalogue of challenges. The kind where if you ever want to build a similar setup, you&#8217;ll know where it&#8217;s going to hurt.</p><div><hr></div><h3><strong>1. An LLM Can&#8217;t See Pixels - It Needs to See RAM</strong></h3><p>The first instinct is: &#8220;give it a screenshot.&#8221; 256&#215;240 NES pixels &#8594; PNG &#8594; base64 &#8594; tens of kilobytes per tool call. The problem: Claude does see the image, but the interpretation is slow, expensive, and unreliable. Retro graphics means 8&#215;8 fonts, single-pixel menu cursors, dithered sprites. Vision models simply don&#8217;t handle this well.</p><p>How badly? The first FF1 session looked like this: Claude spent fifteen minutes walking in circles on the title screen, describing &#8220;I see a blue screen with white text, possibly the title screen&#8221; and being completely unable to extract anything useful from the image to make a decision.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vyrr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ae360b6-d698-4170-ad44-4ced513a5328_1196x381.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vyrr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ae360b6-d698-4170-ad44-4ced513a5328_1196x381.png 424w, https://substackcdn.com/image/fetch/$s_!vyrr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ae360b6-d698-4170-ad44-4ced513a5328_1196x381.png 848w, https://substackcdn.com/image/fetch/$s_!vyrr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ae360b6-d698-4170-ad44-4ced513a5328_1196x381.png 1272w, https://substackcdn.com/image/fetch/$s_!vyrr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ae360b6-d698-4170-ad44-4ced513a5328_1196x381.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vyrr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ae360b6-d698-4170-ad44-4ced513a5328_1196x381.png" width="1196" height="381" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3ae360b6-d698-4170-ad44-4ced513a5328_1196x381.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:381,&quot;width&quot;:1196,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!vyrr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ae360b6-d698-4170-ad44-4ced513a5328_1196x381.png 424w, https://substackcdn.com/image/fetch/$s_!vyrr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ae360b6-d698-4170-ad44-4ced513a5328_1196x381.png 848w, https://substackcdn.com/image/fetch/$s_!vyrr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ae360b6-d698-4170-ad44-4ced513a5328_1196x381.png 1272w, https://substackcdn.com/image/fetch/$s_!vyrr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ae360b6-d698-4170-ad44-4ced513a5328_1196x381.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>The solution came from the same place speedrunners and TAS tool-assisters have been getting theirs for two decades - the game&#8217;s RAM. Final Fantasy 1 stores screenState at $0075, character HP in sequential bytes, battleTurn, enemyCount, worldX, worldY at known addresses. That&#8217;s the <em>truth of the game</em>, not its visual representation.</p><p>In the knes-debug module I built GameProfile - static registries with a list of watched RAM addresses per game. For FF1, that&#8217;s ~40 watches established from disassembly and the <strong><a href="https://datacrystal.tcrf.net/wiki/Final_Fantasy">Data Crystal</a></strong> database. The MCP get_state tool returns a dictionary {name: value} - and suddenly Claude <em>understands</em> the game:</p><p>BATTLE! We&#8217;re fighting IMPs! I can see: 5 IMPs (enemy1 HP: 8, enemy2 HP: 8, enemyCount: 5). Our party: all 4 characters with full HP. screenState = 104 (battle), battleTurn = 2. Let me wait for battleTurn = 0x55 (player input time), then have all 4 characters FIGHT.</p><p>[SCREENSHOT: Claude Code - same game, but with RAM watches. Claude describes the tactical situation based on get_state, citing specific addresses and values. The comparison with the previous screenshot speaks for itself]</p><p>A qualitative shift. Claude doesn&#8217;t &#8220;look at the screen&#8221; - it reads RAM. Exactly what TAS-ers have been doing for years. The screenshot stays as a fallback for debugging by the human operator, but it&#8217;s no longer the primary source of information.</p><p>Lesson for anyone building anything for an LLM: map your domain to JSON. Don&#8217;t count on the vision model &#8220;seeing the table.&#8221; A symbolic representation of state is almost always better than an image - even if it means manually mapping addresses from disassembly.</p><div><hr></div><h3><strong>2. Round-Trips Kill the Gameplay</strong></h3><p>OK, so Claude reads RAM and understands what&#8217;s happening. But it plays slowly. Very slowly. <em>Really</em> very slowly.</p><p>The first version of the MCP server had one tool - step(buttons, frames). Press A for 5 frames, seems reasonable. But do the math. One A press in battle takes three tool calls: press, release and wait, check state. Each one is a round-trip through MCP + a round-trip to the model + ~1&#8211;3 seconds of thinking time. One A press: five seconds. A battle with five IMPs, where each round is four characters &#215; two presses &#215; several rounds: 60+ tool calls. Five minutes of wall-clock time for a single fight. Castle exploration: 200 tool calls. The full game: tens of thousands. Infeasible.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!v1uR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3d87e48-2d88-474b-89f4-6cf5c75e0712_2209x1400.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!v1uR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3d87e48-2d88-474b-89f4-6cf5c75e0712_2209x1400.png 424w, https://substackcdn.com/image/fetch/$s_!v1uR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3d87e48-2d88-474b-89f4-6cf5c75e0712_2209x1400.png 848w, https://substackcdn.com/image/fetch/$s_!v1uR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3d87e48-2d88-474b-89f4-6cf5c75e0712_2209x1400.png 1272w, https://substackcdn.com/image/fetch/$s_!v1uR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3d87e48-2d88-474b-89f4-6cf5c75e0712_2209x1400.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!v1uR!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3d87e48-2d88-474b-89f4-6cf5c75e0712_2209x1400.png" width="1200" height="760.7142857142857" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f3d87e48-2d88-474b-89f4-6cf5c75e0712_2209x1400.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:923,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!v1uR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3d87e48-2d88-474b-89f4-6cf5c75e0712_2209x1400.png 424w, https://substackcdn.com/image/fetch/$s_!v1uR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3d87e48-2d88-474b-89f4-6cf5c75e0712_2209x1400.png 848w, https://substackcdn.com/image/fetch/$s_!v1uR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3d87e48-2d88-474b-89f4-6cf5c75e0712_2209x1400.png 1272w, https://substackcdn.com/image/fetch/$s_!v1uR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3d87e48-2d88-474b-89f4-6cf5c75e0712_2209x1400.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Claude noticed this himself - a quote from the logs, worth reading carefully:</p><p>I realize I&#8217;m stuck on the 2nd floor of Cornelia Castle - navigating this castle one tile at a time with only the step tool is incredibly slow. [...] The tap tool alone would save enormous time - right now pressing A 5 times requires 10 tool calls (press + release gap each), while tap(&#8221;A&#8221;, count: 5) would be just 1 call.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GQxh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92e31750-d2e8-40f0-bae0-4d8b4bb5a0a5_1096x348.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GQxh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92e31750-d2e8-40f0-bae0-4d8b4bb5a0a5_1096x348.png 424w, https://substackcdn.com/image/fetch/$s_!GQxh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92e31750-d2e8-40f0-bae0-4d8b4bb5a0a5_1096x348.png 848w, https://substackcdn.com/image/fetch/$s_!GQxh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92e31750-d2e8-40f0-bae0-4d8b4bb5a0a5_1096x348.png 1272w, https://substackcdn.com/image/fetch/$s_!GQxh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92e31750-d2e8-40f0-bae0-4d8b4bb5a0a5_1096x348.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GQxh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92e31750-d2e8-40f0-bae0-4d8b4bb5a0a5_1096x348.png" width="1096" height="348" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/92e31750-d2e8-40f0-bae0-4d8b4bb5a0a5_1096x348.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:348,&quot;width&quot;:1096,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!GQxh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92e31750-d2e8-40f0-bae0-4d8b4bb5a0a5_1096x348.png 424w, https://substackcdn.com/image/fetch/$s_!GQxh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92e31750-d2e8-40f0-bae0-4d8b4bb5a0a5_1096x348.png 848w, https://substackcdn.com/image/fetch/$s_!GQxh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92e31750-d2e8-40f0-bae0-4d8b4bb5a0a5_1096x348.png 1272w, https://substackcdn.com/image/fetch/$s_!GQxh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92e31750-d2e8-40f0-bae0-4d8b4bb5a0a5_1096x348.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>(Yes, Claude complained about my API. He was right.)</p><p>The fix - three batched tools that Claude essentially co-designed with me during that same session. step got a screenshot flag so you don&#8217;t need a separate call for the screen capture. A new tap tool lets you say &#8220;press A five times with 30-frame gaps&#8221; in one call instead of ten. And finally sequence - an atomic list of steps, an entire corridor exploration as a single request with 30+ {buttons, frames} pairs.</p><p>Result: the IMP battle dropped from five minutes to ~40 seconds. Cornelia Castle became traversable. The game went from impossible to slow - but playable.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BOUS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a7f3e84-abe6-4207-b873-dafdcf7249b3_1096x394.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BOUS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a7f3e84-abe6-4207-b873-dafdcf7249b3_1096x394.png 424w, https://substackcdn.com/image/fetch/$s_!BOUS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a7f3e84-abe6-4207-b873-dafdcf7249b3_1096x394.png 848w, https://substackcdn.com/image/fetch/$s_!BOUS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a7f3e84-abe6-4207-b873-dafdcf7249b3_1096x394.png 1272w, https://substackcdn.com/image/fetch/$s_!BOUS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a7f3e84-abe6-4207-b873-dafdcf7249b3_1096x394.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BOUS!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a7f3e84-abe6-4207-b873-dafdcf7249b3_1096x394.png" width="1200" height="431.3868613138686" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4a7f3e84-abe6-4207-b873-dafdcf7249b3_1096x394.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:394,&quot;width&quot;:1096,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!BOUS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a7f3e84-abe6-4207-b873-dafdcf7249b3_1096x394.png 424w, https://substackcdn.com/image/fetch/$s_!BOUS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a7f3e84-abe6-4207-b873-dafdcf7249b3_1096x394.png 848w, https://substackcdn.com/image/fetch/$s_!BOUS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a7f3e84-abe6-4207-b873-dafdcf7249b3_1096x394.png 1272w, https://substackcdn.com/image/fetch/$s_!BOUS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a7f3e84-abe6-4207-b873-dafdcf7249b3_1096x394.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Lesson: when designing an MCP API, count how many tool calls a realistic workflow takes. If it&#8217;s more than twenty - you need a batched variant. The cost of a round-trip isn&#8217;t just network latency - it&#8217;s the cost of a <em>decision</em>. Every tool call is a separate inference step. An API for an agent is 80% a step-compression problem - and that&#8217;s a fundamentally different challenge than designing a REST API for a human.</p><div><hr></div><h3><strong>3. Race Conditions at 60 FPS</strong></h3><p>This is where things got really interesting from a JVM perspective.</p><p>The Compose UI drives the NES on its own thread - 60 frames per second, ~29,780 CPU cycles per frame. The Ktor API lives in a separate coroutine pool. When Claude sends step(buttons=[&#8221;A&#8221;], frames=1), the Ktor thread sets the button state and waits for the frame to end. Simple? No. Every third or fourth call was getting lost.</p><p>I add logging. It turns out Claude was right when he said A &#8220;didn&#8217;t work&#8221;: in a step with frames=1, the press would vanish before the NES CPU had time to poll the joypad. The FF1 game code reads port $4016 at a specific point during vblank - if setButtons() arrived a millisecond too early or too late, the input evaporated into nothing.</p><p>Naive fix: @Volatile on the state array. Helps with cross-thread visibility, doesn&#8217;t help with timing. Input can still arrive mid-frame and disappear before the poll.</p><p>The fix that actually worked: FrameInputQueue - a queue synchronized with the PPU frame boundary. The Ktor thread calls enqueue() and blocks on a CountDownLatch. The imageReady callback (fired at each frame boundary) pops the next state and counts down the latch. Short presses last exactly one frame and don&#8217;t vanish. The API thread blocks deterministically until the end of the requested sequence. Zero mutexes - @Volatile, ConcurrentLinkedQueue, CountDownLatch. Three classes from java.util.concurrent and the problem is solved.</p><p>Lesson: concurrency in retro emulation is hardware ticking at a specific frequency that couldn&#8217;t care less about your Ktor thread. The JVM gives you exactly the tools to build the bridge, but you need to know <em>what</em> you&#8217;re synchronizing. In this case: the PPU frame boundary. Not &#8220;access to a variable,&#8221; not &#8220;a critical section&#8221; - the physical moment when the virtual cathode ray finishes drawing the image.</p><h3><strong>4. &#8220;looks like cheating but you can try :D&#8221;</strong></h3><p>With the timing fixed and the batched tools in place, Claude was playing. Slowly, but playing - and that&#8217;s when the most interesting design moment of the whole project happened.</p><p>During the IMP grinding, Claude suggested:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nSQA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F604ec07c-50d0-4b2e-b79f-5034be5c9caf_1188x227.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nSQA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F604ec07c-50d0-4b2e-b79f-5034be5c9caf_1188x227.png 424w, https://substackcdn.com/image/fetch/$s_!nSQA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F604ec07c-50d0-4b2e-b79f-5034be5c9caf_1188x227.png 848w, https://substackcdn.com/image/fetch/$s_!nSQA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F604ec07c-50d0-4b2e-b79f-5034be5c9caf_1188x227.png 1272w, https://substackcdn.com/image/fetch/$s_!nSQA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F604ec07c-50d0-4b2e-b79f-5034be5c9caf_1188x227.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nSQA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F604ec07c-50d0-4b2e-b79f-5034be5c9caf_1188x227.png" width="1188" height="227" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/604ec07c-50d0-4b2e-b79f-5034be5c9caf_1188x227.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:227,&quot;width&quot;:1188,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!nSQA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F604ec07c-50d0-4b2e-b79f-5034be5c9caf_1188x227.png 424w, https://substackcdn.com/image/fetch/$s_!nSQA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F604ec07c-50d0-4b2e-b79f-5034be5c9caf_1188x227.png 848w, https://substackcdn.com/image/fetch/$s_!nSQA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F604ec07c-50d0-4b2e-b79f-5034be5c9caf_1188x227.png 1272w, https://substackcdn.com/image/fetch/$s_!nSQA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F604ec07c-50d0-4b2e-b79f-5034be5c9caf_1188x227.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>I typed, half-joking: &#8220;looks like cheating.&#8221;</p><p>Claude, after a brief pause: &#8220;looks like cheating but you can try :D&#8221; - and immediately started exploring how to implement it.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dxcy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e462097-d423-49f2-ac94-373b27bf7885_1199x239.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dxcy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e462097-d423-49f2-ac94-373b27bf7885_1199x239.png 424w, https://substackcdn.com/image/fetch/$s_!dxcy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e462097-d423-49f2-ac94-373b27bf7885_1199x239.png 848w, https://substackcdn.com/image/fetch/$s_!dxcy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e462097-d423-49f2-ac94-373b27bf7885_1199x239.png 1272w, https://substackcdn.com/image/fetch/$s_!dxcy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e462097-d423-49f2-ac94-373b27bf7885_1199x239.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dxcy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e462097-d423-49f2-ac94-373b27bf7885_1199x239.png" width="1199" height="239" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1e462097-d423-49f2-ac94-373b27bf7885_1199x239.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:239,&quot;width&quot;:1199,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!dxcy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e462097-d423-49f2-ac94-373b27bf7885_1199x239.png 424w, https://substackcdn.com/image/fetch/$s_!dxcy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e462097-d423-49f2-ac94-373b27bf7885_1199x239.png 848w, https://substackcdn.com/image/fetch/$s_!dxcy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e462097-d423-49f2-ac94-373b27bf7885_1199x239.png 1272w, https://substackcdn.com/image/fetch/$s_!dxcy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e462097-d423-49f2-ac94-373b27bf7885_1199x239.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>I stopped him with one serious sentence: <strong>&#8220;Yes, but one rule - don&#8217;t do anything that is not allowed on real NES.&#8221;</strong></p><p>That constraint - imposed via a single line in a chat - became the foundation of all subsequent architecture. The agent can read RAM (the equivalent of looking at the screen), press buttons (A, B, START, SELECT, D-pad), and wait. That&#8217;s it. No memory writes, no save states, no RNG manipulation. No enemy_hp = 0.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HeA0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5664d62b-1707-415e-be23-3aad3ae141de_1200x393.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HeA0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5664d62b-1707-415e-be23-3aad3ae141de_1200x393.png 424w, https://substackcdn.com/image/fetch/$s_!HeA0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5664d62b-1707-415e-be23-3aad3ae141de_1200x393.png 848w, https://substackcdn.com/image/fetch/$s_!HeA0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5664d62b-1707-415e-be23-3aad3ae141de_1200x393.png 1272w, https://substackcdn.com/image/fetch/$s_!HeA0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5664d62b-1707-415e-be23-3aad3ae141de_1200x393.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HeA0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5664d62b-1707-415e-be23-3aad3ae141de_1200x393.png" width="1200" height="393" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5664d62b-1707-415e-be23-3aad3ae141de_1200x393.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:393,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!HeA0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5664d62b-1707-415e-be23-3aad3ae141de_1200x393.png 424w, https://substackcdn.com/image/fetch/$s_!HeA0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5664d62b-1707-415e-be23-3aad3ae141de_1200x393.png 848w, https://substackcdn.com/image/fetch/$s_!HeA0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5664d62b-1707-415e-be23-3aad3ae141de_1200x393.png 1272w, https://substackcdn.com/image/fetch/$s_!HeA0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5664d62b-1707-415e-be23-3aad3ae141de_1200x393.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>From that rule emerged a pluggable GameAction system - an interface through which you can write bots for any NES game, with their maximum power bounded by the physics of a real controller:</p><pre><code><code>interface ActionController {
    fun readRam(addr: Int): Int
    fun pressButton(key: Int, pressFrames: Int, gapFrames: Int)
    fun waitFrames(n: Int)
    // nothing else. No writeRam. No saveState.
}</code></code></pre><p>The first implementation - BattleFightAll for FF1 - reads screenState, waits for battleTurn to indicate player input time, presses A twice per character (FIGHT + default target), waits for the round animation, repeats. It&#8217;s not a cheat. It has no access to anything a human player with a thumb on A wouldn&#8217;t have. The only &#8220;advantage&#8221; - zero reaction time. It plays ~3&#215; faster than I do with a gamepad, but under exactly the same rules.</p><div><hr></div><p>And here&#8217;s the moral I&#8217;ve been building toward from the start: constraining an agent to &#8220;what a human can do&#8221; is not a moral flag. It&#8217;s a design tool. Without that constraint, I&#8217;d have ended up with a function that writes to memory and returns. Instead, I have a framework with clean architecture that can be extended to other games. Design constraints pay dividends in elegance - and that&#8217;s probably the most important lesson from a year of working on kNES.</p><div><hr></div><h3><strong>What You Take Away If You&#8217;re Not Writing an Emulator</strong></h3><p>Most JVM Weekly readers won&#8217;t be writing NES emulators (heh, at least I assume so). But four things from this project transfer 1:1 to any JVM app integration with an LLM.</p><p>First - <strong>small interfaces are an investment</strong>. ControllerProvider was born in a hotel room at Kotlin Dev Days because I wanted to play with JoyCons instead of a keyboard. A few weeks later it turned out to be a universal entry point for HTTP, MCP, and an autonomous agent - without touching a single line in the 6502 CPU. Interfaces pay off not when you add the second implementation, but when the third one grows out of a use case that didn&#8217;t exist when you wrote the code.</p><p>Second - <strong>symbolic state representation beats a screenshot</strong>. Map your domain to JSON. Don&#8217;t count on the vision model &#8220;seeing&#8221; what it needs to - even if that means hand-typing RAM addresses from a disassembly.</p><p>Third - <strong>batch your tool calls</strong>. Every round-trip is a separate inference step. step + get_state + get_screen &#8594; one step(screenshot: true). Simple refactor, 3&#215; more throughput. If your agent needs more than 20 calls for a single task - you have an architectural problem, not a performance one.</p><p>Fourth - <strong>constraint is a gift</strong>. Imposing &#8220;the agent can only do what a human can&#8221; forced a better architecture than &#8220;let&#8217;s build a function that wins the fight.&#8221; Next time you&#8217;re tempted to give the agent a shortcut - consider whether a constraint might be the better choice.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!F0FF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93a93602-d65b-4a36-b695-2fce4e436541_796x707.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!F0FF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93a93602-d65b-4a36-b695-2fce4e436541_796x707.png 424w, https://substackcdn.com/image/fetch/$s_!F0FF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93a93602-d65b-4a36-b695-2fce4e436541_796x707.png 848w, https://substackcdn.com/image/fetch/$s_!F0FF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93a93602-d65b-4a36-b695-2fce4e436541_796x707.png 1272w, https://substackcdn.com/image/fetch/$s_!F0FF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93a93602-d65b-4a36-b695-2fce4e436541_796x707.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!F0FF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93a93602-d65b-4a36-b695-2fce4e436541_796x707.png" width="796" height="707" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/93a93602-d65b-4a36-b695-2fce4e436541_796x707.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:707,&quot;width&quot;:796,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!F0FF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93a93602-d65b-4a36-b695-2fce4e436541_796x707.png 424w, https://substackcdn.com/image/fetch/$s_!F0FF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93a93602-d65b-4a36-b695-2fce4e436541_796x707.png 848w, https://substackcdn.com/image/fetch/$s_!F0FF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93a93602-d65b-4a36-b695-2fce4e436541_796x707.png 1272w, https://substackcdn.com/image/fetch/$s_!F0FF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93a93602-d65b-4a36-b695-2fce4e436541_796x707.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Code: <strong><a href="http://github.com/ArturSkowronski/kNES">github.com/ArturSkowronski/kNES</a></strong>. This also powers <strong><a href="https://www.linkedin.com/company/geecon-conference/">geecon</a></strong> talk - I&#8217;m hoping to show it live, with Claude driving the emulator from the stage. You are all invited &#128513;</p><div><hr></div><h3><strong>PS: Five KotlinConf 2026 Talks I&#8217;m Keeping an Eye On</strong></h3><p>Since we&#8217;re on the topic of KotlinConf - this year the conference moves to Munich (May 21&#8211;22, workshops on May 20) and the agenda is packed. 80+ talks, eight parallel tracks. I went through it pencil in hand (yes, I know - analog) and picked five sessions I personally plan to attend. This isn&#8217;t a ranking - more of a subjective list from someone who spent the last year thinking about Kotlin in unusual contexts.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Vr9E!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53ee6b46-d429-4ba7-8a78-7d82b59e4af0_694x217.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Vr9E!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53ee6b46-d429-4ba7-8a78-7d82b59e4af0_694x217.png 424w, https://substackcdn.com/image/fetch/$s_!Vr9E!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53ee6b46-d429-4ba7-8a78-7d82b59e4af0_694x217.png 848w, https://substackcdn.com/image/fetch/$s_!Vr9E!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53ee6b46-d429-4ba7-8a78-7d82b59e4af0_694x217.png 1272w, https://substackcdn.com/image/fetch/$s_!Vr9E!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53ee6b46-d429-4ba7-8a78-7d82b59e4af0_694x217.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Vr9E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53ee6b46-d429-4ba7-8a78-7d82b59e4af0_694x217.png" width="694" height="217" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/53ee6b46-d429-4ba7-8a78-7d82b59e4af0_694x217.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:217,&quot;width&quot;:694,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Vr9E!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53ee6b46-d429-4ba7-8a78-7d82b59e4af0_694x217.png 424w, https://substackcdn.com/image/fetch/$s_!Vr9E!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53ee6b46-d429-4ba7-8a78-7d82b59e4af0_694x217.png 848w, https://substackcdn.com/image/fetch/$s_!Vr9E!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53ee6b46-d429-4ba7-8a78-7d82b59e4af0_694x217.png 1272w, https://substackcdn.com/image/fetch/$s_!Vr9E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53ee6b46-d429-4ba7-8a78-7d82b59e4af0_694x217.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p></p><p><strong><a href="https://kotlinconf.com/schedule/?day=2026-05-22&amp;session=5634b2b7-199e-5288-bf34-213b33d5b934">Deconstructing OkHttp</a> by <a href="https://www.linkedin.com/in/swankjesse?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAABG44BsBaJRuFBHqtVx-yuoAEe6ShKGKEJQ">Jesse Wilson</a></strong></p><p>Jesse doesn&#8217;t show <em>how to use</em> OkHttp - he takes it apart. Interceptor architecture, connection lifecycle, caching state machines, performance optimizations. A masterclass in reading and learning from high-quality Kotlin code. Anyone who&#8217;s written anything low-level in this language (ahem, emulators) knows that a deep-dive into a well-designed library teaches more than five tutorials. Jesse has been a guarantee of presentation quality for years - this is a talk I&#8217;d go to even if I&#8217;d never touched OkHttp.</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WZ4B!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedbbf728-e3df-4b13-8a76-6ac2a4e3e6be_701x261.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WZ4B!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedbbf728-e3df-4b13-8a76-6ac2a4e3e6be_701x261.png 424w, https://substackcdn.com/image/fetch/$s_!WZ4B!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedbbf728-e3df-4b13-8a76-6ac2a4e3e6be_701x261.png 848w, https://substackcdn.com/image/fetch/$s_!WZ4B!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedbbf728-e3df-4b13-8a76-6ac2a4e3e6be_701x261.png 1272w, https://substackcdn.com/image/fetch/$s_!WZ4B!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedbbf728-e3df-4b13-8a76-6ac2a4e3e6be_701x261.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WZ4B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedbbf728-e3df-4b13-8a76-6ac2a4e3e6be_701x261.png" width="701" height="261" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/edbbf728-e3df-4b13-8a76-6ac2a4e3e6be_701x261.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:261,&quot;width&quot;:701,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!WZ4B!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedbbf728-e3df-4b13-8a76-6ac2a4e3e6be_701x261.png 424w, https://substackcdn.com/image/fetch/$s_!WZ4B!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedbbf728-e3df-4b13-8a76-6ac2a4e3e6be_701x261.png 848w, https://substackcdn.com/image/fetch/$s_!WZ4B!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedbbf728-e3df-4b13-8a76-6ac2a4e3e6be_701x261.png 1272w, https://substackcdn.com/image/fetch/$s_!WZ4B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedbbf728-e3df-4b13-8a76-6ac2a4e3e6be_701x261.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong><a href="https://kotlinconf.com/schedule/?day=2026-05-21&amp;session=da287f7e-7903-5566-916f-ba7132f4265c">Talking to Terminals (And How They Talk Back)</a> - Jake Wharton</strong></p><p>How terminals actually communicate with applications - colors, sizing, frame sync, images, keyboard events - and how to handle it all in Kotlin, including JVM vs. Kotlin/Native differences. Sounds niche? Maybe. But this is exactly the type of talk after which you go back to your hotel and rewrite half your tooling. </p><p>As someone who rendered a NES in a terminal, I can confirm: low-level terminal APIs are a rabbit hole you don&#8217;t leave without a few scars. Jake is one of the few people I trust on this topic.</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VKru!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48d6418d-efa9-47ad-882f-7e7b4c9b8d94_687x252.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VKru!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48d6418d-efa9-47ad-882f-7e7b4c9b8d94_687x252.png 424w, https://substackcdn.com/image/fetch/$s_!VKru!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48d6418d-efa9-47ad-882f-7e7b4c9b8d94_687x252.png 848w, https://substackcdn.com/image/fetch/$s_!VKru!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48d6418d-efa9-47ad-882f-7e7b4c9b8d94_687x252.png 1272w, https://substackcdn.com/image/fetch/$s_!VKru!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48d6418d-efa9-47ad-882f-7e7b4c9b8d94_687x252.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VKru!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48d6418d-efa9-47ad-882f-7e7b4c9b8d94_687x252.png" width="687" height="252" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/48d6418d-efa9-47ad-882f-7e7b4c9b8d94_687x252.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:252,&quot;width&quot;:687,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!VKru!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48d6418d-efa9-47ad-882f-7e7b4c9b8d94_687x252.png 424w, https://substackcdn.com/image/fetch/$s_!VKru!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48d6418d-efa9-47ad-882f-7e7b4c9b8d94_687x252.png 848w, https://substackcdn.com/image/fetch/$s_!VKru!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48d6418d-efa9-47ad-882f-7e7b4c9b8d94_687x252.png 1272w, https://substackcdn.com/image/fetch/$s_!VKru!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48d6418d-efa9-47ad-882f-7e7b4c9b8d94_687x252.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong><a href="https://kotlinconf.com/schedule/?day=2026-05-22&amp;session=79d85562-665b-5d9b-b78c-d230bd7d8a37">Full-Stack Kotlin AI: Koog + MCP</a></strong> -<strong> <a href="https://www.linkedin.com/in/johnoreilly?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAAAfehYBrxvpdA41DwFehKPRrSQ5j_IsC0c">John O&#8217;Reilly</a></strong></p><p>This talk is close to my heart for obvious reasons - MCP, AI agents, Kotlin, all in one. John shows how to use Koog (JetBrains&#8217; agent framework) as the intelligent core of a Compose Multiplatform app, connecting to an MCP server through the Kotlin MCP SDK with both cloud and on-device LLM integration. Anyone who read the sections above about my battles with tool calls knows this isn&#8217;t an academic topic. I&#8217;m genuinely curious whether John hit the same round-trip pitfalls I did - and how he solved them.</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!d7lj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3286d05b-e25e-4b4f-bdd5-9c78602aa905_699x291.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!d7lj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3286d05b-e25e-4b4f-bdd5-9c78602aa905_699x291.png 424w, https://substackcdn.com/image/fetch/$s_!d7lj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3286d05b-e25e-4b4f-bdd5-9c78602aa905_699x291.png 848w, https://substackcdn.com/image/fetch/$s_!d7lj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3286d05b-e25e-4b4f-bdd5-9c78602aa905_699x291.png 1272w, https://substackcdn.com/image/fetch/$s_!d7lj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3286d05b-e25e-4b4f-bdd5-9c78602aa905_699x291.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!d7lj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3286d05b-e25e-4b4f-bdd5-9c78602aa905_699x291.png" width="699" height="291" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3286d05b-e25e-4b4f-bdd5-9c78602aa905_699x291.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:291,&quot;width&quot;:699,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!d7lj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3286d05b-e25e-4b4f-bdd5-9c78602aa905_699x291.png 424w, https://substackcdn.com/image/fetch/$s_!d7lj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3286d05b-e25e-4b4f-bdd5-9c78602aa905_699x291.png 848w, https://substackcdn.com/image/fetch/$s_!d7lj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3286d05b-e25e-4b4f-bdd5-9c78602aa905_699x291.png 1272w, https://substackcdn.com/image/fetch/$s_!d7lj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3286d05b-e25e-4b4f-bdd5-9c78602aa905_699x291.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong><a href="https://kotlinconf.com/schedule/?day=2026-05-21&amp;session=eefcaa12-46b9-5575-a129-a37c793b4c29">How google.com/search builds on Kotlin coroutines for highly scalable, streaming, concurrent servers</a> - <a href="https://www.linkedin.com/in/sberlin?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAAA3WzEBRShNCE2qtKNn7QeG8Xl3oZeivmk">Sam Berlin</a> &amp; <a href="https://www.linkedin.com/in/alessiodellamotta?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAAVORisBPUk_VwPDLacWtaa6nAcrM1TeKlw">Alessio Della Motta</a></strong></p><p>Google Search running on Kotlin coroutines. Qflow, latency instrumentation, critical path analysis in &#8220;asynchronous by default&#8221; systems. I was wrestling with synchronizing one emulator thread with one Ktor thread. These folks synchronize billions of requests. The perspective is slightly different (heh), but the fundamentals - Kotlin, coroutines, java.util.concurrent - are the same. This is the kind of talk where the sheer scale of the system forces solutions you wouldn&#8217;t normally even think about, and you leave the room with a head full of ideas.</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Vc7A!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bb72a35-0937-421f-9f97-337ed90a9707_676x243.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Vc7A!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bb72a35-0937-421f-9f97-337ed90a9707_676x243.png 424w, https://substackcdn.com/image/fetch/$s_!Vc7A!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bb72a35-0937-421f-9f97-337ed90a9707_676x243.png 848w, https://substackcdn.com/image/fetch/$s_!Vc7A!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bb72a35-0937-421f-9f97-337ed90a9707_676x243.png 1272w, https://substackcdn.com/image/fetch/$s_!Vc7A!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bb72a35-0937-421f-9f97-337ed90a9707_676x243.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Vc7A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bb72a35-0937-421f-9f97-337ed90a9707_676x243.png" width="676" height="243" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4bb72a35-0937-421f-9f97-337ed90a9707_676x243.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:243,&quot;width&quot;:676,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Vc7A!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bb72a35-0937-421f-9f97-337ed90a9707_676x243.png 424w, https://substackcdn.com/image/fetch/$s_!Vc7A!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bb72a35-0937-421f-9f97-337ed90a9707_676x243.png 848w, https://substackcdn.com/image/fetch/$s_!Vc7A!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bb72a35-0937-421f-9f97-337ed90a9707_676x243.png 1272w, https://substackcdn.com/image/fetch/$s_!Vc7A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bb72a35-0937-421f-9f97-337ed90a9707_676x243.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong><a href="https://kotlinconf.com/schedule/?day=2026-05-21&amp;session=81ca2bb9-7797-5b13-aa65-87d9143614ca">Go Get It, with Kotlin: Evolving Uber&#8217;s Java Backend</a> - <a href="https://www.linkedin.com/in/ryanulep?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAABgoQNEBm0nePjpi6cFb5dTACC1V4T8AGIY">Ryan U.</a></strong></p><p>Uber introduced Kotlin into their <em>massive</em> Java monorepo. Building the business case, patching tooling gaps, overcoming skepticism, enabling adoption for thousands of engineers. After last year&#8217;s talk by Ty Smith on migrating millions of lines of Java to Kotlin - which was my favorite from KotlinConf 2025 - this one looks like a natural continuation of the theme. Large-scale migration is the kind of problem that looks simple from a distance and turns into a labyrinth up close. I&#8217;m expecting solid engineering substance.</p><div><hr></div><p>Full KotlinConf 2026 agenda: <strong><a href="http://kotlinconf.com/schedule">kotlinconf.com/schedule</a></strong>.  See you in Munich!</p><p>PS: This is the last opportunity to buy tickets - Last Call &#129323;. Just Saying</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ut0b!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c0f02b6-5a26-4f58-a195-6bcdb7f5e6ba_1290x648.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ut0b!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c0f02b6-5a26-4f58-a195-6bcdb7f5e6ba_1290x648.png 424w, https://substackcdn.com/image/fetch/$s_!Ut0b!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c0f02b6-5a26-4f58-a195-6bcdb7f5e6ba_1290x648.png 848w, https://substackcdn.com/image/fetch/$s_!Ut0b!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c0f02b6-5a26-4f58-a195-6bcdb7f5e6ba_1290x648.png 1272w, https://substackcdn.com/image/fetch/$s_!Ut0b!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c0f02b6-5a26-4f58-a195-6bcdb7f5e6ba_1290x648.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ut0b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c0f02b6-5a26-4f58-a195-6bcdb7f5e6ba_1290x648.png" width="1290" height="648" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8c0f02b6-5a26-4f58-a195-6bcdb7f5e6ba_1290x648.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:648,&quot;width&quot;:1290,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Ut0b!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c0f02b6-5a26-4f58-a195-6bcdb7f5e6ba_1290x648.png 424w, https://substackcdn.com/image/fetch/$s_!Ut0b!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c0f02b6-5a26-4f58-a195-6bcdb7f5e6ba_1290x648.png 848w, https://substackcdn.com/image/fetch/$s_!Ut0b!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c0f02b6-5a26-4f58-a195-6bcdb7f5e6ba_1290x648.png 1272w, https://substackcdn.com/image/fetch/$s_!Ut0b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c0f02b6-5a26-4f58-a195-6bcdb7f5e6ba_1290x648.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[What's coming in JDK 27... and why OpenJDK just said no to your Copilot - JVM Weekly vol. 171]]></title><description><![CDATA[The schedule is on the table, Valhalla is on the horizon, and OpenJDK says "no" to AI-generated code.]]></description><link>https://www.jvm-weekly.com/p/whats-coming-in-jdk-27-and-why-openjdk</link><guid isPermaLink="false">https://www.jvm-weekly.com/p/whats-coming-in-jdk-27-and-why-openjdk</guid><dc:creator><![CDATA[Artur Skowronski]]></dc:creator><pubDate>Thu, 16 Apr 2026 13:03:07 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!WEzJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e6834fc-f96a-42be-89d1-6613823eb83a_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WEzJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e6834fc-f96a-42be-89d1-6613823eb83a_1456x1048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WEzJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e6834fc-f96a-42be-89d1-6613823eb83a_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!WEzJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e6834fc-f96a-42be-89d1-6613823eb83a_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!WEzJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e6834fc-f96a-42be-89d1-6613823eb83a_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!WEzJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e6834fc-f96a-42be-89d1-6613823eb83a_1456x1048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WEzJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e6834fc-f96a-42be-89d1-6613823eb83a_1456x1048.png" width="1456" height="1048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6e6834fc-f96a-42be-89d1-6613823eb83a_1456x1048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1048,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2020008,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/194397851?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e6834fc-f96a-42be-89d1-6613823eb83a_1456x1048.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!WEzJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e6834fc-f96a-42be-89d1-6613823eb83a_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!WEzJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e6834fc-f96a-42be-89d1-6613823eb83a_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!WEzJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e6834fc-f96a-42be-89d1-6613823eb83a_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!WEzJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e6834fc-f96a-42be-89d1-6613823eb83a_1456x1048.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Just a month after JDK 26 shipped, the release machine is already running at full speed. Mark Reinhold has formally <strong><a href="https://www.infoq.com/news/2026/04/java-news-roundup-apr06-2026/">proposed the release schedule for JDK 27</a></strong>, early-access builds are already in double digits, and on top of that, the JVM community is buzzing with discussion around OpenJDK&#8217;s new policy on generative AI. A lot is happening - let&#8217;s break it down.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2><strong>1. JDK 27: The Calendar and the Only (So Far) Official JEP</strong></h2><p><strong><a href="https://inside.java/u/MarkReinhold/">Mark Reinhold</a></strong>, Chief Architect of the Java Platform Group at Oracle, formally proposed the release schedule for JDK 27: <strong>Rampdown Phase One</strong> (fork from main line) is set for <strong>June 4, 2026</strong>, with GA - as tradition dictates - in September. The review period for this schedule concluded on April 13, so we can effectively treat these dates as locked in. <strong><a href="https://jdk.java.net/27/">Build 17 early-access</a></strong> is already publicly available.</p><p>This means JDK developers have less than two months to target additional JEPs. And right now, we formally have <strong>one single</strong> officially targeted JEP: <strong><a href="https://openjdk.org/jeps/527">JEP 527: Post-Quantum Hybrid Key Exchange for TLS 1.3</a></strong>. It enhances TLS 1.3 with a hybrid key exchange mechanism resistant to quantum computing attacks, building on <strong><a href="https://openjdk.org/jeps/496">JEP 496</a></strong> (Quantum-Resistant ML-KEM) delivered in JDK 24. The topic of &#8220;quantum-ready&#8221; cryptography is slowly shifting from the &#8220;science fiction&#8221; category to &#8220;infrastructure we should have had yesterday&#8221; - especially if you operate in regulated sectors. The first JEP targeted to the twenty-seventh version of Java is about security - and that says something about priorities.</p><p>But &#8220;one official JEP&#8221; doesn&#8217;t mean it&#8217;s going to be boring. Based on JEPs in Candidate status and active drafts, we can point with reasonable confidence to what else should land in JDK 27 - and this is where things get interesting.</p><h2><strong>2. Valhalla Finally Knocks on the Door: JEP 401 Value Classes</strong></h2><p>If I had to bet on which JEP will be the most important one in JDK 27, I&#8217;d go all in on <strong><a href="https://openjdk.org/jeps/401">JEP 401: Value Classes and Objects (Preview)</a></strong>. Project Valhalla, after <em>years</em> of conceptual work and prototyping, has a real chance of debuting in preview in the mainline JDK.</p><p>What&#8217;s the deal? Value classes are classes whose instances lack object identity. == compares them by field values, not by reference. Sounds simple, but the implications are massive - the JVM can optimize their memory layout through heap flattening (objects in arrays stored flat, without indirection) and scalarization (avoiding allocation in JIT-compiled code). And the code change? Laughably small:</p><pre><code><code>// One keyword changes everything
public value class Point {
    private final int x;
    private final int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

// Works with records too:
public value record Color(byte r, byte g, byte b) {}</code></code></pre><p>The value keyword before class or record - and instances lose their object identity. All fields are implicitly final, the class is implicitly final, and the JVM gains optimization freedom. Inside the early-access build, JDK classes like Integer and LocalDate become value classes, which yields rather spectacular results in JShell:</p><pre><code><code>jshell&gt; Objects.hasIdentity(Integer.valueOf(123))
$1 ==&gt; false

jshell&gt; Objects.hasIdentity("abc")
$2 ==&gt; true

jshell&gt; LocalDate d1 = LocalDate.of(2025, 1, 1)
jshell&gt; LocalDate d3 = d1.plusYears(1).minusYears(1)
jshell&gt; d1 == d3
$8 ==&gt; true   // two different "instances", same day &#8212; == returns true!</code></code></pre><p>After years of writing about Valhalla, seeing this in JShell genuinely hits different.</p><p>The <strong><a href="https://openjdk.org/projects/valhalla/value-objects">Valhalla team published the latest early-access build in March 2026</a></strong> and is actively encouraging developers to test on real-world workloads. Worth noting: <strong><a href="https://nipafx.dev/inside-java-newscast-100/">Nicolai Parlog on Inside Java Newscast #100</a></strong> did an excellent job explaining value class semantics - the syntactic change is laughably small (the contextual keyword value before class or record), but everything else follows from it. Highly recommended.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0Ez6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadd638d3-510d-481c-b18a-31cc8d8afd73_500x500.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0Ez6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadd638d3-510d-481c-b18a-31cc8d8afd73_500x500.png 424w, https://substackcdn.com/image/fetch/$s_!0Ez6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadd638d3-510d-481c-b18a-31cc8d8afd73_500x500.png 848w, https://substackcdn.com/image/fetch/$s_!0Ez6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadd638d3-510d-481c-b18a-31cc8d8afd73_500x500.png 1272w, https://substackcdn.com/image/fetch/$s_!0Ez6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadd638d3-510d-481c-b18a-31cc8d8afd73_500x500.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0Ez6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadd638d3-510d-481c-b18a-31cc8d8afd73_500x500.png" width="500" height="500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/add638d3-510d-481c-b18a-31cc8d8afd73_500x500.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:500,&quot;width&quot;:500,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!0Ez6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadd638d3-510d-481c-b18a-31cc8d8afd73_500x500.png 424w, https://substackcdn.com/image/fetch/$s_!0Ez6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadd638d3-510d-481c-b18a-31cc8d8afd73_500x500.png 848w, https://substackcdn.com/image/fetch/$s_!0Ez6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadd638d3-510d-481c-b18a-31cc8d8afd73_500x500.png 1272w, https://substackcdn.com/image/fetch/$s_!0Ez6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadd638d3-510d-481c-b18a-31cc8d8afd73_500x500.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>And as a bonus - if JEP 401 enters preview, it will finally unblock the <strong>Vector API</strong>, which has been incubating since JDK 16 (currently in its eleventh round...) waiting precisely for Valhalla to properly express its types. As <strong><a href="https://www.javacodegeeks.com/2026/03/vector-api-at-eleven-incubations-why-this-api-takes-so-long-and-whats-blocking-it.html">Java Code Geeks analyzed</a></strong>, JDK 27 or JDK 28 is the most likely window for that transition. Twelve to fourteen total incubations - sounds absurd, but the incubation model is working exactly as designed. Shipping a structurally wrong API permanently would have been the real mistake.</p><h2><strong>3. The Rest of the Candidates: Lazy Constants, Pattern Matching, and ZGC</strong></h2><p>Beyond Valhalla, there are several more JEPs that should land in JDK 27.</p><p><strong><a href="https://openjdk.org/jeps/531">JEP 531: Lazy Constants (Third Preview)</a></strong> - the third preview round of what used to be called Stable Values, and before that, Computed Constants. In this iteration, changes include removing the isInitialized() and orElse() methods from the LazyConstant interface (as they didn&#8217;t align with the feature&#8217;s design goals) and a new ofLazy() factory method for creating stable collections - List, Set, and Map with pre-defined, lazily initialized elements. The new addition in the third preview - Set.ofLazy() - looks like this in practice:</p><pre><code><code>class Application {
    enum Option { VERBOSE, DRY_RUN, STRICT }

    // Each Set element is initialized lazily, only on first access
    static final Set&lt;Option&gt; OPTIONS =
        Set.ofLazy(EnumSet.allOf(Option.class), Application::isEnabled);

    private static boolean isEnabled(Option option) {
        // Parse CLI, read config, query database... expensive operations
    }

    public static void process() {
        if (OPTIONS.contains(Option.DRY_RUN)) {
            return;  // Only this option gets initialized
        }
        // ...
    }
}

// And Map.ofLazy() enables even more expressive patterns:
static final Map&lt;String, OrderController&gt; ORDERS =
    Map.ofLazy(
        Set.of("Customers", "Internal", "Testing"),
        _ -&gt; new OrderController()
    );</code></code></pre><p>The key idea: every element in the collection sits in its own LazyConstant and initializes only on first access. Thread-safe by construction, and the JVM can constant-fold after initialization. The feature consistently matures with each iteration and is getting closer to finalization.</p><p><strong><a href="https://openjdk.org/jeps/532">JEP 532: Primitive Types in Patterns, instanceof, and switch (Fifth Preview)</a></strong> &#8212; the fifth (!) preview round, this time with no changes from the fourth in JDK 26. It has just advanced to Candidate status. It extends pattern matching with primitive types in all pattern contexts, adds tighter dominance checks in switch, and refines the definition of unconditional exactness. The fact that there are no changes paradoxically suggests finalization is close &#8212; the feature has matured to the point where there&#8217;s nothing left to fix. Been with us since JDK 23 - if you&#8217;re counting preview rounds on your fingers, you&#8217;ve run out of one hand.</p><p><strong>JEP Draft 8329758: Faster Startup and Warmup with ZGC</strong> - still a draft (so it might not make it into JDK 27), but the direction is clear: the Z Garbage Collector should more efficiently allocate memory at application startup, minimizing the initial heap and OS overhead. Together with JEP 516 (AOT Object Caching with Any GC) from JDK 26, Project Leyden is steadily building the foundation for faster Java startup. The patient will be rewarded - though with Leyden, patience is measured in <em>releases</em>.</p><h2><strong>4. OpenJDK Bans AI-Generated Code: &#8220;Use It, But Don&#8217;t Commit It&#8221;</strong></h2><p>And now for the topic that electrified not just the JVM world.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!d9wQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0026869c-abca-42ee-9014-d5f6640504ec_641x390.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!d9wQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0026869c-abca-42ee-9014-d5f6640504ec_641x390.png 424w, https://substackcdn.com/image/fetch/$s_!d9wQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0026869c-abca-42ee-9014-d5f6640504ec_641x390.png 848w, https://substackcdn.com/image/fetch/$s_!d9wQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0026869c-abca-42ee-9014-d5f6640504ec_641x390.png 1272w, https://substackcdn.com/image/fetch/$s_!d9wQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0026869c-abca-42ee-9014-d5f6640504ec_641x390.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!d9wQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0026869c-abca-42ee-9014-d5f6640504ec_641x390.png" width="641" height="390" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0026869c-abca-42ee-9014-d5f6640504ec_641x390.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:390,&quot;width&quot;:641,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!d9wQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0026869c-abca-42ee-9014-d5f6640504ec_641x390.png 424w, https://substackcdn.com/image/fetch/$s_!d9wQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0026869c-abca-42ee-9014-d5f6640504ec_641x390.png 848w, https://substackcdn.com/image/fetch/$s_!d9wQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0026869c-abca-42ee-9014-d5f6640504ec_641x390.png 1272w, https://substackcdn.com/image/fetch/$s_!d9wQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0026869c-abca-42ee-9014-d5f6640504ec_641x390.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>OpenJDK <strong><a href="https://openjdk.org/legal/ai">published an Interim Policy on Generative AI</a></strong> that unambiguously prohibits contributing content generated by LLMs, diffusion models, or other deep-learning systems. The policy covers not just source code, but also text and images in Git repositories, GitHub pull requests, email messages, wiki pages, and JBS issues.</p><p>Interestingly - this isn&#8217;t a blanket AI ban. The policy <strong>explicitly encourages</strong> private use of generative AI tools to comprehend, debug, and review existing code, as well as for research related to OpenJDK Projects. The restriction applies solely to one step: creating and submitting content generated by those tools. Even sharing output with a colleague is fine &#8212; as long as you add a comment identifying it as AI-generated.</p><p>The rationale is three-layered, and it&#8217;s worth understanding because it describes the realities of large open source projects well.</p><p>First - <strong>reviewer burden.</strong> Generative AI makes it easy to create large quantities of &#8220;plausible-looking&#8221; code with &#8220;plausible-looking&#8221; tests that is nonetheless incorrect or poorly designed. As someone on <strong><a href="https://news.ycombinator.com/item?id=47721063">Hacker News aptly summarized</a></strong>: the number and size of AI-assisted PRs have reached a tipping point, and &#8220;filtering out even the obvious ones is a drain&#8221; on the already limited time of human reviewers.</p><p>Second - <strong>safety and security.</strong> The JDK sits at the foundation of mission-critical systems worldwide. Plausible-looking but incorrect code poses a direct risk to those systems. OpenJDK can&#8217;t afford to be a testing ground.</p><p>Third - <strong>intellectual property.</strong> The Oracle Contributor Agreement (OCA) requires that a contributor own the IP rights to each contribution. Generative tools trained on copyrighted content create legal uncertainty here, which is the subject of active litigation.</p><p>The enforcement mechanism? <strong><a href="https://wiki.openjdk.org/spaces/skara/overview">Skara</a></strong>, the tool responsible for pull request workflow in OpenJDK, has been extended with a checkbox that contributors must check when creating a PR, affirming compliance with the policy. Of course, this is a trust-based mechanism. But the policy also lists some rather amusing &#8220;tell-tale clues&#8221; for spotting AI-generated content: an overly chatty, verbose commenting style, heavily structured responses with multiple headings, unnecessary code comments, gratuitously defensive programming, and... emoji characters. Official OpenJDK position.</p><blockquote><p><em>Other clues include highly structured comments with multiple headings, unnecessary comments in code, gratuitously defensive programming, and the use of emoji characters. (...) In general, if something in a pull request seems uncannily cheerful or meticulous then you could be looking at AI-generated content.</em></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IO-l!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e322489-5eda-448c-a4c8-3cd5677fa582_601x500.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IO-l!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e322489-5eda-448c-a4c8-3cd5677fa582_601x500.png 424w, https://substackcdn.com/image/fetch/$s_!IO-l!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e322489-5eda-448c-a4c8-3cd5677fa582_601x500.png 848w, https://substackcdn.com/image/fetch/$s_!IO-l!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e322489-5eda-448c-a4c8-3cd5677fa582_601x500.png 1272w, https://substackcdn.com/image/fetch/$s_!IO-l!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e322489-5eda-448c-a4c8-3cd5677fa582_601x500.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IO-l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e322489-5eda-448c-a4c8-3cd5677fa582_601x500.png" width="601" height="500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6e322489-5eda-448c-a4c8-3cd5677fa582_601x500.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:500,&quot;width&quot;:601,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!IO-l!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e322489-5eda-448c-a4c8-3cd5677fa582_601x500.png 424w, https://substackcdn.com/image/fetch/$s_!IO-l!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e322489-5eda-448c-a4c8-3cd5677fa582_601x500.png 848w, https://substackcdn.com/image/fetch/$s_!IO-l!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e322489-5eda-448c-a4c8-3cd5677fa582_601x500.png 1272w, https://substackcdn.com/image/fetch/$s_!IO-l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e322489-5eda-448c-a4c8-3cd5677fa582_601x500.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>What&#8217;s fascinating - not everyone in the Oracle ecosystem agrees. <strong>GraalVM</strong> has taken a <strong><a href="https://github.com/oracle/graal/blob/master/CODING_ASSISTANTS.md">diametrically opposite stance</a></strong>. Their policy on coding assistants explicitly states that contributors <em>may</em> use AI when preparing contributions, and that responsible use of such tools should increase development velocity and improve quality - e.g., by helping produce clearer documentation, broader test coverage, and more complete supporting changes. The document is inspired by the <strong><a href="https://github.com/torvalds/linux/blob/master/Documentation/process/coding-assistants.rst">Linux kernel&#8217;s policy</a></strong>, which follows the same path. GraalVM&#8217;s key condition: the human submitting a change remains responsible for the entire contribution, must understand and be able to defend every piece of code, and if they can&#8217;t -the change gets rejected. But it&#8217;s accountability for quality, not a ban on the tool.</p><p>So we have a situation where two projects under Oracle&#8217;s umbrella - OpenJDK and GraalVM - occupy diametrically opposite positions. OpenJDK says &#8220;don&#8217;t commit AI-generated code in any form,&#8221; GraalVM says &#8220;use it, but take full responsibility.&#8221; This isn&#8217;t a contradiction - it reflects different contexts. OpenJDK is the platform foundation on which mission-critical systems globally depend, with a rigorous OCA process and a vast base of external contributors with varying levels of experience. GraalVM is a smaller project with a more specialized community, where maintainers know their contributors better. But the contrast is striking.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ysWm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f618d09-26eb-4c8e-b658-f599fdeda7e6_800x450.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ysWm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f618d09-26eb-4c8e-b658-f599fdeda7e6_800x450.png 424w, https://substackcdn.com/image/fetch/$s_!ysWm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f618d09-26eb-4c8e-b658-f599fdeda7e6_800x450.png 848w, https://substackcdn.com/image/fetch/$s_!ysWm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f618d09-26eb-4c8e-b658-f599fdeda7e6_800x450.png 1272w, https://substackcdn.com/image/fetch/$s_!ysWm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f618d09-26eb-4c8e-b658-f599fdeda7e6_800x450.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ysWm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f618d09-26eb-4c8e-b658-f599fdeda7e6_800x450.png" width="800" height="450" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8f618d09-26eb-4c8e-b658-f599fdeda7e6_800x450.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:450,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!ysWm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f618d09-26eb-4c8e-b658-f599fdeda7e6_800x450.png 424w, https://substackcdn.com/image/fetch/$s_!ysWm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f618d09-26eb-4c8e-b658-f599fdeda7e6_800x450.png 848w, https://substackcdn.com/image/fetch/$s_!ysWm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f618d09-26eb-4c8e-b658-f599fdeda7e6_800x450.png 1272w, https://substackcdn.com/image/fetch/$s_!ysWm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f618d09-26eb-4c8e-b658-f599fdeda7e6_800x450.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>Looking more broadly, OpenJDK isn&#8217;t alone in its approach - QEMU <strong><a href="https://github.com/qemu/qemu/blob/master/docs/devel/code-provenance.rst#use-of-ai-content-generators">adopted a similar ban</a></strong>, r/programming <strong><a href="https://vucense.com/privacy-sovereignty/digital-independence/reddit-programming-ai-content-ban-2026/">banned AI-generated content</a></strong>, Debian <strong><a href="https://news.ycombinator.com/item?id=47324087">debated and... decided not to decide</a></strong> (classic Debian). And on the other side - GraalVM and the Linux kernel bet on individual responsibility instead of a blanket ban. I see a fascinating paradox here: AI tools are changing how we write code every day, yet the open source community doesn&#8217;t have a unified answer, even within the same ecosystem. This dissonance will only grow - and it&#8217;s a topic we&#8217;ll be discussing for a long time to come.</p><div><hr></div><p><strong>PS:</strong> If you want to discuss this paradox in person - join us at <strong><a href="https://www.nyctechweek.com/">NY Tech Week</a></strong>, June 2 in New York, where <strong><a href="https://www.linkedin.com/in/tomaszlelek/">Tomasz Lelek</a></strong> and I will be talking about Vibe Engineering and how AI is (or isn&#8217;t) changing the way we work with code.</p><p><strong>PS2: </strong>In the meantime - download that <strong><a href="https://jdk.java.net/valhalla/">Valhalla EA build</a></strong> and test it on your workloads. Seriously. After all these years of waiting, feedback from real users is the best thing we can do for Java.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Oracle lays off 30,000, but Java is doing just fine - JVM Weekly vol. 170]]></title><description><![CDATA[Oracle layoffs, Google ADK for Java 1.0, TornadoVM 4.0 with Apple Metal, AI4JVM, and why the ecosystem is bigger than the corporation.]]></description><link>https://www.jvm-weekly.com/p/oracle-lays-off-30000-but-java-is</link><guid isPermaLink="false">https://www.jvm-weekly.com/p/oracle-lays-off-30000-but-java-is</guid><dc:creator><![CDATA[Artur Skowronski]]></dc:creator><pubDate>Thu, 09 Apr 2026 13:00:22 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ia_A!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b5c4833-5ab7-4940-aace-06dfd0c1ffc2_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ia_A!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b5c4833-5ab7-4940-aace-06dfd0c1ffc2_1456x1048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ia_A!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b5c4833-5ab7-4940-aace-06dfd0c1ffc2_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!ia_A!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b5c4833-5ab7-4940-aace-06dfd0c1ffc2_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!ia_A!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b5c4833-5ab7-4940-aace-06dfd0c1ffc2_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!ia_A!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b5c4833-5ab7-4940-aace-06dfd0c1ffc2_1456x1048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ia_A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b5c4833-5ab7-4940-aace-06dfd0c1ffc2_1456x1048.png" width="1456" height="1048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2b5c4833-5ab7-4940-aace-06dfd0c1ffc2_1456x1048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1048,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1816335,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/193670356?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b5c4833-5ab7-4940-aace-06dfd0c1ffc2_1456x1048.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ia_A!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b5c4833-5ab7-4940-aace-06dfd0c1ffc2_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!ia_A!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b5c4833-5ab7-4940-aace-06dfd0c1ffc2_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!ia_A!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b5c4833-5ab7-4940-aace-06dfd0c1ffc2_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!ia_A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b5c4833-5ab7-4940-aace-06dfd0c1ffc2_1456x1048.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This is one of those weeks where you have to set aside the technology and talk about the elephant in the room. When the company that stewards Java lays off 18% of its global workforce, and its <strong><a href="https://www.financialexpress.com/life/technology-oracle-doesnt-write-code-our-ai-models-do-co-founder-larry-ellison-on-his-companys-mass-layoffs-plan-4191634/">CEO publicly says &#8220;the code that Oracle is writing, Oracle isn&#8217;t writing - our AI models are writing it,</a></strong>&#8220; it&#8217;s hard to pretend this is &#8220;just another restructuring.&#8221;</p><p>But at the same time, paradoxically, this has also been one of the best periods for the Java AI ecosystem ever. So today we&#8217;ll try to piece these two pictures into a single coherent narrative. Fair warning: it won&#8217;t be easy, but I hope it will be educational.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>On March 31, 2026, around six in the morning Pacific time, Oracle employees around the world started receiving emails. Not invitations to a meeting with their manager, not a heads-up from HR. Emails. From &#8220;Oracle Leadership.&#8221; Before breakfast.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!c9NG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f686810-93f9-41cb-a282-784a81b2eb9e_576x321.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!c9NG!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f686810-93f9-41cb-a282-784a81b2eb9e_576x321.gif 424w, https://substackcdn.com/image/fetch/$s_!c9NG!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f686810-93f9-41cb-a282-784a81b2eb9e_576x321.gif 848w, https://substackcdn.com/image/fetch/$s_!c9NG!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f686810-93f9-41cb-a282-784a81b2eb9e_576x321.gif 1272w, https://substackcdn.com/image/fetch/$s_!c9NG!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f686810-93f9-41cb-a282-784a81b2eb9e_576x321.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!c9NG!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f686810-93f9-41cb-a282-784a81b2eb9e_576x321.gif" width="576" height="321" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4f686810-93f9-41cb-a282-784a81b2eb9e_576x321.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:321,&quot;width&quot;:576,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!c9NG!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f686810-93f9-41cb-a282-784a81b2eb9e_576x321.gif 424w, https://substackcdn.com/image/fetch/$s_!c9NG!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f686810-93f9-41cb-a282-784a81b2eb9e_576x321.gif 848w, https://substackcdn.com/image/fetch/$s_!c9NG!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f686810-93f9-41cb-a282-784a81b2eb9e_576x321.gif 1272w, https://substackcdn.com/image/fetch/$s_!c9NG!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f686810-93f9-41cb-a282-784a81b2eb9e_576x321.gif 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>According to data that leaked over the following days, the layoffs affected up to 30,000 people, roughly 18% of Oracle&#8217;s global workforce. <strong><a href="https://www.cnbc.com/2026/03/31/oracle-layoffs-ai-spending.html">CNBC</a></strong> confirmed the scale from two independent sources. The company set aside a restructuring budget of around $2.1 billion, mostly for severance. TD Cowen estimates the layoffs will free up $8 to $10 billion in annual cash flow. Money that, as you can easily guess, will go toward building AI data centers. Oracle&#8217;s capex for fiscal year 2026 is around $50 billion, $15 billion more than the company told Wall Street just a few months ago.</p><p>But it&#8217;s not the numbers that hurt the most. It&#8217;s the people.</p><p>Among those laid off was <strong><a href="https://www.linkedin.com/in/sharatchander/">Sharat Chander</a></strong>, Head of Developer Community Engagement at Oracle, a person who spent 16 years (first at Sun Microsystems, then Oracle) building what you can, without exaggeration, call the largest developer ecosystem on the planet. His farewell post on LinkedIn was one of those that&#8217;s hard to read without feeling something:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UnK5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b4ac97f-4ca9-41b1-be4a-8a062cc49fc2_751x1500.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UnK5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b4ac97f-4ca9-41b1-be4a-8a062cc49fc2_751x1500.png 424w, https://substackcdn.com/image/fetch/$s_!UnK5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b4ac97f-4ca9-41b1-be4a-8a062cc49fc2_751x1500.png 848w, https://substackcdn.com/image/fetch/$s_!UnK5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b4ac97f-4ca9-41b1-be4a-8a062cc49fc2_751x1500.png 1272w, https://substackcdn.com/image/fetch/$s_!UnK5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b4ac97f-4ca9-41b1-be4a-8a062cc49fc2_751x1500.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UnK5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b4ac97f-4ca9-41b1-be4a-8a062cc49fc2_751x1500.png" width="751" height="1500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1b4ac97f-4ca9-41b1-be4a-8a062cc49fc2_751x1500.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1500,&quot;width&quot;:751,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!UnK5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b4ac97f-4ca9-41b1-be4a-8a062cc49fc2_751x1500.png 424w, https://substackcdn.com/image/fetch/$s_!UnK5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b4ac97f-4ca9-41b1-be4a-8a062cc49fc2_751x1500.png 848w, https://substackcdn.com/image/fetch/$s_!UnK5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b4ac97f-4ca9-41b1-be4a-8a062cc49fc2_751x1500.png 1272w, https://substackcdn.com/image/fetch/$s_!UnK5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b4ac97f-4ca9-41b1-be4a-8a062cc49fc2_751x1500.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>So what does this mean for Java itself? At first glance: nothing. Oracle has repeatedly made it clear that the JDK, OpenJDK, and the entire six-month release cadence machinery is a key asset. Georges Saab, Chad Arimura, and the Java DevRel team are (for now) still in place. But it&#8217;s hard to watch the layoff of Sharat, the person who WAS Oracle&#8217;s community engagement, and not feel uneasy. Especially when we remember what happened at Sun right before the Oracle acquisition: 18% workforce cuts in 2008 (yes, the same percentage - you can&#8217;t make this up), another 3,000 during the deal delay in 2009, and then James Gosling, Tim Bray, and Simon Phipps walking out the door within months of the close. The community-facing roles were among the first to go then, too.</p><p>And then there&#8217;s that Larry Ellison quote: &#8220;<strong><a href="https://www.financialexpress.com/life/technology-oracle-doesnt-write-code-our-ai-models-do-co-founder-larry-ellison-on-his-companys-mass-layoffs-plan-4191634/">The code that Oracle is writing, Oracle isn&#8217;t writing. Our AI models are writing it.</a></strong>&#8220; That was said publicly. And regardless of how much of this is CEO hyperbole for analysts, 30,000 people just lost their jobs, and that narrative is their backdrop.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RQSR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25eaf9bd-6e6d-453b-baa9-3dba68ad2544_932x888.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RQSR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25eaf9bd-6e6d-453b-baa9-3dba68ad2544_932x888.png 424w, https://substackcdn.com/image/fetch/$s_!RQSR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25eaf9bd-6e6d-453b-baa9-3dba68ad2544_932x888.png 848w, https://substackcdn.com/image/fetch/$s_!RQSR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25eaf9bd-6e6d-453b-baa9-3dba68ad2544_932x888.png 1272w, https://substackcdn.com/image/fetch/$s_!RQSR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25eaf9bd-6e6d-453b-baa9-3dba68ad2544_932x888.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RQSR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25eaf9bd-6e6d-453b-baa9-3dba68ad2544_932x888.png" width="932" height="888" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/25eaf9bd-6e6d-453b-baa9-3dba68ad2544_932x888.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:888,&quot;width&quot;:932,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!RQSR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25eaf9bd-6e6d-453b-baa9-3dba68ad2544_932x888.png 424w, https://substackcdn.com/image/fetch/$s_!RQSR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25eaf9bd-6e6d-453b-baa9-3dba68ad2544_932x888.png 848w, https://substackcdn.com/image/fetch/$s_!RQSR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25eaf9bd-6e6d-453b-baa9-3dba68ad2544_932x888.png 1272w, https://substackcdn.com/image/fetch/$s_!RQSR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25eaf9bd-6e6d-453b-baa9-3dba68ad2544_932x888.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>Remember JavaOne two weeks earlier? The &#8220;Java for an AI World&#8221; keynote, Java Verified Portfolio, Project Detroit, Helidon with LangChain4j - I wrote about it in more detail in <strong><a href="https://www.jvm-weekly.com/p/jdk-26-and-javaone-when-the-conference">vol. 167</a></strong>. Back then it looked like a bold ecosystem pivot. Today, in the context of the layoffs, that same keynote reads a bit differently. &#8220;Java for an AI World,&#8221; but not necessarily for all the people who built it.</p><p>And here we arrive at the paradox of this edition. Because regardless of what Oracle the corporation does, the AI ecosystem on the JVM has never looked better. And this isn&#8217;t hype - these are concrete developments from the past two weeks. JavaOne gave us &#8220;AI World&#8221; in a keynote, but the real answer from the community is visible in the projects that appeared right after.</p><div><hr></div><p>-Let&#8217;s start with the biggest one. On March 30, <strong><a href="https://www.linkedin.com/in/glaforge/">Guillaume Laforge</a></strong> announced the GA release of <strong><a href="https://developers.googleblog.com/announcing-adk-for-java-100-building-the-future-of-ai-agents-in-java/">Agent Development Kit for Java</a></strong> version 1.0.0 from Google. A full-fledged, code-first framework for building AI agents in Java, with Human-in-the-Loop (built around a ToolConfirmation mechanism that elegantly pauses the LLM flow and waits for approval), A2A Protocol support (agent-to-agent communication), sessions via Firestore and Vertex AI, and LangChain4j integration. Plus a Dev UI identical to the Python counterpart.</p><p>This is big. Google, a company that in the AI context is associated primarily with Python, is saying outright: Java is a first-class citizen in our agent stack. Guillaume wrote an excellent <strong><a href="https://glaforge.dev/posts/2026/03/30/building-my-comic-trip-agent-with-adk-java-1-0/">blog post about building a multi-agent &#8220;Comic Trip&#8221;</a></strong> application using ADK, complete with Google Maps integration, Firestore persistence, and a UI generated by Antigravity. I recommend it as an example of what building agents on the JVM looks like in 2026 - without pretending it&#8217;s Python.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0Nec!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9adb80d5-55fc-4ca3-b282-adf84d7ddcc4_938x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0Nec!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9adb80d5-55fc-4ca3-b282-adf84d7ddcc4_938x1000.png 424w, https://substackcdn.com/image/fetch/$s_!0Nec!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9adb80d5-55fc-4ca3-b282-adf84d7ddcc4_938x1000.png 848w, https://substackcdn.com/image/fetch/$s_!0Nec!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9adb80d5-55fc-4ca3-b282-adf84d7ddcc4_938x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!0Nec!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9adb80d5-55fc-4ca3-b282-adf84d7ddcc4_938x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0Nec!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9adb80d5-55fc-4ca3-b282-adf84d7ddcc4_938x1000.png" width="938" height="1000" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9adb80d5-55fc-4ca3-b282-adf84d7ddcc4_938x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1000,&quot;width&quot;:938,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!0Nec!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9adb80d5-55fc-4ca3-b282-adf84d7ddcc4_938x1000.png 424w, https://substackcdn.com/image/fetch/$s_!0Nec!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9adb80d5-55fc-4ca3-b282-adf84d7ddcc4_938x1000.png 848w, https://substackcdn.com/image/fetch/$s_!0Nec!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9adb80d5-55fc-4ca3-b282-adf84d7ddcc4_938x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!0Nec!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9adb80d5-55fc-4ca3-b282-adf84d7ddcc4_938x1000.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>And since we&#8217;re talking about people who do more than they say (while saying a lot): <strong><a href="https://www.linkedin.com/in/jamesward/">James Ward</a></strong> rallied the community and launched <strong><a href="http://ai4jvm.com/">ai4jvm.com</a></strong>. A curated catalog of literally everything AI on the JVM: agent frameworks (Spring AI, LangChain4j, Embabel, Koog, Google ADK...), inference engines, code assistants, key people, educational resources. Not another awesome-list on GitHub, but a properly built site with a clear taxonomy that gives you a real picture of how vast this ecosystem has become.</p><p>James is everywhere right now: from <strong><a href="https://developers.podcast.go-aws.com/web/episodes/200/index.html">episode 200 of the AWS Developers Podcast</a></strong> (with Josh Long, where the cited Java MCP SDK vs Python benchmarks are... encouraging: 0.835ms latency vs 26.45ms), tthrough JavaOne presentations on MCP and agent skills, to his <strong><a href="https://ai4jvm.com/">SkillsJars</a></strong> project for packaging and distributing reusable AI agent skills as Maven/Gradle JARs (discover via Maven Central, load on demand in Claude Code or Spring AI), and the <strong><a href="http://javadocs.dev/mcp">javadocs.dev/mcp</a></strong> server that gives AI agents structured, up-to-date access to Java library documentation instead of relying on stale training data.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kLZR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe64ffe31-4e6e-4286-832d-bd016411f55f_576x344.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kLZR!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe64ffe31-4e6e-4286-832d-bd016411f55f_576x344.gif 424w, https://substackcdn.com/image/fetch/$s_!kLZR!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe64ffe31-4e6e-4286-832d-bd016411f55f_576x344.gif 848w, https://substackcdn.com/image/fetch/$s_!kLZR!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe64ffe31-4e6e-4286-832d-bd016411f55f_576x344.gif 1272w, https://substackcdn.com/image/fetch/$s_!kLZR!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe64ffe31-4e6e-4286-832d-bd016411f55f_576x344.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kLZR!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe64ffe31-4e6e-4286-832d-bd016411f55f_576x344.gif" width="576" height="344" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e64ffe31-4e6e-4286-832d-bd016411f55f_576x344.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:344,&quot;width&quot;:576,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!kLZR!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe64ffe31-4e6e-4286-832d-bd016411f55f_576x344.gif 424w, https://substackcdn.com/image/fetch/$s_!kLZR!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe64ffe31-4e6e-4286-832d-bd016411f55f_576x344.gif 848w, https://substackcdn.com/image/fetch/$s_!kLZR!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe64ffe31-4e6e-4286-832d-bd016411f55f_576x344.gif 1272w, https://substackcdn.com/image/fetch/$s_!kLZR!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe64ffe31-4e6e-4286-832d-bd016411f55f_576x344.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">This is how I imagine James at home</figcaption></figure></div><p>The very existence of something like <strong><a href="https://ai4jvm.com/">ai4jvm.com</a></strong> is telling. Just a year ago, when I wrote <strong><a href="https://www.jvm-weekly.com/p/the-hitchhikers-guide-to-ai-in-the">Hitchhiker&#8217;s Guide to AI in the Java Galaxy</a></strong>, the ecosystem fit into one (albeit long) article. Today it needs its own portal (and soon probably a search engine).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nFkS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93656828-9b12-45af-98d4-57344006167f_1488x917.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nFkS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93656828-9b12-45af-98d4-57344006167f_1488x917.png 424w, https://substackcdn.com/image/fetch/$s_!nFkS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93656828-9b12-45af-98d4-57344006167f_1488x917.png 848w, https://substackcdn.com/image/fetch/$s_!nFkS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93656828-9b12-45af-98d4-57344006167f_1488x917.png 1272w, https://substackcdn.com/image/fetch/$s_!nFkS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93656828-9b12-45af-98d4-57344006167f_1488x917.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nFkS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93656828-9b12-45af-98d4-57344006167f_1488x917.png" width="1456" height="897" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/93656828-9b12-45af-98d4-57344006167f_1488x917.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:897,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!nFkS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93656828-9b12-45af-98d4-57344006167f_1488x917.png 424w, https://substackcdn.com/image/fetch/$s_!nFkS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93656828-9b12-45af-98d4-57344006167f_1488x917.png 848w, https://substackcdn.com/image/fetch/$s_!nFkS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93656828-9b12-45af-98d4-57344006167f_1488x917.png 1272w, https://substackcdn.com/image/fetch/$s_!nFkS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93656828-9b12-45af-98d4-57344006167f_1488x917.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>But agents aside, plenty is happening at a lower level of abstraction too. On April 2, <strong><a href="https://github.com/beehive-lab/TornadoVM/releases">TornadoVM 4.0.0</a></strong> shipped with the thing I&#8217;d been personally waiting for: a <strong>native Apple Metal backend</strong> enabling heterogeneous compute directly on Apple Silicon. For those who <strong><a href="https://www.jvm-weekly.com/p/the-tornadovm-programming-model-explained">haven&#8217;t followed previous editions</a></strong>, TornadoVM is an OpenJDK plugin that transpiles bytecode at runtime to OpenCL C, NVIDIA PTX, or SPIR-V, automatically running Java programs on GPUs, FPGAs, and multi-core CPUs. Version 4.0 adds Metal to that arsenal, along with SIMD shuffle and reduction intrinsics in the PTX backend, a new withCUDAGraph() method on TornadoExecutionPlan, and support for both JDK 21 and JDK 25.</p><p>I currently <strong><a href="https://github.com/ArturSkowronski/conference-jvm-in-age-ai-2026">started experimenting with TornadoVM 4.0</a></strong> and updated my Llama benchmarks - <strong><a href="https://github.com/ArturSkowronski/conference-jvm-in-age-ai-2026">results soon</a></strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TNE7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd43d6d40-a3cc-492a-aa2b-1e7d735ae085_1488x996.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TNE7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd43d6d40-a3cc-492a-aa2b-1e7d735ae085_1488x996.png 424w, https://substackcdn.com/image/fetch/$s_!TNE7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd43d6d40-a3cc-492a-aa2b-1e7d735ae085_1488x996.png 848w, https://substackcdn.com/image/fetch/$s_!TNE7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd43d6d40-a3cc-492a-aa2b-1e7d735ae085_1488x996.png 1272w, https://substackcdn.com/image/fetch/$s_!TNE7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd43d6d40-a3cc-492a-aa2b-1e7d735ae085_1488x996.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TNE7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd43d6d40-a3cc-492a-aa2b-1e7d735ae085_1488x996.png" width="1456" height="975" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d43d6d40-a3cc-492a-aa2b-1e7d735ae085_1488x996.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:975,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!TNE7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd43d6d40-a3cc-492a-aa2b-1e7d735ae085_1488x996.png 424w, https://substackcdn.com/image/fetch/$s_!TNE7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd43d6d40-a3cc-492a-aa2b-1e7d735ae085_1488x996.png 848w, https://substackcdn.com/image/fetch/$s_!TNE7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd43d6d40-a3cc-492a-aa2b-1e7d735ae085_1488x996.png 1272w, https://substackcdn.com/image/fetch/$s_!TNE7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd43d6d40-a3cc-492a-aa2b-1e7d735ae085_1488x996.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>What does this mean in practice? MacBook users on M1/M2/M3/M4/M5 can finally use native GPU acceleration without OpenCL workarounds. And given how many people in the Java community work on Macs, and that <strong><a href="https://github.com/beehive-lab/GPULlama3.java">GPULlama3.java</a></strong> is one of the most interesting projects in this space, the Metal backend opens it up to an entirely new group of developers.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LkU4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab1c7714-6c86-49d1-ad77-96c45433f0a2_942x1366.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LkU4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab1c7714-6c86-49d1-ad77-96c45433f0a2_942x1366.png 424w, https://substackcdn.com/image/fetch/$s_!LkU4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab1c7714-6c86-49d1-ad77-96c45433f0a2_942x1366.png 848w, https://substackcdn.com/image/fetch/$s_!LkU4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab1c7714-6c86-49d1-ad77-96c45433f0a2_942x1366.png 1272w, https://substackcdn.com/image/fetch/$s_!LkU4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab1c7714-6c86-49d1-ad77-96c45433f0a2_942x1366.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LkU4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab1c7714-6c86-49d1-ad77-96c45433f0a2_942x1366.png" width="942" height="1366" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ab1c7714-6c86-49d1-ad77-96c45433f0a2_942x1366.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1366,&quot;width&quot;:942,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!LkU4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab1c7714-6c86-49d1-ad77-96c45433f0a2_942x1366.png 424w, https://substackcdn.com/image/fetch/$s_!LkU4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab1c7714-6c86-49d1-ad77-96c45433f0a2_942x1366.png 848w, https://substackcdn.com/image/fetch/$s_!LkU4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab1c7714-6c86-49d1-ad77-96c45433f0a2_942x1366.png 1272w, https://substackcdn.com/image/fetch/$s_!LkU4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab1c7714-6c86-49d1-ad77-96c45433f0a2_942x1366.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">M* CPUs do not stop to amaze me</figcaption></figure></div><div><hr></div><p>On a side note, because it fits the theme of a community that&#8217;s doing its own thing: <strong><a href="https://www.linkedin.com/in/mark-sailes/">Mark Sailes</a></strong> and <strong><a href="https://www.linkedin.com/in/lee-james-gilmore/">Lee Gilmore</a></strong> just launched <strong><a href="https://www.studyfromexperts.com/">StudyFromExperts</a></strong>, an educational platform targeting advanced AWS practitioners. Their pitch is simple: most training material is written for people just starting their cloud journey, while senior engineers and architects are left to fend for themselves. Mark is well known in the Java/serverless ecosystem, so I&#8217;ll be watching what grows from this.</p><p>See the pattern? Google builds an agent framework. AWS evangelizes the ecosystem. Manchester delivers Metal on GPU. JetBrains bets on agent orchestration. Sailes and Gilmore build an educational platform. None of them are waiting for Oracle.</p><div><hr></div><p><strong>PS:</strong> If you&#8217;re by any slight chance reading this, Sharat: thank you for those 16 years. The Java ecosystem wouldn&#8217;t be what it is without your work. And whatever comes next, the community remembers.</p><p><strong>PS2:</strong> I recommend <strong><a href="https://ai4jvm.com/">ai4jvm.com</a></strong> as a starting point for anyone who wants to understand just how vast the AI ecosystem on the JVM is today.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA["Diagnosing Your Leyden AOT Cache" with María Arias de Reyna Domínguez - JVM Weekly vol. 169]]></title><description><![CDATA[This month: Project Leyden cache analysis tooling, Java 26 podcast deep-dive, Java AI agents in pure Spring, Eclipse GlassFish's comeback, native memory with FFM API, and Java in education.]]></description><link>https://www.jvm-weekly.com/p/diagnosing-your-leyden-aot-cache</link><guid isPermaLink="false">https://www.jvm-weekly.com/p/diagnosing-your-leyden-aot-cache</guid><dc:creator><![CDATA[Artur Skowronski]]></dc:creator><pubDate>Thu, 02 Apr 2026 13:01:43 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!DVr9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f982a4f-457d-47d9-8016-5884b1304ce7_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DVr9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f982a4f-457d-47d9-8016-5884b1304ce7_1456x1048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DVr9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f982a4f-457d-47d9-8016-5884b1304ce7_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!DVr9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f982a4f-457d-47d9-8016-5884b1304ce7_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!DVr9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f982a4f-457d-47d9-8016-5884b1304ce7_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!DVr9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f982a4f-457d-47d9-8016-5884b1304ce7_1456x1048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DVr9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f982a4f-457d-47d9-8016-5884b1304ce7_1456x1048.png" width="1456" height="1048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9f982a4f-457d-47d9-8016-5884b1304ce7_1456x1048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1048,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2020659,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/192834451?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f982a4f-457d-47d9-8016-5884b1304ce7_1456x1048.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!DVr9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f982a4f-457d-47d9-8016-5884b1304ce7_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!DVr9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f982a4f-457d-47d9-8016-5884b1304ce7_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!DVr9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f982a4f-457d-47d9-8016-5884b1304ce7_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!DVr9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f982a4f-457d-47d9-8016-5884b1304ce7_1456x1048.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>As a hub for the &#8220;Friends of OpenJDK,&#8221; <strong><a href="http://foojay.io/">Foojay.io</a></strong> gathers a rich collection of articles written by industry experts and active community members, offering valuable insights into the latest trends, tools, and practices within the OpenJDK ecosystem.</p><p>This month&#8217;s main feature comes from <a href="https://foojay.io/today/author/maria-arias/">Mar&#237;a Arias de Reyna Dom&#237;nguez</a>, Java Champion working at IBM as part of the OpenJDK team, who published a three-part deep-dive into how Project Leyden is improving Java performance. There&#8217;s <a href="https://foojay.io/today/how-is-leyden-improving-java-performance-part-1-of-3/">Part 1</a> covering the history and architecture of the solution, and <a href="https://foojay.io/today/how-is-leyden-improving-java-performance-part-2-of-3/">Part 2</a> showing how to actually use the AOT cache and presenting test results. </p><p>But I wanted to focus specifically on Part 3, because while the first two installments provide necessary background, Part 3 is where things get genuinely practical - and arguably where the real &#8220;engineering&#8221; starts. It walks you through diagnosing an AOT cache on a real, non-trivial Quarkus application with a dedicated tooling that lets you understand <em>why</em> you&#8217;re getting the performance you&#8217;re getting (or not getting).</p><div><hr></div><h2>How is Leyden improving Java Performance? Diagnosing Your Leyden AOT Cache - A Practical Walkthrough</h2><h3>What is inside the Ahead of Time Cache?</h3><p>Ideally, an AOT cache would simply include everything needed to allow a production run to skip straight through to its warmed up state. However, in practice training runs don&#8217;t always cover all the things that can happen at runtime and hence that the assets contained in any generated AOT cache will be more or less complete.</p><p>In order to have some idea of how effective a training run has been it&#8217;s helpful to be able to look at a cache and see what is in it. Full details of the tooling that allows you to do that are presented in part 3 of this blog series. However, in order to prepare for that, we need to provide an overview of the JVM assets that end up in the cache and how the JVM uses them. We will follow up with some examples to show how effectively this improves startup and warmup.</p><p>So, let&#8217;s take a deeper look at what exactly is inside the AOT Cache. There are several different ways of classifying the contents:</p><p>The most straightforward way to classify AOT cache assets is to distinguish between Static and Dynamic data.</p><p>Static assets are data that are available in or directly derived from bytecode, data that exist, even if only implicitly, at build time.</p><p>Dynamic assets are data that get generated, or are collected, at runtime as a side-effect of execution. Some of them record information that can be used to trigger compilation and drive feedback-driven optimizations, including speculative optimization, beyond what an ahead-of-time compiler would be able to do. They can also include the compiled code that is generated as a result of that compilation.</p><p>Finally, they include training data, created as a training run progresses to track what the JVM has done and why. Training data identify what JVM assets need to be stored into the cache when it is created. They are also installed in the cache, indexing the other assets and helping identify how to use them in production.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!c1ve!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc38693-8dca-4124-bdc8-0a3ab963bd6e_930x560.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!c1ve!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc38693-8dca-4124-bdc8-0a3ab963bd6e_930x560.png 424w, https://substackcdn.com/image/fetch/$s_!c1ve!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc38693-8dca-4124-bdc8-0a3ab963bd6e_930x560.png 848w, https://substackcdn.com/image/fetch/$s_!c1ve!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc38693-8dca-4124-bdc8-0a3ab963bd6e_930x560.png 1272w, https://substackcdn.com/image/fetch/$s_!c1ve!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc38693-8dca-4124-bdc8-0a3ab963bd6e_930x560.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!c1ve!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc38693-8dca-4124-bdc8-0a3ab963bd6e_930x560.png" width="930" height="560" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4bc38693-8dca-4124-bdc8-0a3ab963bd6e_930x560.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:560,&quot;width&quot;:930,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!c1ve!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc38693-8dca-4124-bdc8-0a3ab963bd6e_930x560.png 424w, https://substackcdn.com/image/fetch/$s_!c1ve!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc38693-8dca-4124-bdc8-0a3ab963bd6e_930x560.png 848w, https://substackcdn.com/image/fetch/$s_!c1ve!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc38693-8dca-4124-bdc8-0a3ab963bd6e_930x560.png 1272w, https://substackcdn.com/image/fetch/$s_!c1ve!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc38693-8dca-4124-bdc8-0a3ab963bd6e_930x560.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>We can also distinguish two types of data depending on their purpose:</p><p>On one hand, there is the JVM data - metadata, heap data and code. This is a network of C++ objects that are used during normal JVM running to define and regulate Java execution. These objects must always exist, even when running without a cache, in order for the JVM to be able to run an app. This object network needs to be dumped to the archive on disk in a format that allows it to be quickly and correctly restored to the relevant memory areas of the production JVM in a valid (C++ Object) format and layout that matches the JVM&#8217;s expectations.</p><p>On the other hand we also have Leyden&#8217;s own Cache Management Data, i.e. training data, which exists specifically to support creation and consumption of AOT cache. Training data are also saved and restored as C++ object data but the format and layout of these objects is determined solely by the Leyden cache management code. Its sole purpose is to track and regulate what assets get written to the AOT cache after training completes and what assets can or should be restored in production.</p><p>Let&#8217;s see in detail what each data type means.</p><h3>JVM Metadata</h3><p>Metadata stored in the AOT cache is a superset of what was stored in a CDS archive. The subset which overlaps with CDS is the static metadata. The latter represents the structure and hierarchy of classes in JDK and application code. Primarily, it helps avoid the cost of parsing bytecode, as it is in the same format as the JVM&#8217;s own internal metadata model: classes, methods, fields, inheritance between classes,... which can be mapped directly into memory. Having this information stored in the cache speeds up the time the Hotspot takes to decode the different class files, and to build the dependency graph.</p><p>While starting the application, the Java Heap memory gets filled with objects and instances that are going to be used during runtime. Some of those heap data objects can be cached too because they are quite predictable, like Strings hardcoded in the source code, java.lang.Class instances, some content of class static fields, objects needed to run lambdas, the class graph module,... Those are all assets that are created in memory in the same way on every run.</p><p>The heap data cached at the moment is restricted to very specific cases as it has to behave exactly the same on each and every run, but the type of data cached is expanding on each JDK version.</p><h3>JVM Profile and Linkage Data</h3><p>The cache also includes dynamic JVM metadata i.e. MethodCounter, MethodData and ConstantPoolCache objects. These objects are created and attached to the static metadata methods and classes and their content is updated as a side-effect of executing method code.</p><p>MethodCounter objects track how often the method they are attached to has been called. They are primarily used to trigger compilation via the baseline (C1) or optimizing (C2) compiler. The interpreter increments a method&#8217;s call count up to a threshold before scheduling a C1 compile, possibly including code that gathers further profile information. Instrumentation code in (Tier 2 andImage description 3) C1 compiled methods also updates the call count and when a higher threshold is reached either upgrades to (Tier 4) C2 compiled code or reverts to (Tier 1) C1 compiled code which includes no instrumentation</p><p>MethodProfile objects record detailed information about their associated method&#8217;s hot and cold paths, argument types and other details of how it executes, most notably any history of speculative deoptimization. Apart from the deoptimization case, which applies for both C1 and C2 code, MethodProfile objects only receive updates via instrumentation code in (Tier 2 and 3) C1 compiled methods.</p><p>ConstantPoolCache objects are attached to a clasImage descriptions and track the linkage of call and field access sites in any of the class&#8217;s methods. Prelinking avoids work at the first call or first field access and this is especially valuable when the call is an invokedynamic i.e. the bytecode that implements a lambda invocation.</p><p>Linking a lambda involves running Java &#8216;bootstrap&#8217; code that identifies a private class that owns the bytecode for the lambda body, asking it to construct and return a MethodHandle that can be used to execute the target. If a lambda can be run during training then the target class and method can be pre-loaded and the MethodHandle stored in the heap and linked from the ConstantPoolCache, avoiding the need to run the &#8216;bootstrap&#8217; in production. If the lambda is executed repeatedly in production the called bytecode may even be inlined into the compiled code for the caller. Effectively, executing as lambda in training removes all setup overheads in production, making lambdas as cheap to use as a direct method call.</p><h3>JVM Code and Code Management Data</h3><p>AdapterHandlers are a set of utilities used by the Hotspot to marshall method parameters when performing certain types of call. AdapterHandlers can be cached, avoiding the need to generate them on demand. They are identified by their AdapterFingerprint and indexed via a table of AdapterHandleEntry objects.</p><p>Alongside these handlers various StubBlobs needed by the runtime are also cached. These blobs contain JITted code that implements one or more &#8216;stub&#8217; routines. Stub routines include architecture- and OS-specific code used by the JVM to perform operations that are hard to write in a platform agnostic way. Examples include: flushing code regions after update by the JIT or call linker, unwinding the stack when an exception occurs, replacing a compiled stackframe with one or more interpreter frames when execution of a deopt trap forces a bail-out etc. There are also many stubs that provide hand crafted, high-performance implementations of math, crypto or memory copy methods that are used in place of Java implementations on some architectures, especially where hand-crafted code can use specialized hardware instructions to outperform the JIT compiler. Much of the stub and adapter code has to be generated before the JDK can fully startup. Storing it in the cache and reloading it in production provides a small but noticeable performance improvement.</p><p>Leyden premain also includes CompiledMethods, i.e. pre-compiled Java methods, in the cache. This includes both C1 and C2 (Tiers 1 - 4) and in some cases different tier compiled versions of the same method. Having compiled code immediately available, especially Tier 4 code, is an enormous boost to performance. Lower tier code may be useful when the method only reached that tier during training or as a fallback if we need to deoptimize and reprofile. Pre-compiled Java methods are an enhancement we expect to add soon to the mainline JDK.</p><h3>Leyden Training Data</h3><p>Training data is part of the Leyden specific code. It tracks which methods have actually been loaded, executed, and used during the training run and how they have been used. Normally all loaded classes have associated class training data, but these may be omitted if, say, the class is loaded by a custom (user-defined) loader, is modified by an agent or fails to resolve because of linkage errors.There is a usage threshold which means that only methods that have been executed above that threshold will have associated method training data. Likewise, compiled method training data only exists for methods actually compiled during training. This helps both in keeping a smaller footprint in the cache and removing less useful data so processing the cache is faster.</p><h3>How Do I Know Leyden Is Helping?</h3><p>Depending on how well you train your deployment you may see different improvements in time to reach application start (startup time) and time to reach peak performance (warmup time). Log output is one useful way to measure these two metrics but the details will depend on what monitoring capabilities are available in your test or production environment. However, simply measuring these two times (or even recording warmup profiles) doesn&#8217;t help with the problem of explaining why, for some given training regime, you get a specific improvement or perhaps, in some cases, no measurable improvement.</p><p>For any given AOT cache (or set of alternative caches) it is very helpful to have some idea of what assets were included or excluded in the training set, which ones were written into the cache and what benefit they provide during a production run. In particular, it is useful to have both aggregate statistics and information on individual assets and their relationships. The Leyden project has provided a tool precisely to address these needs. Let&#8217;s see a practical example of how to diagnose an AOT Cache.</p><p>For the purpose of this article, we are going to use the following example application: <a href="https://github.com/Delawen/bad-good-cache">https://github.com/Delawen/bad-good-cache</a></p><p>This is a web application that has a simple API and a basic html interface to use it.</p><p>The first thing we need to do is to compile this application on the root folder:</p><p><em><strong>$ mvn clean package</strong></em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9p0O!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b7d5a57-3667-4651-bc59-08aeaa2a3ad7_600x374.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9p0O!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b7d5a57-3667-4651-bc59-08aeaa2a3ad7_600x374.gif 424w, https://substackcdn.com/image/fetch/$s_!9p0O!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b7d5a57-3667-4651-bc59-08aeaa2a3ad7_600x374.gif 848w, https://substackcdn.com/image/fetch/$s_!9p0O!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b7d5a57-3667-4651-bc59-08aeaa2a3ad7_600x374.gif 1272w, https://substackcdn.com/image/fetch/$s_!9p0O!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b7d5a57-3667-4651-bc59-08aeaa2a3ad7_600x374.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9p0O!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b7d5a57-3667-4651-bc59-08aeaa2a3ad7_600x374.gif" width="600" height="374" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0b7d5a57-3667-4651-bc59-08aeaa2a3ad7_600x374.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:374,&quot;width&quot;:600,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!9p0O!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b7d5a57-3667-4651-bc59-08aeaa2a3ad7_600x374.gif 424w, https://substackcdn.com/image/fetch/$s_!9p0O!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b7d5a57-3667-4651-bc59-08aeaa2a3ad7_600x374.gif 848w, https://substackcdn.com/image/fetch/$s_!9p0O!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b7d5a57-3667-4651-bc59-08aeaa2a3ad7_600x374.gif 1272w, https://substackcdn.com/image/fetch/$s_!9p0O!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b7d5a57-3667-4651-bc59-08aeaa2a3ad7_600x374.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3>Training the application</h3><p>Once we have the jar created, we use it to start a training run:</p><p><em><strong>$ java -XX:AOTCacheOutput=target/app.aot -Xlog:aot+map=trace,aot+map+oops=trace:file=target/<a href="http://aot.map/">aot.map</a>:none:filesize=0 -Xlog:class+load=info,aot+resolve*=trace,aot+codecache+exit=debug,aot*=warning:file=target/training.log:level,tags -jar target/quarkus-app/quarkus-run.jar</strong></em></p><p>The arguments we are going to use are the following:</p><ul><li><p><strong>-XX:AOTCacheOutput=target/app.aot</strong> Which will create an AOT file called app.aot</p></li><li><p><strong>-Xlog:aot+map=trace,aot+map+oops=trace:file=target/<a href="http://aot.map/">aot.map</a>:none:filesize=0</strong> Which will create a map file that indexes and describes the previously created AOT file.</p></li><li><p><strong>-Xlog:class+load=info,aot+resolve*=trace,aot+codecache+exit=debug,aot*=warning:file=target/training.log:level,tags</strong> Which will generate training log files with relevant information</p></li></ul><p><em><strong>$ oha --urls-from-file src/main/resources/urls.txt -n 100</strong></em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0iCZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F978c467f-2656-4650-87d6-f7c4781e2499_1067x787.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0iCZ!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F978c467f-2656-4650-87d6-f7c4781e2499_1067x787.gif 424w, https://substackcdn.com/image/fetch/$s_!0iCZ!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F978c467f-2656-4650-87d6-f7c4781e2499_1067x787.gif 848w, https://substackcdn.com/image/fetch/$s_!0iCZ!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F978c467f-2656-4650-87d6-f7c4781e2499_1067x787.gif 1272w, https://substackcdn.com/image/fetch/$s_!0iCZ!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F978c467f-2656-4650-87d6-f7c4781e2499_1067x787.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0iCZ!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F978c467f-2656-4650-87d6-f7c4781e2499_1067x787.gif" width="1067" height="787" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/978c467f-2656-4650-87d6-f7c4781e2499_1067x787.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:787,&quot;width&quot;:1067,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!0iCZ!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F978c467f-2656-4650-87d6-f7c4781e2499_1067x787.gif 424w, https://substackcdn.com/image/fetch/$s_!0iCZ!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F978c467f-2656-4650-87d6-f7c4781e2499_1067x787.gif 848w, https://substackcdn.com/image/fetch/$s_!0iCZ!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F978c467f-2656-4650-87d6-f7c4781e2499_1067x787.gif 1272w, https://substackcdn.com/image/fetch/$s_!0iCZ!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F978c467f-2656-4650-87d6-f7c4781e2499_1067x787.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Now that we have trained the application, let&#8217;s stop it with <em>ctrl+c</em>. It will take some time to stop while it builds the cache. It will do both the training and assembly steps at once.</p><p>We should have created three types of files:</p><ul><li><p><strong>target/app.aot</strong> : The AOT cache itself</p></li><li><p><strong>target/<a href="http://aot.map/">aot.map</a></strong> : The map file</p></li><li><p><strong>target/training.log</strong> : The logs for the training run</p></li></ul><p>Now that we have the AOT cache, we can start a production run, in which we will also save log files:</p><p><em><strong>$ exit</strong></em></p><p>The arguments we are going to use are the following:</p><ul><li><p><strong>-XX:AOTCache=target/app.aot</strong> Make use of the AOT file called app.aot</p></li><li><p><strong>-Xlog:class+load=info,aot+resolve*=trace,aot+codecache+exit=debug,aot*= warning:file=target/production.log:level,tags</strong> Which will generate a production log file with relevant information</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!g664!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d845b6c-96ac-429c-87bb-da8f70b9c5bf_600x453.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!g664!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d845b6c-96ac-429c-87bb-da8f70b9c5bf_600x453.gif 424w, https://substackcdn.com/image/fetch/$s_!g664!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d845b6c-96ac-429c-87bb-da8f70b9c5bf_600x453.gif 848w, https://substackcdn.com/image/fetch/$s_!g664!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d845b6c-96ac-429c-87bb-da8f70b9c5bf_600x453.gif 1272w, https://substackcdn.com/image/fetch/$s_!g664!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d845b6c-96ac-429c-87bb-da8f70b9c5bf_600x453.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!g664!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d845b6c-96ac-429c-87bb-da8f70b9c5bf_600x453.gif" width="600" height="453" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6d845b6c-96ac-429c-87bb-da8f70b9c5bf_600x453.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:453,&quot;width&quot;:600,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!g664!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d845b6c-96ac-429c-87bb-da8f70b9c5bf_600x453.gif 424w, https://substackcdn.com/image/fetch/$s_!g664!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d845b6c-96ac-429c-87bb-da8f70b9c5bf_600x453.gif 848w, https://substackcdn.com/image/fetch/$s_!g664!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d845b6c-96ac-429c-87bb-da8f70b9c5bf_600x453.gif 1272w, https://substackcdn.com/image/fetch/$s_!g664!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d845b6c-96ac-429c-87bb-da8f70b9c5bf_600x453.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>On this run, we created the <em>production.log</em> file.</p><h3>Analyzing the Cache</h3><p>After using it, we can stop it and analyze how the AOT Cache behaved with our AOT Cache diagnostics tool: <a href="https://github.com/Delawen/leyden-analyzer">https://github.com/Delawen/leyden-analyzer</a></p><p>The first step is loading all the information into the tool, to run a proper analysis:</p><p>\&gt; load aotCache --background target/<a href="http://aot.map/">aot.map</a></p><p><em>\&gt; load trainingLog --background target/training.log</em>*</p><p><em>\&gt; load productionLog --background target/production.log</em>*</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SAr0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F269862b6-1d8b-4f93-a585-2952f83e39c3_1067x787.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SAr0!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F269862b6-1d8b-4f93-a585-2952f83e39c3_1067x787.gif 424w, https://substackcdn.com/image/fetch/$s_!SAr0!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F269862b6-1d8b-4f93-a585-2952f83e39c3_1067x787.gif 848w, https://substackcdn.com/image/fetch/$s_!SAr0!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F269862b6-1d8b-4f93-a585-2952f83e39c3_1067x787.gif 1272w, https://substackcdn.com/image/fetch/$s_!SAr0!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F269862b6-1d8b-4f93-a585-2952f83e39c3_1067x787.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SAr0!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F269862b6-1d8b-4f93-a585-2952f83e39c3_1067x787.gif" width="1067" height="787" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/269862b6-1d8b-4f93-a585-2952f83e39c3_1067x787.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:787,&quot;width&quot;:1067,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!SAr0!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F269862b6-1d8b-4f93-a585-2952f83e39c3_1067x787.gif 424w, https://substackcdn.com/image/fetch/$s_!SAr0!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F269862b6-1d8b-4f93-a585-2952f83e39c3_1067x787.gif 848w, https://substackcdn.com/image/fetch/$s_!SAr0!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F269862b6-1d8b-4f93-a585-2952f83e39c3_1067x787.gif 1272w, https://substackcdn.com/image/fetch/$s_!SAr0!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F269862b6-1d8b-4f93-a585-2952f83e39c3_1067x787.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Now we are ready to start our analysis. A good place to start is the info command that shows a summarized version of what is inside the cache:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hNfi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4913d1d7-8321-4790-8fc5-00e6c87304cc_1355x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hNfi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4913d1d7-8321-4790-8fc5-00e6c87304cc_1355x1000.png 424w, https://substackcdn.com/image/fetch/$s_!hNfi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4913d1d7-8321-4790-8fc5-00e6c87304cc_1355x1000.png 848w, https://substackcdn.com/image/fetch/$s_!hNfi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4913d1d7-8321-4790-8fc5-00e6c87304cc_1355x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!hNfi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4913d1d7-8321-4790-8fc5-00e6c87304cc_1355x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hNfi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4913d1d7-8321-4790-8fc5-00e6c87304cc_1355x1000.png" width="1355" height="1000" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4913d1d7-8321-4790-8fc5-00e6c87304cc_1355x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1000,&quot;width&quot;:1355,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!hNfi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4913d1d7-8321-4790-8fc5-00e6c87304cc_1355x1000.png 424w, https://substackcdn.com/image/fetch/$s_!hNfi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4913d1d7-8321-4790-8fc5-00e6c87304cc_1355x1000.png 848w, https://substackcdn.com/image/fetch/$s_!hNfi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4913d1d7-8321-4790-8fc5-00e6c87304cc_1355x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!hNfi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4913d1d7-8321-4790-8fc5-00e6c87304cc_1355x1000.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3>Are we training the right thing?</h3><p>The first thing that should catch our attention is that there&#8217;s more than 10% of classes that were used on the production run but were not cached. That&#8217;s not usual, so let&#8217;s dig into whatImage description those classes are. There are hundreds of them, so if we filter by our package name, that would make our exploration easier:</p><p>What does this mean? Let&#8217;s take a closer look:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2oPL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0df5667a-77d5-4d3c-bc63-9c73f563c639_744x185.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2oPL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0df5667a-77d5-4d3c-bc63-9c73f563c639_744x185.png 424w, https://substackcdn.com/image/fetch/$s_!2oPL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0df5667a-77d5-4d3c-bc63-9c73f563c639_744x185.png 848w, https://substackcdn.com/image/fetch/$s_!2oPL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0df5667a-77d5-4d3c-bc63-9c73f563c639_744x185.png 1272w, https://substackcdn.com/image/fetch/$s_!2oPL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0df5667a-77d5-4d3c-bc63-9c73f563c639_744x185.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2oPL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0df5667a-77d5-4d3c-bc63-9c73f563c639_744x185.png" width="744" height="185" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0df5667a-77d5-4d3c-bc63-9c73f563c639_744x185.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:185,&quot;width&quot;:744,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!2oPL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0df5667a-77d5-4d3c-bc63-9c73f563c639_744x185.png 424w, https://substackcdn.com/image/fetch/$s_!2oPL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0df5667a-77d5-4d3c-bc63-9c73f563c639_744x185.png 848w, https://substackcdn.com/image/fetch/$s_!2oPL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0df5667a-77d5-4d3c-bc63-9c73f563c639_744x185.png 1272w, https://substackcdn.com/image/fetch/$s_!2oPL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0df5667a-77d5-4d3c-bc63-9c73f563c639_744x185.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p></p><p>This class was not loaded during training but it was loaded during production. Something went wrong with our training.</p><p>We can explore the class <em><a href="http://org.cutecats.rest/">org.cutecats.rest</a>.json.CatPhotoGenerator</em> by looking at the source code. There, we discover that it should be used by <em><a href="http://org.cutecats.rest/">org.cutecats.rest</a>.json.CatResource</em>.</p><p>So, this class was loaded both on training and production runs, and the metadata is included in the AOT Cache. But for some reason, none of its methods were profiled during the training run. This means that our training run did not make extensive use of this class. Maybe we should take a look at our training run.</p><p>And indeed, there is an obvious mistake: the <em>urls.txt</em> file that oha used to create the requests only contains the static html pages. None of our Java classes are executed, although Quarkus loaded them at the beginning as services.</p><p>Let&#8217;s run again the training, changing the url to the Java endpoints instead of the html pages: <a href="http://localhost:8080/cats">http://localhost:8080/cats</a> and <a href="http://localhost:8080/list">http://localhost:8080/list</a></p><p>Don&#8217;t forget to remove the log and aot files from target/ after each try to have clean runs (the clean on the maven command should do that).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!g70U!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F919340d3-bfb5-4fba-ac79-d79cd265ddce_1068x784.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!g70U!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F919340d3-bfb5-4fba-ac79-d79cd265ddce_1068x784.gif 424w, https://substackcdn.com/image/fetch/$s_!g70U!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F919340d3-bfb5-4fba-ac79-d79cd265ddce_1068x784.gif 848w, https://substackcdn.com/image/fetch/$s_!g70U!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F919340d3-bfb5-4fba-ac79-d79cd265ddce_1068x784.gif 1272w, https://substackcdn.com/image/fetch/$s_!g70U!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F919340d3-bfb5-4fba-ac79-d79cd265ddce_1068x784.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!g70U!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F919340d3-bfb5-4fba-ac79-d79cd265ddce_1068x784.gif" width="1068" height="784" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/919340d3-bfb5-4fba-ac79-d79cd265ddce_1068x784.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:784,&quot;width&quot;:1068,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!g70U!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F919340d3-bfb5-4fba-ac79-d79cd265ddce_1068x784.gif 424w, https://substackcdn.com/image/fetch/$s_!g70U!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F919340d3-bfb5-4fba-ac79-d79cd265ddce_1068x784.gif 848w, https://substackcdn.com/image/fetch/$s_!g70U!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F919340d3-bfb5-4fba-ac79-d79cd265ddce_1068x784.gif 1272w, https://substackcdn.com/image/fetch/$s_!g70U!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F919340d3-bfb5-4fba-ac79-d79cd265ddce_1068x784.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>If we analyze the results again with our tool, we should see a different result:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fQk6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8752b2f-b758-4518-96a3-f60ecbc31ce8_1068x784.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fQk6!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8752b2f-b758-4518-96a3-f60ecbc31ce8_1068x784.gif 424w, https://substackcdn.com/image/fetch/$s_!fQk6!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8752b2f-b758-4518-96a3-f60ecbc31ce8_1068x784.gif 848w, https://substackcdn.com/image/fetch/$s_!fQk6!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8752b2f-b758-4518-96a3-f60ecbc31ce8_1068x784.gif 1272w, https://substackcdn.com/image/fetch/$s_!fQk6!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8752b2f-b758-4518-96a3-f60ecbc31ce8_1068x784.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fQk6!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8752b2f-b758-4518-96a3-f60ecbc31ce8_1068x784.gif" width="1068" height="784" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f8752b2f-b758-4518-96a3-f60ecbc31ce8_1068x784.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:784,&quot;width&quot;:1068,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!fQk6!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8752b2f-b758-4518-96a3-f60ecbc31ce8_1068x784.gif 424w, https://substackcdn.com/image/fetch/$s_!fQk6!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8752b2f-b758-4518-96a3-f60ecbc31ce8_1068x784.gif 848w, https://substackcdn.com/image/fetch/$s_!fQk6!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8752b2f-b758-4518-96a3-f60ecbc31ce8_1068x784.gif 1272w, https://substackcdn.com/image/fetch/$s_!fQk6!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8752b2f-b758-4518-96a3-f60ecbc31ce8_1068x784.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pM6T!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62b3c5c5-5410-4dfb-826d-4378802a3317_1035x761.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pM6T!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62b3c5c5-5410-4dfb-826d-4378802a3317_1035x761.png 424w, https://substackcdn.com/image/fetch/$s_!pM6T!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62b3c5c5-5410-4dfb-826d-4378802a3317_1035x761.png 848w, https://substackcdn.com/image/fetch/$s_!pM6T!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62b3c5c5-5410-4dfb-826d-4378802a3317_1035x761.png 1272w, https://substackcdn.com/image/fetch/$s_!pM6T!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62b3c5c5-5410-4dfb-826d-4378802a3317_1035x761.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pM6T!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62b3c5c5-5410-4dfb-826d-4378802a3317_1035x761.png" width="1035" height="761" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/62b3c5c5-5410-4dfb-826d-4378802a3317_1035x761.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:761,&quot;width&quot;:1035,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!pM6T!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62b3c5c5-5410-4dfb-826d-4378802a3317_1035x761.png 424w, https://substackcdn.com/image/fetch/$s_!pM6T!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62b3c5c5-5410-4dfb-826d-4378802a3317_1035x761.png 848w, https://substackcdn.com/image/fetch/$s_!pM6T!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62b3c5c5-5410-4dfb-826d-4378802a3317_1035x761.png 1272w, https://substackcdn.com/image/fetch/$s_!pM6T!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62b3c5c5-5410-4dfb-826d-4378802a3317_1035x761.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>We have increased the percentage of the classes used (96%) in production that were cached compared to our last attempt (89%). That&#8217;s an improvement.</p><h3>Did we load all relevant classes during Training?</h3><p>Let&#8217;s check again for classes loaded in production that were not cached:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KvlN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1cc7120-fc40-4839-937e-b61653073a01_744x73.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KvlN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1cc7120-fc40-4839-937e-b61653073a01_744x73.png 424w, https://substackcdn.com/image/fetch/$s_!KvlN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1cc7120-fc40-4839-937e-b61653073a01_744x73.png 848w, https://substackcdn.com/image/fetch/$s_!KvlN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1cc7120-fc40-4839-937e-b61653073a01_744x73.png 1272w, https://substackcdn.com/image/fetch/$s_!KvlN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1cc7120-fc40-4839-937e-b61653073a01_744x73.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KvlN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1cc7120-fc40-4839-937e-b61653073a01_744x73.png" width="744" height="73" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e1cc7120-fc40-4839-937e-b61653073a01_744x73.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:73,&quot;width&quot;:744,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!KvlN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1cc7120-fc40-4839-937e-b61653073a01_744x73.png 424w, https://substackcdn.com/image/fetch/$s_!KvlN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1cc7120-fc40-4839-937e-b61653073a01_744x73.png 848w, https://substackcdn.com/image/fetch/$s_!KvlN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1cc7120-fc40-4839-937e-b61653073a01_744x73.png 1272w, https://substackcdn.com/image/fetch/$s_!KvlN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1cc7120-fc40-4839-937e-b61653073a01_744x73.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p></p><p>Something is still not working as intended. Maybe we should approach this from the other side: are we executing some testing code that replaces the real production code that should be executed during training?</p><p>Let&#8217;s check if there&#8217;s something being stored in the cache that we don&#8217;t really need:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_ZGq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb70b5c9c-2984-4dd9-b83e-7d8154476c13_1037x762.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_ZGq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb70b5c9c-2984-4dd9-b83e-7d8154476c13_1037x762.png 424w, https://substackcdn.com/image/fetch/$s_!_ZGq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb70b5c9c-2984-4dd9-b83e-7d8154476c13_1037x762.png 848w, https://substackcdn.com/image/fetch/$s_!_ZGq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb70b5c9c-2984-4dd9-b83e-7d8154476c13_1037x762.png 1272w, https://substackcdn.com/image/fetch/$s_!_ZGq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb70b5c9c-2984-4dd9-b83e-7d8154476c13_1037x762.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_ZGq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb70b5c9c-2984-4dd9-b83e-7d8154476c13_1037x762.png" width="1037" height="762" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b70b5c9c-2984-4dd9-b83e-7d8154476c13_1037x762.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:762,&quot;width&quot;:1037,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!_ZGq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb70b5c9c-2984-4dd9-b83e-7d8154476c13_1037x762.png 424w, https://substackcdn.com/image/fetch/$s_!_ZGq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb70b5c9c-2984-4dd9-b83e-7d8154476c13_1037x762.png 848w, https://substackcdn.com/image/fetch/$s_!_ZGq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb70b5c9c-2984-4dd9-b83e-7d8154476c13_1037x762.png 1272w, https://substackcdn.com/image/fetch/$s_!_ZGq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb70b5c9c-2984-4dd9-b83e-7d8154476c13_1037x762.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>We can see a suspicious class called <em>DummyPhotoGenerator</em>. That&#8217;s supposed to be used only for testing purposes, not for real training and production. Using DummyPhotoGenerator instead of the CatPhotoGenerator class is making the code and classes used by CatPhotoGenerator not being used. If we explore our source code, we will discover that there is a &#8220;test&#8221; argument on the /cats endpoint that distinguishes between testing and production.</p><p>To fix our training, we have to call the endpoint /cats with a test=false argument. <strong>Because the training run is not a test run.</strong></p><p>The training run has to be as close to production as possible. If we use test classes, not only will they be stored in the cache and be loaded on production run, but they may also hide real production code from being trained.</p><p>Let&#8217;s try again, now using <a href="http://localhost:8080/cats?test=false">http://localhost:8080/cats?test=false</a> in the urls.txt file.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TmLU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffebe1063-b709-4984-88a1-872977dce459_1038x765.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TmLU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffebe1063-b709-4984-88a1-872977dce459_1038x765.png 424w, https://substackcdn.com/image/fetch/$s_!TmLU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffebe1063-b709-4984-88a1-872977dce459_1038x765.png 848w, https://substackcdn.com/image/fetch/$s_!TmLU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffebe1063-b709-4984-88a1-872977dce459_1038x765.png 1272w, https://substackcdn.com/image/fetch/$s_!TmLU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffebe1063-b709-4984-88a1-872977dce459_1038x765.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TmLU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffebe1063-b709-4984-88a1-872977dce459_1038x765.png" width="1038" height="765" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/febe1063-b709-4984-88a1-872977dce459_1038x765.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:765,&quot;width&quot;:1038,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!TmLU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffebe1063-b709-4984-88a1-872977dce459_1038x765.png 424w, https://substackcdn.com/image/fetch/$s_!TmLU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffebe1063-b709-4984-88a1-872977dce459_1038x765.png 848w, https://substackcdn.com/image/fetch/$s_!TmLU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffebe1063-b709-4984-88a1-872977dce459_1038x765.png 1272w, https://substackcdn.com/image/fetch/$s_!TmLU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffebe1063-b709-4984-88a1-872977dce459_1038x765.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>We have increased a bit more the percentage of classes loaded, which is always a good sign. Image description Do we have any other classes loaded during production that were not cached during training? Are there any testing classes loaded during training or production runs?</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yq_z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26837cbf-d1fa-4e59-861a-4168ade09979_1036x588.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yq_z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26837cbf-d1fa-4e59-861a-4168ade09979_1036x588.png 424w, https://substackcdn.com/image/fetch/$s_!yq_z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26837cbf-d1fa-4e59-861a-4168ade09979_1036x588.png 848w, https://substackcdn.com/image/fetch/$s_!yq_z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26837cbf-d1fa-4e59-861a-4168ade09979_1036x588.png 1272w, https://substackcdn.com/image/fetch/$s_!yq_z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26837cbf-d1fa-4e59-861a-4168ade09979_1036x588.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yq_z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26837cbf-d1fa-4e59-861a-4168ade09979_1036x588.png" width="1036" height="588" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/26837cbf-d1fa-4e59-861a-4168ade09979_1036x588.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:588,&quot;width&quot;:1036,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!yq_z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26837cbf-d1fa-4e59-861a-4168ade09979_1036x588.png 424w, https://substackcdn.com/image/fetch/$s_!yq_z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26837cbf-d1fa-4e59-861a-4168ade09979_1036x588.png 848w, https://substackcdn.com/image/fetch/$s_!yq_z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26837cbf-d1fa-4e59-861a-4168ade09979_1036x588.png 1272w, https://substackcdn.com/image/fetch/$s_!yq_z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26837cbf-d1fa-4e59-861a-4168ade09979_1036x588.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>We made sure that:</p><ul><li><p>All our classes used in production are included in the cache</p></li><li><p>None of our testing classes are included in the cache</p></li></ul><p>Although we still don&#8217;t have the aspiring ideal 100% classes cached, we are really close (98%) and we can be happy with the list of classes cached. We can now focus on how good the profiling of the methods is.</p><h3>Are our methods properly trained?</h3><p>Maybe you already noticed another important information we have been ignoring until now: all our classes are labelled as &#8220;<strong>[Untrained]</strong>&#8220;. Let&#8217;s take a closer look at that.</p><p>Profiling is done on each method independently, so let&#8217;s take a look at one of our methods that we know should be well trained. The describe command is pretty self explanatory on this case:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!d2qc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a0468e9-6abe-4ff2-a422-3f29feaa8a7f_1036x757.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!d2qc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a0468e9-6abe-4ff2-a422-3f29feaa8a7f_1036x757.png 424w, https://substackcdn.com/image/fetch/$s_!d2qc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a0468e9-6abe-4ff2-a422-3f29feaa8a7f_1036x757.png 848w, https://substackcdn.com/image/fetch/$s_!d2qc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a0468e9-6abe-4ff2-a422-3f29feaa8a7f_1036x757.png 1272w, https://substackcdn.com/image/fetch/$s_!d2qc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a0468e9-6abe-4ff2-a422-3f29feaa8a7f_1036x757.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!d2qc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a0468e9-6abe-4ff2-a422-3f29feaa8a7f_1036x757.png" width="1036" height="757" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0a0468e9-6abe-4ff2-a422-3f29feaa8a7f_1036x757.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:757,&quot;width&quot;:1036,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!d2qc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a0468e9-6abe-4ff2-a422-3f29feaa8a7f_1036x757.png 424w, https://substackcdn.com/image/fetch/$s_!d2qc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a0468e9-6abe-4ff2-a422-3f29feaa8a7f_1036x757.png 848w, https://substackcdn.com/image/fetch/$s_!d2qc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a0468e9-6abe-4ff2-a422-3f29feaa8a7f_1036x757.png 1272w, https://substackcdn.com/image/fetch/$s_!d2qc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a0468e9-6abe-4ff2-a422-3f29feaa8a7f_1036x757.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Let&#8217;s follow the recommendation and do more requests during the training run.</p><p><em><strong>$ oha --urls-from-file src/main/resources/urls.txt -n 10k</strong></em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CEjC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F403f6c15-6cca-4232-bec4-540cc2413977_600x407.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CEjC!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F403f6c15-6cca-4232-bec4-540cc2413977_600x407.gif 424w, https://substackcdn.com/image/fetch/$s_!CEjC!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F403f6c15-6cca-4232-bec4-540cc2413977_600x407.gif 848w, https://substackcdn.com/image/fetch/$s_!CEjC!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F403f6c15-6cca-4232-bec4-540cc2413977_600x407.gif 1272w, https://substackcdn.com/image/fetch/$s_!CEjC!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F403f6c15-6cca-4232-bec4-540cc2413977_600x407.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CEjC!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F403f6c15-6cca-4232-bec4-540cc2413977_600x407.gif" width="600" height="407" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/403f6c15-6cca-4232-bec4-540cc2413977_600x407.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:407,&quot;width&quot;:600,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!CEjC!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F403f6c15-6cca-4232-bec4-540cc2413977_600x407.gif 424w, https://substackcdn.com/image/fetch/$s_!CEjC!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F403f6c15-6cca-4232-bec4-540cc2413977_600x407.gif 848w, https://substackcdn.com/image/fetch/$s_!CEjC!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F403f6c15-6cca-4232-bec4-540cc2413977_600x407.gif 1272w, https://substackcdn.com/image/fetch/$s_!CEjC!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F403f6c15-6cca-4232-bec4-540cc2413977_600x407.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>And with 10 000 requests done, we can see that we got our method completely profiled and compiled to the higher level:</p><p>There&#8217;s still more improvements that can be done to the training that will greatly depend on your application, but now we have all the basics covered.</p><div><hr></div><h3>Also on Foojay This Month</h3><div id="youtube2-vlVVLM4ogy0" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;vlVVLM4ogy0&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/vlVVLM4ogy0?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p><strong><a href="https://foojay.io/today/foojay-podcast-92/">Foojay Podcast #92: Java 26 Is Here: What&#8217;s New, What&#8217;s Gone, and Why It Matters in 2026</a></strong> - <a href="https://www.linkedin.com/in/frankdelporte/">Frank Delporte</a>hosts <a href="https://www.linkedin.com/in/siritter/">Simon Ritter</a> (Deputy CTO at Azul) and <a href="https://www.linkedin.com/in/lo%C3%AFc-mathieu-475b144/">Lo&#239;c Mathieu</a> (Lead Software Engineer at Kestra.io) for a thorough walkthrough of Java 26. Ten JEPs in total - five new features, five preview/incubator rounds. Highlights include JEP 500 (Prepare to Make Final Mean Final), JEP 517 (HTTP/3 for the HTTP Client API), JEP 504 (the final removal of the Applet API - farewell, old friend), JEP 516 (the aforementioned AOT Object Caching with Any GC), JEP 522 (G1 GC throughput improvements), and the sixth preview of Structured Concurrency (JEP 525). The discussion also touches on which Java versions companies are actually using, the ongoing Vector API saga (eleventh incubator, waiting on Valhalla), and what Java still needs to be truly &#8220;AI-ready&#8221; - with code reflection from Project Babylon and TornadoVM mentioned as key pieces. Solid listen for staying current with the release cadence.</p><div><hr></div><h3>How We Built a Java AI Agent by Connecting the Dots the Ecosystem Already Had</h3><p>As I mentioned week ago, the team behind <a href="https://www.jobrunr.io/">JobRunr</a> published a fascinating writeup about <a href="https://clawrunr.io/">ClawRunr</a> (nicknamed &#8220;JavaClaw&#8221; by the community - and they&#8217;ve apparently stopped correcting people). It&#8217;s an open-source AI agent runtime written in pure Java, and the interesting part isn&#8217;t the AI - it&#8217;s how boring the architecture is, in the best possible way. Spring AI for LLM calls, Spring Events for multi-channel routing (Telegram, browser, whatever comes next), JobRunr for reliable background job scheduling with retries and dashboards, Spring Modulith for clean module boundaries. The <code>DefaultAgent</code> class is 20 lines.</p><p>The <a href="https://foojay.io/today/how-we-built-a-java-ai-agent-by-connecting-the-dots-the-ecosystem-already-had/">foojay.io article&#8217;s</a> central argument is provocative: the hardest problem in an AI agent isn&#8217;t talking to the LLM - it&#8217;s reliable task execution. Scheduling a &#8220;summarize my emails every morning at 8&#8221; requires retry logic, persistence across restarts, and visibility into failures. That&#8217;s a background job problem, and Java has been solving those for decades. Within three days of release, someone in the community had already written a Discord plugin without touching the agent core. The Java ecosystem just... works for this.</p><div><hr></div><h3>Eclipse GlassFish: This Isn&#8217;t Your Father&#8217;s GlassFish</h3><p><a href="https://omnifish.ee/">OmniFish</a> team tackles the most persistent myth in the <a href="https://foojay.io/today/eclipse-glassfish-this-isnt-your-fathers-glassfish/">Jakarta EE world</a>: that GlassFish is a dead, unsupported, development-only toy. <a href="https://foojay.io/today/eclipse-glassfish-this-isnt-your-fathers-glassfish/">Eclipse GlassFish: This Isn&#8217;t Your Father&#8217;s</a> draws a clear line between Oracle-era GlassFish (pre-2018, stagnant releases, limited support) and Eclipse GlassFish 7.0+ (since 2022 - monthly releases, Java 11&#8211;25 support, Jakarta EE 11 compliance, several MicroProfile APIs, commercial long-term support from OmniFish). </p><p>There&#8217;s also a new embedded GlassFish mode that lets you spin up a Jakarta EE environment programmatically - useful for testing and microservice-style deployments. If your mental model of GlassFish stopped somewhere around 2014, this is a good reality check.</p><div><hr></div><h3>Managing Native Memory in Java: Arenas, Malloc, and Custom Pools</h3><p><a href="https://foojay.io/today/java-native-memory-allocation-ffm-api/">Managing Native Memory in Java: Arenas, Malloc, and Custom Pools</a> by <a href="https://foojay.io/today/author/david-vlijmincx/">David Vlijmincx</a> guide to the FFM API&#8217;s memory management primitives. David walks through the four built-in Arena types (<code>global</code>, <code>ofAuto</code>, <code>ofConfined</code>, <code>ofShared</code>) with their respective tradeoffs between lifetime determinism and thread safety, then goes deeper - implementing a custom <code>LoggingArena</code>, using raw <code>malloc</code>/<code>free</code> via FFM for full control, building reusable memory pools, and slicing segments for zero-allocation sub-regions. </p><p>The article does a good job of presenting the spectrum from &#8220;safe and easy&#8221; (use <code>Arena.ofConfined()</code> in a try-with-resources) to &#8220;you&#8217;re basically writing C now&#8221; (raw <code>malloc</code> with manual lifecycle management). If you&#8217;ve been curious about going off-heap with modern Java but found the official docs a bit abstract, this is a good entry point.</p><div><hr></div><h3>The Java in Education Catalog Now Has a Beautiful Home</h3><p>by <a href="https://www.linkedin.com/in/frankdelporte/">Frank Delporte</a> and <a href="https://www.linkedin.com/in/igfasouza/">Igor De Souza</a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Bbjp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6f75100-9eb6-483f-bf0a-d2c60aa98903_1489x1029.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Bbjp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6f75100-9eb6-483f-bf0a-d2c60aa98903_1489x1029.png 424w, https://substackcdn.com/image/fetch/$s_!Bbjp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6f75100-9eb6-483f-bf0a-d2c60aa98903_1489x1029.png 848w, https://substackcdn.com/image/fetch/$s_!Bbjp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6f75100-9eb6-483f-bf0a-d2c60aa98903_1489x1029.png 1272w, https://substackcdn.com/image/fetch/$s_!Bbjp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6f75100-9eb6-483f-bf0a-d2c60aa98903_1489x1029.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Bbjp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6f75100-9eb6-483f-bf0a-d2c60aa98903_1489x1029.png" width="1456" height="1006" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d6f75100-9eb6-483f-bf0a-d2c60aa98903_1489x1029.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1006,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Bbjp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6f75100-9eb6-483f-bf0a-d2c60aa98903_1489x1029.png 424w, https://substackcdn.com/image/fetch/$s_!Bbjp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6f75100-9eb6-483f-bf0a-d2c60aa98903_1489x1029.png 848w, https://substackcdn.com/image/fetch/$s_!Bbjp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6f75100-9eb6-483f-bf0a-d2c60aa98903_1489x1029.png 1272w, https://substackcdn.com/image/fetch/$s_!Bbjp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6f75100-9eb6-483f-bf0a-d2c60aa98903_1489x1029.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Remember Igor&#8217;s earlier piece on the <a href="https://foojay.io/today/bringing-java-closer-to-education-a-community-driven-initiative/">Java Education Catalog</a> - the community-driven GitHub repo collecting Java educational resources?</p><p>It now has a proper website at <a href="https://education.foojay.social/">education.foojay.social</a>, built using a workflow borrowed (with permission) from <a href="https://www.linkedin.com/in/jamesward/">James Ward</a>&#8216;s excellent <a href="https://ai4jvm.com/">ai4jvm.com</a> site. The catalog includes JetBrains tutorials, Devoxx4Kids resources, Pi4J/JBang examples for Raspberry Pi, and books like &#8220;Raising Young Coders.&#8221; Contributing is as simple as editing a <code>SPEC.md</code> file and opening a PR. A GitHub README is functional, but an actual browsable website is what gets educators - who aren&#8217;t necessarily deep in the coding ecosystem - to actually discover and use these resources.</p><p>Nice community work.</p><div><hr></div><p>And that&#8217;s all, folks.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!km-o!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785fa772-1239-477c-b13d-ea3cc30900ab_1530x1013.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!km-o!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785fa772-1239-477c-b13d-ea3cc30900ab_1530x1013.png 424w, https://substackcdn.com/image/fetch/$s_!km-o!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785fa772-1239-477c-b13d-ea3cc30900ab_1530x1013.png 848w, https://substackcdn.com/image/fetch/$s_!km-o!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785fa772-1239-477c-b13d-ea3cc30900ab_1530x1013.png 1272w, https://substackcdn.com/image/fetch/$s_!km-o!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785fa772-1239-477c-b13d-ea3cc30900ab_1530x1013.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!km-o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785fa772-1239-477c-b13d-ea3cc30900ab_1530x1013.png" width="1456" height="964" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/785fa772-1239-477c-b13d-ea3cc30900ab_1530x1013.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:964,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3418473,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/192834451?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785fa772-1239-477c-b13d-ea3cc30900ab_1530x1013.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!km-o!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785fa772-1239-477c-b13d-ea3cc30900ab_1530x1013.png 424w, https://substackcdn.com/image/fetch/$s_!km-o!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785fa772-1239-477c-b13d-ea3cc30900ab_1530x1013.png 848w, https://substackcdn.com/image/fetch/$s_!km-o!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785fa772-1239-477c-b13d-ea3cc30900ab_1530x1013.png 1272w, https://substackcdn.com/image/fetch/$s_!km-o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F785fa772-1239-477c-b13d-ea3cc30900ab_1530x1013.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div>]]></content:encoded></item><item><title><![CDATA[The Rest of the Story: March Edition - JVM Weekly vol. 168]]></title><description><![CDATA[From JDK 26 going GA through JetBrains doing... everything at once seemingly to ClawRunr proving the JVM is ready for the agentic era - March was packed.]]></description><link>https://www.jvm-weekly.com/p/the-rest-of-the-story-march-edition</link><guid isPermaLink="false">https://www.jvm-weekly.com/p/the-rest-of-the-story-march-edition</guid><dc:creator><![CDATA[Artur Skowronski]]></dc:creator><pubDate>Thu, 26 Mar 2026 14:03:21 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!qBhp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53771feb-341d-4ab5-a927-f389b0021e26_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qBhp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53771feb-341d-4ab5-a927-f389b0021e26_1456x1048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qBhp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53771feb-341d-4ab5-a927-f389b0021e26_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!qBhp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53771feb-341d-4ab5-a927-f389b0021e26_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!qBhp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53771feb-341d-4ab5-a927-f389b0021e26_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!qBhp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53771feb-341d-4ab5-a927-f389b0021e26_1456x1048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qBhp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53771feb-341d-4ab5-a927-f389b0021e26_1456x1048.png" width="1456" height="1048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/53771feb-341d-4ab5-a927-f389b0021e26_1456x1048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1048,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1939234,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/192179556?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53771feb-341d-4ab5-a927-f389b0021e26_1456x1048.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qBhp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53771feb-341d-4ab5-a927-f389b0021e26_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!qBhp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53771feb-341d-4ab5-a927-f389b0021e26_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!qBhp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53771feb-341d-4ab5-a927-f389b0021e26_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!qBhp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F53771feb-341d-4ab5-a927-f389b0021e26_1456x1048.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>This time the material practically wrote itself. JDK 26 shipped, JHipster caught up with Spring Boot 4, Kotlin keeps polishing K2 like it&#8217;s a family heirloom, JetBrains reshuffled its product strategy, and the JVM agentic ecosystem quietly got its first serious reference implementation. On top of all that, the community had one of its best months for thoughtful technical discourse &#8212; debunking performance myths, formalizing benchmarking standards, and connecting polyglot runtimes. Let&#8217;s dive in!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2><strong>1. March: The Rest of the Story</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qQ1H!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F871a0567-b1a8-423b-9ef6-5a5c68040178_1176x778.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qQ1H!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F871a0567-b1a8-423b-9ef6-5a5c68040178_1176x778.png 424w, https://substackcdn.com/image/fetch/$s_!qQ1H!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F871a0567-b1a8-423b-9ef6-5a5c68040178_1176x778.png 848w, https://substackcdn.com/image/fetch/$s_!qQ1H!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F871a0567-b1a8-423b-9ef6-5a5c68040178_1176x778.png 1272w, https://substackcdn.com/image/fetch/$s_!qQ1H!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F871a0567-b1a8-423b-9ef6-5a5c68040178_1176x778.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qQ1H!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F871a0567-b1a8-423b-9ef6-5a5c68040178_1176x778.png" width="1176" height="778" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/871a0567-b1a8-423b-9ef6-5a5c68040178_1176x778.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:778,&quot;width&quot;:1176,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!qQ1H!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F871a0567-b1a8-423b-9ef6-5a5c68040178_1176x778.png 424w, https://substackcdn.com/image/fetch/$s_!qQ1H!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F871a0567-b1a8-423b-9ef6-5a5c68040178_1176x778.png 848w, https://substackcdn.com/image/fetch/$s_!qQ1H!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F871a0567-b1a8-423b-9ef6-5a5c68040178_1176x778.png 1272w, https://substackcdn.com/image/fetch/$s_!qQ1H!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F871a0567-b1a8-423b-9ef6-5a5c68040178_1176x778.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Just as a reminder - JDK 26 went GA on March 17th - ten JEPs across five categories, and more substance than most non-LTS releases deserve. The infrastructure headline is <strong><a href="https://openjdk.org/jeps/516">JEP 516</a></strong> (Ahead-of-Time Object Caching with Any GC), which extends Project Leyden&#8217;s AOT cache to <em>all</em> garbage collectors &#8212; including ZGC, which was previously incompatible due to its advanced memory layout. The fix is elegant: instead of directly memory-mapping cached objects in a GC-specific format, they&#8217;re now loaded sequentially from a neutral, GC-agnostic representation. <strong><a href="https://openjdk.org/jeps/522">JEP 522</a></strong> squeezes up to 15% more throughput from G1 by reducing synchronization overhead between application and GC threads. And <strong><a href="https://openjdk.org/jeps/519">JEP 519</a></strong> brings HTTP/3 to the built-in HTTP Client API - a long-awaited modernization that brings QUIC-based transport to Java&#8217;s networking stack.</p><p>On the security front - and this tends to get lost in the JEP noise - JDK 26 delivers a quietly impressive batch of improvements. The headline is <strong>Hybrid Public Key Encryption (HPKE)</strong> support per <strong><a href="https://www.rfc-editor.org/rfc/rfc9180.html">RFC 9180</a></strong>, accessible through the familiar Cipher API with a new HPKEParameterSpec class. HPKE combines a KEM, KDF, and AEAD algorithm into a modern encryption scheme that&#8217;s already widely used in protocols like TLS ECH and MLS - and Java finally speaks it natively. For now it&#8217;s limited to traditional algorithms (X25519 and friends), with PQC variants coming once the IETF draft matures. Alongside HPKE, the jarsigner tool now supports <strong>ML-DSA signatures</strong> &#8212; meaning you can sign JARs with a quantum-resistant algorithm today. Not &#8220;in preview,&#8221; not &#8220;experimental&#8221; - actual production jarsigner support. The post-quantum transition isn&#8217;t theoretical anymore; it&#8217;s in your build pipeline.</p><p>As <strong><a href="https://seanjmullan.org/blog/2026/03/16/jdk26">Sean Mullan</a></strong> notes in his traditional JDK security roundup - which remains the single best resource for tracking Java&#8217;s security evolution release by release - these changes collectively push Java&#8217;s crypto stack further toward post-quantum readiness while cleaning out the legacy cruft that&#8217;s been accumulating for decades.</p><p>For teams still on JDK 21: Oracle&#8217;s permissive NFTC licensing for JDK 21 ends in September 2026. Migration planning should be well underway.</p><div><hr></div><p><strong><a href="https://www.linkedin.com/article/edit/7442327576586633216/#">Ronald Dehuysser</a></strong> and <strong><a href="https://www.jobrunr.io/">the team at JobRunr</a></strong> launched <strong><a href="https://clawrunr.io/">ClawRunr</a></strong> (also known as JavaClaw) - an open-source AI agent runtime built on JDK 25, Spring Boot 4, Spring AI, and JobRunr. It&#8217;s essentially a Java port of <strong><a href="https://github.com/openclaw/openclaw">OpenClaw</a></strong> - the Node.js personal AI assistant we discussed back in the OpenClaw/Peter Steinberger edition.</p><p>Let me start with strong statement - this is one of my favourite Duke personas ever.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rKTD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cbe8a16-a543-4489-8bc7-d67ef3c85eba_744x322.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rKTD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cbe8a16-a543-4489-8bc7-d67ef3c85eba_744x322.png 424w, https://substackcdn.com/image/fetch/$s_!rKTD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cbe8a16-a543-4489-8bc7-d67ef3c85eba_744x322.png 848w, https://substackcdn.com/image/fetch/$s_!rKTD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cbe8a16-a543-4489-8bc7-d67ef3c85eba_744x322.png 1272w, https://substackcdn.com/image/fetch/$s_!rKTD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cbe8a16-a543-4489-8bc7-d67ef3c85eba_744x322.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rKTD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cbe8a16-a543-4489-8bc7-d67ef3c85eba_744x322.png" width="744" height="322" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8cbe8a16-a543-4489-8bc7-d67ef3c85eba_744x322.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:322,&quot;width&quot;:744,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!rKTD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cbe8a16-a543-4489-8bc7-d67ef3c85eba_744x322.png 424w, https://substackcdn.com/image/fetch/$s_!rKTD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cbe8a16-a543-4489-8bc7-d67ef3c85eba_744x322.png 848w, https://substackcdn.com/image/fetch/$s_!rKTD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cbe8a16-a543-4489-8bc7-d67ef3c85eba_744x322.png 1272w, https://substackcdn.com/image/fetch/$s_!rKTD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cbe8a16-a543-4489-8bc7-d67ef3c85eba_744x322.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>What makes <strong><a href="https://clawrunr.io/">ClawRunr</a></strong> architecturally interesting: agents can self-schedule cron jobs, one-shot tasks, and recurring work through tool calls, with <strong><a href="https://www.linkedin.com/article/edit/7442327576586633216/#">JobRunr</a></strong> persisting everything across restarts. Skills are loaded at runtime via SKILL.md files dropped into a workspace directory - no recompilation, no redeployment. Supports OpenAI, Anthropic, and Ollama out of the box - to run entirely on your hardware. The stack reads like a Spring Boot 4 showcase application - which, strategically, may be exactly the point.</p><p>Combined with <strong>SkillsJars</strong> (Maven Central as a package manager for AI agent skills, from last month&#8217;s ROTS) and the Open Liberty MCP feature (more on that below), the JVM agentic ecosystem is coalescing faster than I expected. Someone should probably write some overview of this trend... &#128521;</p><div><hr></div><p>JetBrains made two significant strategic moves this month that read as a single coherent narrative. First: <strong><a href="https://blog.jetbrains.com/idea/2026/03/javascript-and-typescript-in-intellij-idea/">core JavaScript and TypeScript support is now free in IntelliJ IDEA</a></strong>. Historically, robust web development was a primary differentiator for the paid Ultimate Edition, often forcing JVM developers to context-switch between IntelliJ for backend and VS Code for frontend. This move directly targets that friction = and acknowledges that the modern developer persona is rarely confined to a single language.</p><p>Second: <strong><a href="https://blog.jetbrains.com/idea/">Code With Me enters maintenance mode</a></strong> starting with IDE version 2025.1, with full decommission by 2026.3. JetBrains is transitioning from the plugin&#8217;s peer-to-peer relay system to a thin-client model powered by JetBrains Gateway and the Remote Development protocol. For JVM engineers, this means moving toward a headless backend execution model &#8212; the JetBrains Client handles UI, the heavy lifting happens server-side.</p><p>Together, these moves signal JetBrains consolidating around two pillars: IntelliJ as the unified polyglot hub (countering VS Code), and Gateway as the enterprise-grade remote development infrastructure. The collaborative plugin era is over; the protocol-driven era begins.</p><p>However, that&#8217;s not all from JetBrains, they had quite a busy month seemingly.</p><div><hr></div><p><strong><a href="https://blog.jetbrains.com/idea/">JetBrains introduced new inspections in IntelliJ IDEA</a></strong> targeting the intersection of Kotlin Coroutines and JDK 21 Virtual Threads - a pain point that&#8217;s been growing since Loom went GA. The inspections identify risky patterns like making blocking calls within a coroutine scope without the appropriate Dispatcher. This is particularly critical for Spring Boot developers leveraging Virtual Threads: inadvertently blocking a carrier thread or &#8220;pinning&#8221; it can cause performance regressions that are devilishly hard to debug at runtime.</p><p>Managing dual concurrency abstractions - Coroutines and Virtual Threads - within a single codebase remains one of the trickiest challenges in modern JVM development. These guardrails won&#8217;t solve the fundamental design tension, but they&#8217;ll catch the most common mistakes before they make it to production.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Rg8F!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe61e37b5-73a0-4a32-8d5b-1a2faed4f9d0_972x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Rg8F!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe61e37b5-73a0-4a32-8d5b-1a2faed4f9d0_972x1000.png 424w, https://substackcdn.com/image/fetch/$s_!Rg8F!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe61e37b5-73a0-4a32-8d5b-1a2faed4f9d0_972x1000.png 848w, https://substackcdn.com/image/fetch/$s_!Rg8F!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe61e37b5-73a0-4a32-8d5b-1a2faed4f9d0_972x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!Rg8F!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe61e37b5-73a0-4a32-8d5b-1a2faed4f9d0_972x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Rg8F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe61e37b5-73a0-4a32-8d5b-1a2faed4f9d0_972x1000.png" width="972" height="1000" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e61e37b5-73a0-4a32-8d5b-1a2faed4f9d0_972x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1000,&quot;width&quot;:972,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Rg8F!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe61e37b5-73a0-4a32-8d5b-1a2faed4f9d0_972x1000.png 424w, https://substackcdn.com/image/fetch/$s_!Rg8F!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe61e37b5-73a0-4a32-8d5b-1a2faed4f9d0_972x1000.png 848w, https://substackcdn.com/image/fetch/$s_!Rg8F!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe61e37b5-73a0-4a32-8d5b-1a2faed4f9d0_972x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!Rg8F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe61e37b5-73a0-4a32-8d5b-1a2faed4f9d0_972x1000.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>But the cr&#232;me de la cr&#232;me dropped just yesterday. <strong><a href="https://blog.jetbrains.com/blog/2026/03/24/introducing-jetbrains-central-an-open-system-for-agentic-software-development/">JetBrains announced Central</a></strong> - and this one reframes everything above into a single strategic picture. Central is positioned as &#8220;the control and execution plane for agent-driven software production&#8221; &#8212; a layer that connects IDEs, CLI tools, AI agents (not just Junie, but also Claude Agent, Codex, Gemini CLI, or custom-built solutions), and infrastructure into a unified system with governance, cost attribution, and observability.</p><p>Think of it as: free JS/TS support gets more developers into IntelliJ, Gateway provides the headless execution model, Air from two weeks ago coordinates human-agent workflows - and Central sits on top as the enterprise control plane that makes it all manageable at scale.</p><p>The reasoning behind Central is straightforward if you&#8217;ve been paying attention to how AI is actually used in engineering organizations today: most developers already use AI at work, and coding agent adoption is accelerating fast - but the impact remains overwhelmingly limited to individual productivity. Almost nobody has AI meaningfully integrated across the entire software development lifecycle, from code review through the release pipeline. The gap between &#8220;individual developer productivity&#8221; and &#8220;organizational software delivery&#8221; is precisely where Central aims to land - with policy enforcement, identity management, semantic context across repositories, and intelligent routing to the right models for the right tasks.</p><p>EAP launches Q2 2026 with design partners. Whether this becomes the &#8220;Kubernetes for AI agents&#8221; or just another enterprise dashboard remains to be seen - but the ambition is unmistakable. <strong><a href="https://www.linkedin.com/article/edit/7442327576586633216/#">JetBrains</a></strong> isn&#8217;t just making tools anymore. They&#8217;re building the operating system for how software gets produced in the agentic era.</p><div><hr></div><p><strong><a href="https://www.linkedin.com/article/edit/7442327576586633216/#">Jonathan Vogel</a></strong> post <em><strong><a href="https://jvogel.me/posts/2026/java-is-fast-your-code-might-not-be/">&#8220;Java Is Fast. Your Code Might Not Be&#8221;</a></strong></em> - based on his DevNexus talk - sparked one of those community discussions that ends up being as valuable as the original article. The premise is absolutely right: application-level inefficiencies can bottleneck even the fastest runtime, and Vogel&#8217;s demo numbers are genuinely impressive (from 1,198ms down to 239ms, heap from 1GB to 139MB, same app, same JDK). But the <strong><a href="https://news.ycombinator.com/item?id=47454384">Hacker News thread</a></strong> turned into a fascinating conversation about which of the cited anti-patterns still actually matter in 2026 - and it (once again) inadvertently exposed how much the JVM has changed under the hood while our collective intuition hasn&#8217;t always kept up. The StringBuilder pattern, for instance, is one many of us learned early in our careers, and it made perfect sense at the time. But since JEP 280 in Java 9, the compiler leverages invokedynamic and StringConcatFactory to optimize concatenation strategies dynamically - which means the runtime has been quietly handling this for us for years now.</p><p>The ensuing discussion turned into a genuinely useful conversation about where performance gains actually live in modern Java. The real culprits today - excessive object allocation, deep abstraction layers in popular frameworks, using Streams on hot paths where a simple loop would suffice, the lack of &#8220;mechanical sympathy&#8221; regarding CPU caches - got a thorough airing.</p><p>The consensus landed in a good place: the &#8220;Java is slow&#8221; myth is dead, but it&#8217;s been replaced by a subtler truth that profiling is a mandatory discipline, not a nice-to-have. Tools like JFR and async-profiler are where the signal is, and the JVM has gotten so good at optimizing the basics that our energy is better spent elsewhere. Honestly, the whole episode was a healthy reminder for all of us - myself included - that it&#8217;s worth periodically revisiting our performance assumptions against the current state of the runtime. The JVM of 2026 is a very different beast than the one we formed our mental models on.</p><p>Thanks Jonathan, can&#8217;t wait for the followup articles!</p><div><hr></div><p>On a related note, Quarkus is <strong><a href="https://quarkus.io/blog/new-benchmarks/">formalizing a benchmarking methodology</a></strong> that moves beyond vanity metrics. Instead of raw process startup time, they&#8217;re measuring <strong>&#8220;Time to First Request&#8221;</strong> and <strong>Resident Set Size (RSS)</strong> - the metrics that actually matter for Kubernetes deployment density. In &#8220;Peanut&#8221; configurations (0.5 vCPU, 256MB RAM), Quarkus demonstrates sub-100ms response times and ~20MB RSS footprints in native mode. The testing environment uses <strong><a href="https://hyperfoil.io/">Hyperfoil</a></strong> for load generation with strict hardware isolation via taskset and cgroups for deterministic results.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ex7h!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae62e95e-0117-42c2-a11d-e83c608173d2_1230x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ex7h!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae62e95e-0117-42c2-a11d-e83c608173d2_1230x1000.png 424w, https://substackcdn.com/image/fetch/$s_!Ex7h!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae62e95e-0117-42c2-a11d-e83c608173d2_1230x1000.png 848w, https://substackcdn.com/image/fetch/$s_!Ex7h!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae62e95e-0117-42c2-a11d-e83c608173d2_1230x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!Ex7h!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae62e95e-0117-42c2-a11d-e83c608173d2_1230x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ex7h!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae62e95e-0117-42c2-a11d-e83c608173d2_1230x1000.png" width="1230" height="1000" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ae62e95e-0117-42c2-a11d-e83c608173d2_1230x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1000,&quot;width&quot;:1230,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Ex7h!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae62e95e-0117-42c2-a11d-e83c608173d2_1230x1000.png 424w, https://substackcdn.com/image/fetch/$s_!Ex7h!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae62e95e-0117-42c2-a11d-e83c608173d2_1230x1000.png 848w, https://substackcdn.com/image/fetch/$s_!Ex7h!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae62e95e-0117-42c2-a11d-e83c608173d2_1230x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!Ex7h!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae62e95e-0117-42c2-a11d-e83c608173d2_1230x1000.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Even better: the new quarkus-benchmarks repository now provides transparent, reproducible comparisons against <strong>.NET minimal APIs and Go</strong> - not just internal JVM-versus-JVM battles. Java proving parity on startup and memory with .NET and Go in container-constrained environments is the kind of data we&#8217;ve been waiting for.</p><div><hr></div><div id="youtube2-77vIwDVcfDw" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;77vIwDVcfDw&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/77vIwDVcfDw?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p><strong><a href="https://www.linkedin.com/article/edit/7442327576586633216/#">Josh Long</a></strong> hosted discussion with <strong><a href="https://www.linkedin.com/article/edit/7442327576586633216/#">Cay Horstmann</a></strong> - the author of the definitive <em><strong><a href="https://www.oreilly.com/library/view/core-java-volume/9780137673810/">Core Java series</a></strong></em> - durign the Java One. For anyone who learned Java from Horstmann&#8217;s textbooks (and that&#8217;s... most of us - not many technical books has <strong><a href="https://www.oreilly.com/library/view/core-java-volume/9780137673810/">12 Editions(!)</a></strong>), it could be a really interesting listen.</p><div><hr></div><p><strong><a href="https://www.pi4j.com/">Pi4J</a></strong>, the Java IO library for Raspberry Pi, officially <strong><a href="https://www.pi4j.com/blog/2026/20260227-pi4j-commonhaus/">joined the Commonhaus Foundation</a></strong>. <strong><a href="https://www.linkedin.com/article/edit/7442327576586633216/#">Frank Delporte</a></strong> (Java Champion, technical writer at Azul) described the move as ensuring the project survives beyond its current team. Pi4J follows <strong><a href="https://micronaut.io/2026/01/12/micronaut-announces-plans-to-join-the-commonhaus-foundation/">Micronaut&#8217;s January announcement</a></strong> of its own application to Commonhaus. The consolidation of JVM open source under a neutral, sustainable foundation continues - and that&#8217;s unambiguously good news for everyone who depends on these libraries. <strong><a href="https://www.pi4j.com/about/info-v4/">Pi4J V4.0</a></strong> also shipped on February 20th.</p><div><hr></div><p><strong><a href="https://github.com/openliberty/open-liberty/issues/34061">The beta of</a></strong> <strong><a href="https://github.com/openliberty/open-liberty/issues/34061">Open Liberty 26.0.0.3</a></strong> <strong><a href="https://github.com/openliberty/open-liberty/issues/34061">ships with updates to</a></strong> <strong><a href="https://github.com/openliberty/open-liberty/issues/34061">Model Context Protocol</a></strong> <strong><a href="https://github.com/openliberty/open-liberty/issues/34061">integration for Jakarta EE applications</a></strong>. New ContentEncoder and ToolResponseEncoder interfaces for finer control over encoded responses, plus session-based request IDs via a RequestID record. This makes Open Liberty one of the first enterprise Java application servers with first-party MCP support. Combined with the <strong>Jakarta Agentic AI</strong> initiative under the Eclipse Foundation, enterprise Java is taking the agent story seriously - and not just through Spring AI. The specification-driven path is advancing in parallel.</p><p>Did I mentioned somebody should write an article about it?</p><div><hr></div><p>A <strong><a href="https://www.reddit.com/r/Kotlin/">developer retrospective on building a Kotlin CLI tool</a></strong> with GraalVM Native Image versus standard OpenJDK 21 highlighted sharp trade-offs. Using a KMP-compatible stack (Clikt, Ktor, Koin), the project achieved 10ms startup for the native binary versus 800ms on the JVM - an 80x delta on Apple Silicon M3.</p><p>The reflection metadata configuration remains the primary friction point. The community consensus: run the GraalVM tracing agent against a JUnit suite to exercise reflection paths and auto-generate reachability metadata. But critics raised a pragmatic point - for tools dependent on high-latency LLM APIs, JVM startup overhead is often negligible compared to network I/O. And since the chosen libraries are fully KMP-compatible, <strong>Kotlin/Native</strong> may now be a more efficient path for CLI tools, bypassing GraalVM&#8217;s configuration hurdles while maintaining similar performance profiles. Food for thought.</p><div><hr></div><p><strong><a href="https://blog.jetbrains.com/kotlin/2026/03/gsoc-2026-contribute-to-kotlin/">JetBrains announced Kotlin&#8217;s participation in GSoC 2026</a></strong>, with projects centered on the K2 compiler architecture, Kotlin Multiplatform tooling, and Kotlin/Wasm backend optimizations. The emphasis on K2 Intermediate Representation for advanced compiler plugins and KSP API refinement signals continued investment in post-KAPT build performance. Projects are structured in 175-hour and 350-hour tiers &#8212; a mix of library parity work within kotlinx and deep compiler engineering.</p><div><hr></div><p>Two new projects push the JVM toward high-performance polyglot execution. <strong><a href="https://github.com/nicee0/swc4j">swc4j</a></strong> compiles TypeScript directly to JVM bytecode using ASM 9.7, leveraging the Rust-based SWC parser via JNI. It maps TypeScript primitives directly to Java types (number &#8594; double), bypassing the GraalJS Polyglot API entirely - designed for environments where JIT-warmup delays and engine memory footprints are unacceptable.</p><p>Meanwhile, <strong><a href="https://github.com/nicee0/webassembly4j">WebAssembly4J</a></strong> provides a unified API across Wasm runtimes (Wasmtime, WAMR, Chicory) with dual integration paths: JNI for Java 8/11 compatibility and <strong>Project Panama</strong> (FFM API) for Java 22+. For engineers who&#8217;ve been watching the Wasm-on-JVM space: the &#8220;black box&#8221; script engine era is giving way to more transparent, low-latency execution models where TypeScript and Wasm become first-class JVM citizens.</p><div><hr></div><p>Finally, informational <strong><a href="https://openjdk.org/jeps/8283227">JEP draft: JDK Source Structure</a></strong> formalizes the internal architecture of the OpenJDK source repository. While it introduces no new features, it codifies the src/$MODULE hierarchy - share for platform-independent logic, strict OS/CPU-specific isolation - as the &#8220;single source of truth&#8221; for contributors. If you&#8217;ve ever wondered where to look in the jdk/jdk Git repo, this is now your definitive map.</p><p>When it will be moved from the draft, you can be sure I will get back to it.</p><div><hr></div><h2><strong>2. Release Radar</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AAW5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd19856f1-65b0-40d8-92bb-143e1def1bc4_1180x776.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AAW5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd19856f1-65b0-40d8-92bb-143e1def1bc4_1180x776.png 424w, https://substackcdn.com/image/fetch/$s_!AAW5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd19856f1-65b0-40d8-92bb-143e1def1bc4_1180x776.png 848w, https://substackcdn.com/image/fetch/$s_!AAW5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd19856f1-65b0-40d8-92bb-143e1def1bc4_1180x776.png 1272w, https://substackcdn.com/image/fetch/$s_!AAW5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd19856f1-65b0-40d8-92bb-143e1def1bc4_1180x776.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AAW5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd19856f1-65b0-40d8-92bb-143e1def1bc4_1180x776.png" width="1180" height="776" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d19856f1-65b0-40d8-92bb-143e1def1bc4_1180x776.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:776,&quot;width&quot;:1180,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!AAW5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd19856f1-65b0-40d8-92bb-143e1def1bc4_1180x776.png 424w, https://substackcdn.com/image/fetch/$s_!AAW5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd19856f1-65b0-40d8-92bb-143e1def1bc4_1180x776.png 848w, https://substackcdn.com/image/fetch/$s_!AAW5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd19856f1-65b0-40d8-92bb-143e1def1bc4_1180x776.png 1272w, https://substackcdn.com/image/fetch/$s_!AAW5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd19856f1-65b0-40d8-92bb-143e1def1bc4_1180x776.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3><strong>Kotlin 2.3.20</strong></h3><p>Kotlin keeps polishing. <strong><a href="https://kotlinlang.org/docs/whatsnew2320.html">Kotlin 2.3.20</a></strong> marks a significant stabilization of the K2 compiler ecosystem with some language features that actually matter in daily work. The headline: <strong>name-based destructuring</strong> for data classes - extracting properties via explicit identifiers rather than positional indices. If you&#8217;ve ever refactored a data class and introduced a subtle bug because the second and third properties were both String - this is for you. Consider:</p><pre><code><code>data class User(val name: String, val email: String, val role: String)

// Before 2.3.20 &#8212; positional. Swap email and role in the data class
// and this silently breaks:
val (name, email, role) = user

// With name-based destructuring &#8212; resilient to reordering:
val (name = name, role = role, email = email) = user</code></code></pre><p>Also new: <strong>guarded </strong>when expressions - essentially if-predicates inside pattern matching branches, which eliminates the awkward nested-if-inside-when pattern that made complex matching feel clunky:</p><pre><code><code>when (val result = fetchData()) {
    is Success if result.data.isNotEmpty() -&gt; process(result.data)
    is Success -&gt; handleEmpty()
    is Error if result.isRetryable() -&gt; retry()
    is Error -&gt; fail(result.cause)
}</code></code></pre><p>Previously you&#8217;d either nest an if inside the is Success branch or split it into separate when blocks - neither of which read well. This syntax makes the intent immediately clear: the guard is part of the pattern, not an afterthought.</p><p>Beyond language features: experimental non-local break and continue in inline lambdas (a long-standing community request), and - crucially - <strong>JFR events for compiler phases</strong>, providing much-needed observability into build performance. K2-native incremental compilation is now the default for multi-module projects. The PSI preparation for the transition from context receivers to <strong>context parameters</strong> is underway. With full support for JDK 23 and Gradle 8.10, the ecosystem remains current.</p><p>The most impactful change for K2 adopters? The synchronization of the IDE analysis engine with the compiler backend should eliminate those &#8220;red code&#8221; inconsistencies that have plagued early adoption. If you&#8217;ve been holding off on K2 - this release is your signal to try again.</p><p><strong><a href="https://kotlinlang.org/docs/whatsnew2320.html">Release Notes</a></strong></p><div><hr></div><p>Staying in the Kotlin world: <strong><a href="https://blog.jetbrains.com/kotlin/">JetBrains announced direct support for Swift Package Manager dependencies in Kotlin Multiplatform</a></strong>. This removes one of the final significant hurdles to KMP adoption in iOS-heavy environments - CocoaPods integration has been a persistent source of friction, and the ability to consume Swift-only libraries directly through the KMP toolchain is a genuine quality-of-life improvement. The community reaction has been overwhelmingly positive. The beginning of the end for legacy CocoaPods workarounds? We can hope.</p><div><hr></div><h3><strong>IntelliJ IDEA 2026.1</strong></h3><p>I hope you are not tired with JetBrains narrative for this month - <strong><a href="https://blog.jetbrains.com/idea/2026/03/intellij-idea-2026-1/">IntelliJ IDEA 2026.1 shipped yesterday</a></strong>, as announced by <strong><a href="https://www.linkedin.com/article/edit/7442327576586633216/#">&#128083; Anton Arhipov</a></strong> together with <strong><a href="https://www.linkedin.com/article/edit/7442327576586633216/#">&#128105;&#127995;&#128187; Marit van Dijk</a></strong> , <strong><a href="https://www.linkedin.com/article/edit/7442327576586633216/#">Marco Behler</a></strong> , and <strong><a href="https://www.linkedin.com/article/edit/7442327576586633216/#">Siva Prasad Reddy K</a></strong> in a <strong><a href="https://lnkd.in/diryidw4">1-hour video walkthrough</a></strong> full of demos.</p><div id="youtube2-FVsMsCFtlOs" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;FVsMsCFtlOs&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/FVsMsCFtlOs?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>This release is where all the strategic moves we discussed above materialize into something you can actually download. The headline is the <strong>Agent Client Protocol (ACP) Registry</strong> - browse and install AI agents in one click.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yY-H!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92d834f5-2aa1-42cc-af30-7405f534f52e_744x306.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yY-H!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92d834f5-2aa1-42cc-af30-7405f534f52e_744x306.png 424w, https://substackcdn.com/image/fetch/$s_!yY-H!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92d834f5-2aa1-42cc-af30-7405f534f52e_744x306.png 848w, https://substackcdn.com/image/fetch/$s_!yY-H!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92d834f5-2aa1-42cc-af30-7405f534f52e_744x306.png 1272w, https://substackcdn.com/image/fetch/$s_!yY-H!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92d834f5-2aa1-42cc-af30-7405f534f52e_744x306.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yY-H!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92d834f5-2aa1-42cc-af30-7405f534f52e_744x306.png" width="744" height="306" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/92d834f5-2aa1-42cc-af30-7405f534f52e_744x306.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:306,&quot;width&quot;:744,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!yY-H!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92d834f5-2aa1-42cc-af30-7405f534f52e_744x306.png 424w, https://substackcdn.com/image/fetch/$s_!yY-H!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92d834f5-2aa1-42cc-af30-7405f534f52e_744x306.png 848w, https://substackcdn.com/image/fetch/$s_!yY-H!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92d834f5-2aa1-42cc-af30-7405f534f52e_744x306.png 1272w, https://substackcdn.com/image/fetch/$s_!yY-H!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92d834f5-2aa1-42cc-af30-7405f534f52e_744x306.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Not just Junie and Claude Agent anymore: Codex, Cursor, GitHub Copilot, and any ACP-compatible agent now work inside IntelliJ natively. The Git worktrees integration is designed explicitly for agent workflows: work in one branch yourself, hand another off to an agent, keep moving. Agents can even query and modify your database sources directly. This is JetBrains Central&#8217;s vision, but at the IDE level - the IDE as an open platform for agentic development, not a walled garden.</p><p>For the JVM crowd specifically: first-class <strong>Java 26</strong> and <strong>Kotlin 2.3.20</strong> support from day one (as is tradition). <strong>Spring runtime insight</strong> lets you inspect injected beans, endpoint security, and property values without pausing execution - a feature that will save Spring Boot developers an embarrassing amount of time they currently spend on debug logging. <strong>Kotlin-aware JPA</strong> detects and fixes pitfalls like using data class and val fields on Jakarta Persistence entities - problems that silently corrupt your persistence layer because JPA was designed for Java&#8217;s mutability model, not Kotlin&#8217;s.</p><p>The polyglot story continues: <strong>C/C++ support via the CLion plugin</strong> (for teams mixing JVM with native code), <strong>JavaScript and TypeScript now free</strong> without an Ultimate subscription (what we already mentioned earlier), and <strong>native Dev Container workflows</strong> that let you open containerized projects as if they were local. Dependency sources are now auto-downloaded in the background - you always have full context for debugging and navigation.</p><p>This is, honestly, one of the most cohesive IntelliJ releases in a while. Every feature connects back to the same thesis: the IDE is becoming the integration point for a multi-agent, multi-language development system. Whether you buy the full JetBrains Central vision or not, the individual pieces are already making daily development measurably better.</p><p><strong><a href="https://www.jetbrains.com/idea/whatsnew/2026-1/">What&#8217;s New page</a></strong> | <strong><a href="https://blog.jetbrains.com/idea/2026/03/whats-fixed-intellij-idea-2026-1/">What&#8217;s Fixed</a></strong></p><h3><strong>JHipster 9.0.0</strong></h3><p><strong><a href="https://www.jhipster.tech/">JHipster 9.0.0</a></strong> reached GA after three beta releases. The headline: alignment with <strong>Spring Boot 4.0</strong>, cascading into Jakarta EE 10 and the modern JVM stack. JDK minimum bumped from 17 to 21, Node.js from 20 to 22. Frontend refresh: React 19 with react-bootstrap, Angular 21 with zoneless mode and signals, Vue with Bootstrap 5.</p><p><strong>But for me, GraalVM native image support</strong> is even more interesting addition for cloud-native teams. Additionally, the entire generator codebase has been rewritten in TypeScript. So for JHipster 8.x teams, this isn&#8217;t a gentle bump - the new version is huge.</p><p><strong><a href="https://github.com/jhipster/generator-jhipster/releases/tag/v9.0.0">Release Notes</a></strong></p><h3><strong>LibericaJDK 26</strong></h3><p><strong><a href="https://bell-sw.com/">BellSoft</a></strong> shipped <strong><a href="https://bell-sw.com/blog/liberica-jdk-26-is-released/">Liberica JDK 26</a></strong>. Of the total 2,825 fixes (2,665 OpenJDK + 160 JavaFX), BellSoft contributed 9. Business as usual from one of the more reliable OpenJDK distributors.</p><h3><strong>JobRunr 8.5.0</strong></h3><p><strong><a href="https://www.jobrunr.io/">JobRunr 8.5.0</a></strong> improves startup performance by replacing individual SQL migration queries with a single batch query - a change that sounds trivial but makes a real difference in environments with dozens of migrations stacking up on cold start. Also fixes an AccessControlException when calling ForkJoinPool.commonPool() with the deprecated SecurityManager - a classic &#8220;Java archaeology&#8221; bug that&#8217;s becoming increasingly common as the ecosystem moves away from Security Manager while legacy configurations linger.</p><p>Worth noting in the broader context: JobRunr is quietly becoming more than just a background job library - with ClawRunr built on top (see above), it&#8217;s positioning itself as foundational infrastructure for the JVM agentic stack.</p><p>I also working on some JobRunr based solution - I will share some details soon &#129310;</p><h3><strong>Apache Solr 10</strong></h3><p><strong><a href="https://solr.apache.org/">Apache Solr 10</a></strong> is the first major release since the 9.x series - and this time the changes run deep. Under the hood sits Lucene 10.3, with the minimum raised to Java 21 (SolrJ still works on 17). The biggest story is, of course, vector search: Solr 10 introduces support for scalar and binary quantized dense vectors, significantly reducing memory usage and improving vector search performance. But the real bombshell is the cuVS-Lucene integration - a pluggable codec enabling GPU acceleration for vector operations using the CAGRA algorithm, designed specifically for massive GPU parallelism.</p><p>This is exactly the integration NVIDIA talked about at GTC (and JavaOne), citing a 6x end-to-end speedup for index building in Solr and 40x in Lucene itself - and the Java API for cuVS uses Project Panama (FFM API), which closes the loop with the rest of the JDK 21+ ecosystem.</p><div><hr></div><h2><strong>3. GitHub All-Stars</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wLIG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0240889-3ea1-4a0f-beca-1bb81f7955d1_1180x782.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wLIG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0240889-3ea1-4a0f-beca-1bb81f7955d1_1180x782.png 424w, https://substackcdn.com/image/fetch/$s_!wLIG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0240889-3ea1-4a0f-beca-1bb81f7955d1_1180x782.png 848w, https://substackcdn.com/image/fetch/$s_!wLIG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0240889-3ea1-4a0f-beca-1bb81f7955d1_1180x782.png 1272w, https://substackcdn.com/image/fetch/$s_!wLIG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0240889-3ea1-4a0f-beca-1bb81f7955d1_1180x782.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wLIG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0240889-3ea1-4a0f-beca-1bb81f7955d1_1180x782.png" width="1180" height="782" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b0240889-3ea1-4a0f-beca-1bb81f7955d1_1180x782.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:782,&quot;width&quot;:1180,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!wLIG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0240889-3ea1-4a0f-beca-1bb81f7955d1_1180x782.png 424w, https://substackcdn.com/image/fetch/$s_!wLIG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0240889-3ea1-4a0f-beca-1bb81f7955d1_1180x782.png 848w, https://substackcdn.com/image/fetch/$s_!wLIG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0240889-3ea1-4a0f-beca-1bb81f7955d1_1180x782.png 1272w, https://substackcdn.com/image/fetch/$s_!wLIG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0240889-3ea1-4a0f-beca-1bb81f7955d1_1180x782.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3><strong>Floci - Native AWS Emulation for Java Testing</strong></h3><p><strong><a href="https://github.com/hectorvent/floci">Floci</a></strong> is a lightweight, open-source alternative to LocalStack, specifically optimized for Java ecosystems. Unlike containerized emulators, Floci is natively compiled &#8212; drastically reducing memory overhead and eliminating JVM warmup times in ephemeral CI/CD environments. Currently supports S3, SQS, and DynamoDB, with seamless Spring Boot, Quarkus, and Micronaut integration. The community is particularly interested in potential Quarkus DevService integration.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8Ssx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6c8911f-6a57-4a01-bebb-fc282f4b5280_1013x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8Ssx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6c8911f-6a57-4a01-bebb-fc282f4b5280_1013x1000.png 424w, https://substackcdn.com/image/fetch/$s_!8Ssx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6c8911f-6a57-4a01-bebb-fc282f4b5280_1013x1000.png 848w, https://substackcdn.com/image/fetch/$s_!8Ssx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6c8911f-6a57-4a01-bebb-fc282f4b5280_1013x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!8Ssx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6c8911f-6a57-4a01-bebb-fc282f4b5280_1013x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8Ssx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6c8911f-6a57-4a01-bebb-fc282f4b5280_1013x1000.png" width="1013" height="1000" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a6c8911f-6a57-4a01-bebb-fc282f4b5280_1013x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1000,&quot;width&quot;:1013,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!8Ssx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6c8911f-6a57-4a01-bebb-fc282f4b5280_1013x1000.png 424w, https://substackcdn.com/image/fetch/$s_!8Ssx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6c8911f-6a57-4a01-bebb-fc282f4b5280_1013x1000.png 848w, https://substackcdn.com/image/fetch/$s_!8Ssx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6c8911f-6a57-4a01-bebb-fc282f4b5280_1013x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!8Ssx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6c8911f-6a57-4a01-bebb-fc282f4b5280_1013x1000.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>For JVM developers tired of LocalStack&#8217;s resource demands: &#8220;instant-on&#8221; readiness without the container overhead.</p><h3><strong>Savant - Explicit Target Control Over Plugin Magic</strong></h3><p><strong><a href="https://github.com/savant-build/savant-core">Savant</a></strong> is a new Java build system that takes a contrarian stance: no plugin-injected build targets. Plugins function as simple objects in a Groovy DSL - you call java.compile() directly instead of relying on hidden lifecycle side effects.</p><p>Despite the focus on transparency and JDK 17+ compatibility, the community response has been skeptical: documentation inconsistencies (C# examples in a Java build tool?), and the question of why not use Mill, Amper, or bld instead. The manual configuration burden may be prohibitively high.</p><p>Worth watching, but approach with caution.</p><h3><strong>KAP - Kotlin Applicative Parallelism</strong></h3><p><strong><a href="https://www.reddit.com/r/haskell/comments/1ryw8ri/i_built_a_small_library_for_declarative_parallel/">KAP</a></strong> applies <strong><a href="https://github.com/damian-rafael-lattenero/coroutines-applicatives">Haskell&#8217;s Applicative Functor pattern to Kotlin Coroutines</a></strong> - a library for declaratively expressing parallel-then-sequential orchestration. The code shape <em>is</em> the dependency graph: applicative phases run in parallel, monadic phases wait for context. Comes with timeoutRace, retry with Schedule, circuit breakers, and Arrow integration. 906 tests, 119 JMH benchmarks, Kotlin Multiplatform support.</p><p>You don&#8217;t need to know Haskell to use it - but if you do, you&#8217;ll feel right at home.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!c3by!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74d63d61-d293-4821-8330-8bd54169005a_1204x672.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!c3by!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74d63d61-d293-4821-8330-8bd54169005a_1204x672.png 424w, https://substackcdn.com/image/fetch/$s_!c3by!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74d63d61-d293-4821-8330-8bd54169005a_1204x672.png 848w, https://substackcdn.com/image/fetch/$s_!c3by!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74d63d61-d293-4821-8330-8bd54169005a_1204x672.png 1272w, https://substackcdn.com/image/fetch/$s_!c3by!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74d63d61-d293-4821-8330-8bd54169005a_1204x672.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!c3by!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74d63d61-d293-4821-8330-8bd54169005a_1204x672.png" width="1204" height="672" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/74d63d61-d293-4821-8330-8bd54169005a_1204x672.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:672,&quot;width&quot;:1204,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!c3by!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74d63d61-d293-4821-8330-8bd54169005a_1204x672.png 424w, https://substackcdn.com/image/fetch/$s_!c3by!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74d63d61-d293-4821-8330-8bd54169005a_1204x672.png 848w, https://substackcdn.com/image/fetch/$s_!c3by!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74d63d61-d293-4821-8330-8bd54169005a_1204x672.png 1272w, https://substackcdn.com/image/fetch/$s_!c3by!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74d63d61-d293-4821-8330-8bd54169005a_1204x672.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3><strong>Jar-Analyzer - Bytecode Analysis Engine</strong></h3><p><strong><a href="https://github.com/jar-analyzer/jar-analyzer">Jar-Analyzer</a></strong> is a bytecode analysis and visualization tool for Java archives. Useful for security auditing, dependency analysis, and understanding complex class hierarchies in third-party JARs. If you&#8217;ve ever wanted to look inside a JAR beyond what javap gives you -this is your tool.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EaOp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca33b045-499b-4906-baae-d8b334adb02c_1221x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EaOp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca33b045-499b-4906-baae-d8b334adb02c_1221x1000.png 424w, https://substackcdn.com/image/fetch/$s_!EaOp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca33b045-499b-4906-baae-d8b334adb02c_1221x1000.png 848w, https://substackcdn.com/image/fetch/$s_!EaOp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca33b045-499b-4906-baae-d8b334adb02c_1221x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!EaOp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca33b045-499b-4906-baae-d8b334adb02c_1221x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EaOp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca33b045-499b-4906-baae-d8b334adb02c_1221x1000.png" width="1221" height="1000" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ca33b045-499b-4906-baae-d8b334adb02c_1221x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1000,&quot;width&quot;:1221,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!EaOp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca33b045-499b-4906-baae-d8b334adb02c_1221x1000.png 424w, https://substackcdn.com/image/fetch/$s_!EaOp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca33b045-499b-4906-baae-d8b334adb02c_1221x1000.png 848w, https://substackcdn.com/image/fetch/$s_!EaOp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca33b045-499b-4906-baae-d8b334adb02c_1221x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!EaOp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca33b045-499b-4906-baae-d8b334adb02c_1221x1000.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>PS: This is Asian software - do not expect letters everywehere. Maybe some LLM would be able to do the port/translation.</p><h3><strong>JavaDesugarer9To8 - Backporting Modern Java</strong></h3><p><strong><a href="https://github.com/DanexCodr/Java8T9Desugarer">JavaDesugarer9To8</a></strong> does exactly what the name says: transforms Java 9+ bytecode back to Java 8 compatible bytecode. Niche, but useful for teams stuck on Java 8 runtimes that want to use libraries compiled against newer JDKs. The Android ecosystem has been doing this for years - nice to see it available for server-side use cases too.</p><p>However, I recommend to use that with cautious &#128522;</p><div><hr></div><p><strong>PS:</strong> The full <strong><a href="https://kotlinconf.org/">KotlinConf&#8217;26 schedule</a></strong> is live - time to start planning! @Jake Wharton on &#8220;Talking to Terminals,&#8221; Josh Long on &#8220;Bootiful Kotlin,&#8221; and a talk on enterprise-ready AI agents with Koog from JetBrains. I&#8217;ll be there as a media partner - come say hi if you&#8217;re attending!</p><p><strong>PS2: </strong>Yet another picture from &#8220;JVM Weekly in strange places&#8221; family: Polish classic mountain cottage</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0Onf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F017a78bd-c074-47d2-a872-4df0e96ce740_744x395.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0Onf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F017a78bd-c074-47d2-a872-4df0e96ce740_744x395.png 424w, https://substackcdn.com/image/fetch/$s_!0Onf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F017a78bd-c074-47d2-a872-4df0e96ce740_744x395.png 848w, https://substackcdn.com/image/fetch/$s_!0Onf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F017a78bd-c074-47d2-a872-4df0e96ce740_744x395.png 1272w, https://substackcdn.com/image/fetch/$s_!0Onf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F017a78bd-c074-47d2-a872-4df0e96ce740_744x395.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0Onf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F017a78bd-c074-47d2-a872-4df0e96ce740_744x395.png" width="744" height="395" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/017a78bd-c074-47d2-a872-4df0e96ce740_744x395.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:395,&quot;width&quot;:744,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!0Onf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F017a78bd-c074-47d2-a872-4df0e96ce740_744x395.png 424w, https://substackcdn.com/image/fetch/$s_!0Onf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F017a78bd-c074-47d2-a872-4df0e96ce740_744x395.png 848w, https://substackcdn.com/image/fetch/$s_!0Onf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F017a78bd-c074-47d2-a872-4df0e96ce740_744x395.png 1272w, https://substackcdn.com/image/fetch/$s_!0Onf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F017a78bd-c074-47d2-a872-4df0e96ce740_744x395.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[JDK 26 and JavaOne: When the Conference overshadows the Release - JVM Weekly vol. 167]]></title><description><![CDATA[While everyone has new JDK 26, this is the edition where I deeply envy everybody who's at JavaOne right now &#128513;]]></description><link>https://www.jvm-weekly.com/p/jdk-26-and-javaone-when-the-conference</link><guid isPermaLink="false">https://www.jvm-weekly.com/p/jdk-26-and-javaone-when-the-conference</guid><dc:creator><![CDATA[Artur Skowronski]]></dc:creator><pubDate>Thu, 19 Mar 2026 14:02:50 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!6tcK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86f5f6a2-edc3-40d5-9e34-3d4ac6b073ec_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6tcK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86f5f6a2-edc3-40d5-9e34-3d4ac6b073ec_1456x1048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6tcK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86f5f6a2-edc3-40d5-9e34-3d4ac6b073ec_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!6tcK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86f5f6a2-edc3-40d5-9e34-3d4ac6b073ec_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!6tcK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86f5f6a2-edc3-40d5-9e34-3d4ac6b073ec_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!6tcK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86f5f6a2-edc3-40d5-9e34-3d4ac6b073ec_1456x1048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6tcK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86f5f6a2-edc3-40d5-9e34-3d4ac6b073ec_1456x1048.png" width="1456" height="1048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/86f5f6a2-edc3-40d5-9e34-3d4ac6b073ec_1456x1048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1048,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2017658,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/191463931?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86f5f6a2-edc3-40d5-9e34-3d4ac6b073ec_1456x1048.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!6tcK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86f5f6a2-edc3-40d5-9e34-3d4ac6b073ec_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!6tcK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86f5f6a2-edc3-40d5-9e34-3d4ac6b073ec_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!6tcK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86f5f6a2-edc3-40d5-9e34-3d4ac6b073ec_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!6tcK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86f5f6a2-edc3-40d5-9e34-3d4ac6b073ec_1456x1048.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Let&#8217;s be honest - if JDK 26 had dropped on a quiet Tuesday without JavaOne in the background, we&#8217;d mostly be talking about HTTP/3 and the fact that Applets are finally gone (RIP, nobody&#8217;s crying). It&#8217;s a solid but not exactly revolutionary release &#8212; ten JEPs, half of which are yet another round of previews. But JavaOne 2026 is a completely different story. Java Verified Portfolio, Project Detroit back from the dead, Helidon moving to OpenJDK, Koog for Java from JetBrains... suddenly it turns out this isn&#8217;t the week of JDK 26 - it&#8217;s the week the Java ecosystem officially went all-in on AI and agents. And that&#8217;s genuinely interesting.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>So today we&#8217;re doing a two-for-one - first we&#8217;ll walk through JDK 26 JEP by JEP and things other than just JEP&#8217;s (because there&#8217;s still plenty to discuss), and then we&#8217;ll get to what actually set the internet on fire this week. Let&#8217;s go.</p><h2><strong>1. JDK 26 Released!</strong></h2><p>Unlike JDK 25, which came with a massive 24 JEPs (including a significant LTS release milestone), JDK 26 is a much smaller release with only 10 JEPs. However, don&#8217;t let the smaller number fool you - this release brings some genuinely interesting changes, including the long-awaited HTTP/3 support and significant GC improvements.</p><p>Now, let&#8217;s go through the complete list of changes in the new edition.</p><h3><strong>Exegi monumentum - Stable Feature</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tQh4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F356d9ef4-f6b8-4339-a504-f8b8bce8a2db_1488x996.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tQh4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F356d9ef4-f6b8-4339-a504-f8b8bce8a2db_1488x996.png 424w, https://substackcdn.com/image/fetch/$s_!tQh4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F356d9ef4-f6b8-4339-a504-f8b8bce8a2db_1488x996.png 848w, https://substackcdn.com/image/fetch/$s_!tQh4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F356d9ef4-f6b8-4339-a504-f8b8bce8a2db_1488x996.png 1272w, https://substackcdn.com/image/fetch/$s_!tQh4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F356d9ef4-f6b8-4339-a504-f8b8bce8a2db_1488x996.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tQh4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F356d9ef4-f6b8-4339-a504-f8b8bce8a2db_1488x996.png" width="1456" height="975" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/356d9ef4-f6b8-4339-a504-f8b8bce8a2db_1488x996.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:975,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!tQh4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F356d9ef4-f6b8-4339-a504-f8b8bce8a2db_1488x996.png 424w, https://substackcdn.com/image/fetch/$s_!tQh4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F356d9ef4-f6b8-4339-a504-f8b8bce8a2db_1488x996.png 848w, https://substackcdn.com/image/fetch/$s_!tQh4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F356d9ef4-f6b8-4339-a504-f8b8bce8a2db_1488x996.png 1272w, https://substackcdn.com/image/fetch/$s_!tQh4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F356d9ef4-f6b8-4339-a504-f8b8bce8a2db_1488x996.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><h3><strong>JEP 517: HTTP/3 for the HTTP Client API</strong></h3><p><strong><a href="https://openjdk.org/jeps/517">JEP 517</a></strong> finally brings <strong>HTTP/3 support</strong> to the Java Platform (at least natively). The HTTP Client API (introduced in JDK 11) is updated to support the HTTP/3 protocol, which uses QUIC transport instead of TCP.</p><p><strong>Why HTTP/3 matters:</strong> HTTP/3 offers potentially faster handshakes, avoidance of head-of-line blocking, and more reliable transport especially in environments with high packet loss. It&#8217;s already supported by most browsers and deployed on about a third of all websites.</p><p><strong>Usage:</strong> HTTP/3 is <strong>opt-in</strong>. You can enable it per-client or per-request:</p><pre><code><code>var client = HttpClient.newBuilder()
                       .version(HttpClient.Version.HTTP_3)
                       .build();</code></code></pre><p>Or you can enable HTTP/3 for a specific request:</p><pre><code><code>var request = HttpRequest.newBuilder(URI.create("https://example.com/"))
                         .version(HttpClient.Version.HTTP_3)
                         .GET().build();</code></code></pre><p>The implementation transparently downgrades to HTTP/2 or HTTP/1.1 if the target server doesn&#8217;t support HTTP/3. Various discovery modes are available to control this behavior via the H3_DISCOVERY request option.</p><h3><strong>Goodbye, Old Friends - Removals and Preparations</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lgRw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0172cebe-48b4-466a-9637-f4d5e3a914f8_1488x985.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lgRw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0172cebe-48b4-466a-9637-f4d5e3a914f8_1488x985.png 424w, https://substackcdn.com/image/fetch/$s_!lgRw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0172cebe-48b4-466a-9637-f4d5e3a914f8_1488x985.png 848w, https://substackcdn.com/image/fetch/$s_!lgRw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0172cebe-48b4-466a-9637-f4d5e3a914f8_1488x985.png 1272w, https://substackcdn.com/image/fetch/$s_!lgRw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0172cebe-48b4-466a-9637-f4d5e3a914f8_1488x985.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lgRw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0172cebe-48b4-466a-9637-f4d5e3a914f8_1488x985.png" width="1456" height="964" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0172cebe-48b4-466a-9637-f4d5e3a914f8_1488x985.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:964,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!lgRw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0172cebe-48b4-466a-9637-f4d5e3a914f8_1488x985.png 424w, https://substackcdn.com/image/fetch/$s_!lgRw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0172cebe-48b4-466a-9637-f4d5e3a914f8_1488x985.png 848w, https://substackcdn.com/image/fetch/$s_!lgRw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0172cebe-48b4-466a-9637-f4d5e3a914f8_1488x985.png 1272w, https://substackcdn.com/image/fetch/$s_!lgRw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0172cebe-48b4-466a-9637-f4d5e3a914f8_1488x985.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><h3><strong>JEP 504: Remove the Applet API</strong></h3><p>Probably the second biggest announcement this week. <strong><a href="https://openjdk.org/jeps/504">JEP 504</a></strong> finally removes the Applet API from the Java Platform. This has been a long time coming &#8211; the API was deprecated in JDK 9 (2017), deprecated for removal in JDK 17 (2021), and now, with the Security Manager permanently disabled in JDK 24, there&#8217;s simply no reason to keep this obsolete code around.</p><p><strong>What gets removed:</strong> The entire java.applet package (Applet, AppletContext, AppletStub, AudioClip), java.beans.AppletInitializer, javax.swing.JApplet, and any API elements that reference these classes.</p><p>Web browsers haven&#8217;t supported applets for years, and there hasn&#8217;t been a way to run applets using the JDK since the appletviewer tool was removed in JDK 11. It&#8217;s time to say goodbye to this relic of Java&#8217;s early web days.</p><p>Does anybody miss the old guy?</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kuga!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e94f761-71ff-442f-bb6e-88374cf614a9_1357x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kuga!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e94f761-71ff-442f-bb6e-88374cf614a9_1357x1000.png 424w, https://substackcdn.com/image/fetch/$s_!kuga!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e94f761-71ff-442f-bb6e-88374cf614a9_1357x1000.png 848w, https://substackcdn.com/image/fetch/$s_!kuga!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e94f761-71ff-442f-bb6e-88374cf614a9_1357x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!kuga!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e94f761-71ff-442f-bb6e-88374cf614a9_1357x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kuga!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e94f761-71ff-442f-bb6e-88374cf614a9_1357x1000.png" width="1357" height="1000" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4e94f761-71ff-442f-bb6e-88374cf614a9_1357x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1000,&quot;width&quot;:1357,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!kuga!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e94f761-71ff-442f-bb6e-88374cf614a9_1357x1000.png 424w, https://substackcdn.com/image/fetch/$s_!kuga!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e94f761-71ff-442f-bb6e-88374cf614a9_1357x1000.png 848w, https://substackcdn.com/image/fetch/$s_!kuga!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e94f761-71ff-442f-bb6e-88374cf614a9_1357x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!kuga!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e94f761-71ff-442f-bb6e-88374cf614a9_1357x1000.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><h3><strong>JEP 500: Prepare to Make Final Mean Final</strong></h3><p><strong><a href="https://openjdk.org/jeps/500">JEP 500</a></strong> begins the process of enforcing the integrity of final fields. Currently, the deep reflection API (setAccessible and set methods of java.lang.reflect.Field) allows final fields to be mutated at will &#8211; making the final keyword essentially meaningless from a runtime perspective.</p><p><strong>The problem:</strong> Final fields represent immutable state, crucial for reasoning about correctness and enabling JVM optimizations like constant folding. But the ability to mutate them via reflection undermines all of this.</p><p><strong>The solution:</strong> In JDK 26, mutating final fields via deep reflection will issue <strong>warnings by default</strong>. A future release will throw exceptions instead. Developers can opt in to final field mutation using<em> --enable-final-field-mutation=MODULE_NAME</em> when necessary.</p><p>Serialization libraries should migrate to using sun.reflect.ReflectionFactory, which provides a supported way to deserialize objects with final fields without requiring the --enable-final-field-mutation flag.</p><div><hr></div><h3><strong>Performance - VM Internals</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!D8ze!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86e34c0f-0233-4a15-925f-8e64818374e9_1488x989.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!D8ze!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86e34c0f-0233-4a15-925f-8e64818374e9_1488x989.png 424w, https://substackcdn.com/image/fetch/$s_!D8ze!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86e34c0f-0233-4a15-925f-8e64818374e9_1488x989.png 848w, https://substackcdn.com/image/fetch/$s_!D8ze!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86e34c0f-0233-4a15-925f-8e64818374e9_1488x989.png 1272w, https://substackcdn.com/image/fetch/$s_!D8ze!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86e34c0f-0233-4a15-925f-8e64818374e9_1488x989.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!D8ze!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86e34c0f-0233-4a15-925f-8e64818374e9_1488x989.png" width="1456" height="968" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/86e34c0f-0233-4a15-925f-8e64818374e9_1488x989.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:968,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!D8ze!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86e34c0f-0233-4a15-925f-8e64818374e9_1488x989.png 424w, https://substackcdn.com/image/fetch/$s_!D8ze!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86e34c0f-0233-4a15-925f-8e64818374e9_1488x989.png 848w, https://substackcdn.com/image/fetch/$s_!D8ze!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86e34c0f-0233-4a15-925f-8e64818374e9_1488x989.png 1272w, https://substackcdn.com/image/fetch/$s_!D8ze!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86e34c0f-0233-4a15-925f-8e64818374e9_1488x989.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><h3><strong>JEP 516: Ahead-of-Time Object Caching with Any GC</strong></h3><p><strong><a href="https://openjdk.org/jeps/516">JEP 516</a></strong> enhances the AOT cache (introduced in <strong><a href="https://openjdk.org/jeps/483">JEP 483</a></strong>) so that it can be used with <strong>any garbage collector, including ZGC</strong>. This is a significant improvement for Project Leyden&#8217;s startup optimization efforts.</p><p><strong>The problem:</strong> Previously, cached Java objects were stored in a GC-specific format, making the AOT cache incompatible with ZGC. This forced users to choose between low-latency garbage collection OR fast startup - but not both.</p><p><strong>The solution:</strong> Objects can now be cached in a GC-agnostic format using logical indices instead of memory addresses. When the cache is loaded, a background thread materializes objects one by one, converting indices to actual addresses appropriate for the current GC.</p><p>The JDK now includes two baseline AOT caches &#8211; one GC-agnostic and one GC-specific &#8211; and automatically selects the appropriate one based on the environment.</p><div><hr></div><h3><strong>JEP 522: G1 GC: Improve Throughput by Reducing Synchronization</strong></h3><p>This time, a bit more theory needed.</p><p>G1 needs to know which parts of the Java heap were modified by the application so it can perform garbage collection safely. To do this, the heap is divided into small chunks called <em>cards</em>, and G1 maintains a <em>card table</em>&#8212;a simple structure that records which cards have been changed. Every time your code updates an object reference, the corresponding card is marked.</p><p>Before JEP 522, both application threads and garbage-collection threads updated the same card table. Because many threads were touching this shared structure, G1 had to use synchronization. Under heavy load, this locking became a bottleneck and reduced overall throughput.</p><p><strong><a href="https://openjdk.org/jeps/522">JEP 522</a></strong> changes this by introducing a second card table. Application threads now update one card table without any locking, using much simpler and faster write-barrier code. At the same time, GC threads work on the other card table. When G1 needs to hand work from the application to the GC, it simply swaps the two tables atomically.</p><p>This matters because updating object references is one of the most frequent operations in Java programs. Making this path cheaper improves performance across the board, especially for highly concurrent applications.</p><p>In practice, this results in a 5&#8211;15% throughput improvement for applications that heavily modify object references, and up to 5% improvement even for others. The write-barrier code was reduced from around 50 CPU instructions to about 12 on x64 systems. The extra memory cost is small - about 2 MB per 1 GB of heap - and is largely offset by memory optimizations introduced in recent JDK releases.</p><div><hr></div><h3><strong>Nihil Novi Sub Sole - Preview Features Continue</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DzHh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2ca708b-0ff2-40b0-9554-8261463e09ce_1488x986.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DzHh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2ca708b-0ff2-40b0-9554-8261463e09ce_1488x986.png 424w, https://substackcdn.com/image/fetch/$s_!DzHh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2ca708b-0ff2-40b0-9554-8261463e09ce_1488x986.png 848w, https://substackcdn.com/image/fetch/$s_!DzHh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2ca708b-0ff2-40b0-9554-8261463e09ce_1488x986.png 1272w, https://substackcdn.com/image/fetch/$s_!DzHh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2ca708b-0ff2-40b0-9554-8261463e09ce_1488x986.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DzHh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2ca708b-0ff2-40b0-9554-8261463e09ce_1488x986.png" width="1456" height="965" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b2ca708b-0ff2-40b0-9554-8261463e09ce_1488x986.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:965,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!DzHh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2ca708b-0ff2-40b0-9554-8261463e09ce_1488x986.png 424w, https://substackcdn.com/image/fetch/$s_!DzHh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2ca708b-0ff2-40b0-9554-8261463e09ce_1488x986.png 848w, https://substackcdn.com/image/fetch/$s_!DzHh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2ca708b-0ff2-40b0-9554-8261463e09ce_1488x986.png 1272w, https://substackcdn.com/image/fetch/$s_!DzHh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2ca708b-0ff2-40b0-9554-8261463e09ce_1488x986.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><h3><strong>JEP 526: Lazy Constants (Second Preview)</strong></h3><p>The goal of LazyConstant is to compute a value exactly once, in a thread-safe way, but only when it&#8217;s first accessed, not at class-initialization time. At the same time, it is designed so that once the value is initialized, the JVM can treat it like a constant and apply constant-folding and inlining optimizations, avoiding repeated reads or synchronization overhead.</p><p>In short: LazyConstant combines lazy initialization, safe concurrency, and JIT-level performance close to real constants. <strong><a href="https://openjdk.org/jeps/526">JEP 526</a></strong> re-previews the API for deferred immutability, now <strong>renamed from StableValue to LazyConstant</strong>. The API has been significantly simplified to focus on high-level use cases.</p><p><strong>Key changes from JDK 25:</strong></p><ul><li><p>Renamed from StableValue to LazyConstant</p></li><li><p>Removed low-level methods (orElseSet, setOrThrow, trySet)</p></li><li><p>Factory methods for lazy lists and maps moved to List.ofLazy() and Map.ofLazy()</p></li><li><p>null is no longer allowed as a computed value</p></li></ul><pre><code><code>private final LazyConstant&lt;Logger&gt; logger
    = LazyConstant.of(() -&gt; Logger.create(OrderController.class));
void submitOrder() {
    logger.get().info("order started");  // Initialized on first access
}</code></code></pre><div><hr></div><h3><strong>JEP 525: Structured Concurrency (Sixth Preview)</strong></h3><p>Structured Concurrency API treats groups of related tasks running in different threads as single units of work, streamlining error handling and cancellation. <strong><a href="https://openjdk.org/jeps/525">JEP 525</a></strong> continues the preview of the Structured Concurrency API with minor refinements.</p><p><strong>Changes in this new preview:</strong></p><ul><li><p>New Joiner.onTimeout() method for handling timeout expiration</p></li><li><p>allSuccessfulOrThrow() now returns List&lt;T&gt; instead of Stream&lt;Subtask&lt;T&gt;&gt;</p></li><li><p>anySuccessfulResultOrThrow() renamed to anySuccessfulOrThrow()</p></li><li><p>Static open method now takes UnaryOperator instead of Function</p></li></ul><pre><code><code>Response handle() throws InterruptedException {
    try (var scope = StructuredTaskScope.open()) {
        Subtask&lt;String&gt; user = scope.fork(() -&gt; findUser());
        Subtask&lt;Integer&gt; order = scope.fork(() -&gt; fetchOrder());
        scope.join();
        return new Response(user.get(), order.get());
    }
}</code></code></pre><div><hr></div><h3><strong>JEP 524: PEM Encodings of Cryptographic Objects (Second Preview)</strong></h3><p>PEM encoding/decoding API provides a concise way to convert between PEM text and cryptographic objects like keys, certificates, and certificate revocation list. <strong><a href="https://openjdk.org/jeps/524">JEP 524</a></strong> continues the preview of it with several refinements.</p><p><strong>Changes:</strong></p><ul><li><p>PEMRecord is now named PEM and includes a decode() method</p></li><li><p>EncryptedPrivateKeyInfo gets new encrypt() and getKeyPair() methods</p></li><li><p>PEMEncoder and PEMDecoder now support KeyPair and PKCS8EncodedKeySpec encryption/decryption</p></li></ul><pre><code><code>String pem = PEMEncoder.of().encodeToString(privateKey);</code></code></pre><pre><code><code>PrivateKey key = PEMDecoder.of().decode(pem, PrivateKey.class);</code></code></pre><div><hr></div><h3><strong>JEP 530: Primitive Types in Patterns, instanceof, and switch (Fourth Preview)</strong></h3><p>The feature enables uniform (finally!) data usage with type patterns for all types, whether primitive or reference, and allows switch to process values of any primitive type including boolean, float, double, and long. <strong><a href="https://openjdk.org/jeps/530">JEP 530</a></strong> previews for the fourth time the extension of pattern matching to primitive types... so you probably know the drill &#128521;</p><p><strong>Changes in this preview:</strong> Enhanced definition of unconditional exactness and tighter dominance checks in switch constructs. These changes enable the compiler to identify a wider range of coding errors, although some previously legal switch constructs will now be rejected.</p><pre><code><code>// Primitive type patterns in switch

switch (x.getYearlyFlights()) {
    case 0 -&gt; "No flights";
    case 1 -&gt; "One flight";
    case int i when i &gt;= 100 -&gt; "Gold status!";
    case int i -&gt; "Regular: " + i + " flights";
}

// instanceof with primitives - safe conversion check

int i = 1000;

if (i instanceof byte b) {
    // Only enters if i fits in a byte

}</code></code></pre><div><hr></div><h3><strong>JEP 529: Vector API (Eleventh Incubator)</strong></h3><p>The API legend (or rather myth) allowing to express vector computations that compile to optimal SIMD instructions on supported CPUs. <strong><a href="https://openjdk.org/jeps/529">JEP 529</a></strong> continues the incubation of the Vector API without substantial changes. As a reminder - the Vector API will remain in incubation until necessary features from Project Valhalla (value classes) become available as preview features. At that point, it will be adapted to use them and promoted to preview status.</p><p>And with that, a small comment at the end... I honestly expected to see more Valhalla here by JDK 26, but we still don&#8217;t have it.</p><p>So it looks like we&#8217;ll probably have to wait a bit longer for the Vector API as well.</p><div><hr></div><h2><strong>2. Beyond the JEPs - Notable Changes from Release Notes</strong></h2><p>While 10 JEPs make the headlines, JDK 26&#8217;s release notes contain a handful of smaller changes that are worth highlighting - some practical, some symbolic, and one that the internet will absolutely love.</p><h3><strong>Javadoc Dark Mode</strong></h3><p>Yes, you read that right. The API documentation generated by Javadoc now ships with a dark theme. You can toggle between light, dark, and system-default using the new theme button in the navigation bar. Is it a game-changer? No. Will it make your 2 AM debugging sessions marginally less painful? Absolutely.</p><h3><strong>Thread.stop() Is Finally Gone</strong></h3><p>In a poetic parallel to the Applet API removal (JEP 504), Java 26 also removes Thread.stop() - over <strong>27 years</strong> after it was first marked as deprecated. That&#8217;s not a typo. The method was deprecated back in JDK 1.2, which shipped in December 1998. For context, Google was founded that same year.</p><p>There&#8217;s no JEP for this one - it&#8217;s tracked in the bug tracker under <strong><a href="https://bugs.openjdk.org/browse/JDK-8368226">JDK-8368226</a></strong>. Together with the Applet API, JDK 26 is having a real &#8220;spring cleaning&#8221; moment.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_QCV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d03d3c9-64b6-454e-bfc2-2e90c8311619_1156x1484.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_QCV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d03d3c9-64b6-454e-bfc2-2e90c8311619_1156x1484.png 424w, https://substackcdn.com/image/fetch/$s_!_QCV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d03d3c9-64b6-454e-bfc2-2e90c8311619_1156x1484.png 848w, https://substackcdn.com/image/fetch/$s_!_QCV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d03d3c9-64b6-454e-bfc2-2e90c8311619_1156x1484.png 1272w, https://substackcdn.com/image/fetch/$s_!_QCV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d03d3c9-64b6-454e-bfc2-2e90c8311619_1156x1484.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_QCV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d03d3c9-64b6-454e-bfc2-2e90c8311619_1156x1484.png" width="1156" height="1484" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7d03d3c9-64b6-454e-bfc2-2e90c8311619_1156x1484.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1484,&quot;width&quot;:1156,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!_QCV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d03d3c9-64b6-454e-bfc2-2e90c8311619_1156x1484.png 424w, https://substackcdn.com/image/fetch/$s_!_QCV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d03d3c9-64b6-454e-bfc2-2e90c8311619_1156x1484.png 848w, https://substackcdn.com/image/fetch/$s_!_QCV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d03d3c9-64b6-454e-bfc2-2e90c8311619_1156x1484.png 1272w, https://substackcdn.com/image/fetch/$s_!_QCV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d03d3c9-64b6-454e-bfc2-2e90c8311619_1156x1484.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><h3><strong>JDBC 4.5</strong></h3><p>JDK 26 includes support for the JDBC 4.5 Maintenance Release. The headline change: Array, Blob, Clob, NClob, and SQLXML interfaces now extend AutoCloseable, with a default close() implementation that delegates to free(). This means you can finally use them in try-with-resources blocks without wrapping.</p><p>The release also adds default implementations of the quoted identifier methods (previously on Statement since JDK 9) to the Connection interface. A heads-up: if your JDBC driver has private or protected implementations of these newly-added default methods, you may hit compatibility issues. But I hope you do not have your own JDBC driver... unless you are in very interesting place &#128513;</p><h3><strong>UUID v7 Support</strong></h3><p>A new factory method java.util.UUID.ofEpochMillis(long) has been added, allowing creation of Type 7 UUIDs from a Unix epoch timestamp. Type 7 UUIDs are time-ordered and database-friendly - if you&#8217;ve been reaching for external libraries for this, you can stop now.</p><h3><strong>GC CPU Time Tracking</strong></h3><p>A new getTotalGcCpuTime() method on <strong><a href="http://java.lang.management/">java.lang.management</a></strong>.MemoryMXBean returns the accumulated CPU time in nanoseconds for GC-related activity. Combined with the new -Xlog:cpu output that now prints a full breakdown table of VM CPU usage at exit, this gives you much better observability into where your JVM&#8217;s CPU cycles are actually going.</p><h3><strong>HPKE and Post-Quantum Ready JAR Signing</strong></h3><p>Two non-JEP security additions that Oracle is highlighting prominently: Java 26 ships with <strong>Hybrid Public Key Encryption (HPKE)</strong> out of the box, and introduces <strong>post-quantum ready JAR signing</strong>. The HPKE support is interesting on its own, but it&#8217;s the JAR signing part that has longer-term implications for supply chain security &#8212; especially with JEP 527 (Post-Quantum Hybrid Key Exchange for TLS 1.3) already targeted for JDK 27. Oracle is clearly building out the post-quantum story piece by piece.</p><h3><strong>Virtual Threads: Unmounting During Class Initialization</strong></h3><p>A small but significant Loom improvement: virtual threads now unmount from the carrier thread when waiting for another thread to execute a class initializer. Previously, this was one of the remaining scenarios where a virtual thread would pin its carrier &#8212; making the platform thread unavailable for other work. If you&#8217;ve been tracking the gradual elimination of pinning scenarios since JDK 21, this is another step in the right direction.</p><div><hr></div><h2><strong>3. JavaOne 2026 Announcements</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Moij!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc04e4f79-8dd3-4460-9d94-e216143c5dc3_1488x989.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Moij!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc04e4f79-8dd3-4460-9d94-e216143c5dc3_1488x989.png 424w, https://substackcdn.com/image/fetch/$s_!Moij!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc04e4f79-8dd3-4460-9d94-e216143c5dc3_1488x989.png 848w, https://substackcdn.com/image/fetch/$s_!Moij!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc04e4f79-8dd3-4460-9d94-e216143c5dc3_1488x989.png 1272w, https://substackcdn.com/image/fetch/$s_!Moij!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc04e4f79-8dd3-4460-9d94-e216143c5dc3_1488x989.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Moij!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc04e4f79-8dd3-4460-9d94-e216143c5dc3_1488x989.png" width="1456" height="968" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c04e4f79-8dd3-4460-9d94-e216143c5dc3_1488x989.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:968,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!Moij!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc04e4f79-8dd3-4460-9d94-e216143c5dc3_1488x989.png 424w, https://substackcdn.com/image/fetch/$s_!Moij!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc04e4f79-8dd3-4460-9d94-e216143c5dc3_1488x989.png 848w, https://substackcdn.com/image/fetch/$s_!Moij!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc04e4f79-8dd3-4460-9d94-e216143c5dc3_1488x989.png 1272w, https://substackcdn.com/image/fetch/$s_!Moij!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc04e4f79-8dd3-4460-9d94-e216143c5dc3_1488x989.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>JDK 26&#8217;s release day coincides with JavaOne 2026 (March 17&#8211;19, Redwood Shores, CA), and Oracle used the occasion to make several ecosystem announcements that arguably overshadow the JDK release itself.</p><p>Here, you will find the Keynote and... it was a loaded one - and the title says everything.</p><div id="youtube2-3fLCOqpIfI0" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;3fLCOqpIfI0&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/3fLCOqpIfI0?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>Here you will find the most important non-directly-JDK related announcements.</p><h3><strong>Java Verified Portfolio (JVP)</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mtoj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbafd017-4fd6-403a-a69c-d7303bc33cf7_1488x834.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mtoj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbafd017-4fd6-403a-a69c-d7303bc33cf7_1488x834.png 424w, https://substackcdn.com/image/fetch/$s_!mtoj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbafd017-4fd6-403a-a69c-d7303bc33cf7_1488x834.png 848w, https://substackcdn.com/image/fetch/$s_!mtoj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbafd017-4fd6-403a-a69c-d7303bc33cf7_1488x834.png 1272w, https://substackcdn.com/image/fetch/$s_!mtoj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbafd017-4fd6-403a-a69c-d7303bc33cf7_1488x834.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mtoj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbafd017-4fd6-403a-a69c-d7303bc33cf7_1488x834.png" width="1456" height="816" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dbafd017-4fd6-403a-a69c-d7303bc33cf7_1488x834.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:816,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!mtoj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbafd017-4fd6-403a-a69c-d7303bc33cf7_1488x834.png 424w, https://substackcdn.com/image/fetch/$s_!mtoj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbafd017-4fd6-403a-a69c-d7303bc33cf7_1488x834.png 848w, https://substackcdn.com/image/fetch/$s_!mtoj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbafd017-4fd6-403a-a69c-d7303bc33cf7_1488x834.png 1272w, https://substackcdn.com/image/fetch/$s_!mtoj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbafd017-4fd6-403a-a69c-d7303bc33cf7_1488x834.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>The biggest announcement is the introduction of the <strong>Java Verified Portfolio</strong> - a curated, Oracle-supported collection of tools, frameworks, libraries, and services that extends enterprise support beyond the JDK itself.</p><p>At launch, JVP includes:</p><ul><li><p><strong>Helidon</strong> - Oracle&#8217;s open-source, cloud-native microservices framework built on Virtual Threads, with LangChain4j integration and MCP-based AI agent support</p></li><li><p><strong>JavaFX</strong> - reintroduced under commercial support after a multi-year gap, driven by demand for rich interactive UIs in AI analytics and data visualization</p></li><li><p><strong>Java Platform Extension for VS Code</strong></p></li></ul><p>JVP is included at no additional cost for Java SE subscribers and OCI customers. Oracle is clearly positioning this as a supply-chain risk reduction play &#8212; instead of tracking multiple upstream sources with varying support timelines, you get a single, Oracle-governed source of truth with roadmap alignment to JDK releases.</p><h3><strong>Project Detroit - Java and JavaScript/Python Interop</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3rJg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3abc368-5acc-471e-b1c3-da50078cda99_1296x710.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3rJg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3abc368-5acc-471e-b1c3-da50078cda99_1296x710.png 424w, https://substackcdn.com/image/fetch/$s_!3rJg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3abc368-5acc-471e-b1c3-da50078cda99_1296x710.png 848w, https://substackcdn.com/image/fetch/$s_!3rJg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3abc368-5acc-471e-b1c3-da50078cda99_1296x710.png 1272w, https://substackcdn.com/image/fetch/$s_!3rJg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3abc368-5acc-471e-b1c3-da50078cda99_1296x710.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3rJg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3abc368-5acc-471e-b1c3-da50078cda99_1296x710.png" width="1296" height="710" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d3abc368-5acc-471e-b1c3-da50078cda99_1296x710.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:710,&quot;width&quot;:1296,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!3rJg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3abc368-5acc-471e-b1c3-da50078cda99_1296x710.png 424w, https://substackcdn.com/image/fetch/$s_!3rJg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3abc368-5acc-471e-b1c3-da50078cda99_1296x710.png 848w, https://substackcdn.com/image/fetch/$s_!3rJg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3abc368-5acc-471e-b1c3-da50078cda99_1296x710.png 1272w, https://substackcdn.com/image/fetch/$s_!3rJg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3abc368-5acc-471e-b1c3-da50078cda99_1296x710.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>While JVP was the most important, this one is the most forward-looking announcement: Oracle introduced <strong>Project Detroit</strong>, designed to enable fast, seamless interoperability between Java, JavaScript, and Python.</p><p>If the name sounds familiar, that&#8217;s because it&#8217;s a resurrection. The original Detroit project was <strong><a href="https://mail.openjdk.org/pipermail/announce/2018-February/000244.html">created in February 2018</a></strong> as a bridge between Java and JavaScript via V8, but it never got off the ground and was dissolved in September 2024. In <strong><a href="https://mail.openjdk.org/pipermail/announce/2026-February/000364.html">February 2026</a></strong>, Sundararajan Athijegannathan (who offered to lead the project) proposed its recreation, noting that &#8220;with the rise of AI, there is also interest in accessing AI functionality written in Python from Java applications.&#8221;</p><p>The approach is fundamentally different from what we had with Nashorn or GraalVM&#8217;s Truffle-based language implementations. As Bernard Traversat (VP Software Development at Oracle) explained at the JavaOne briefing: instead of reimplementing JavaScript or Python on top of the JVM - where you&#8217;re constantly &#8220;swimming against the current&#8221; chasing language spec corner cases - Detroit embeds the V8 and CPython runtimes <strong>directly inside the JVM process</strong> via the FFM API. This gives you native compatibility for free and clear heap isolation between Java and the guest language.</p><p>The irony here is hard to miss. Oracle JDK 24 was the <strong><a href="https://www.reddit.com/r/java/comments/1rf5cds/project_detroit_removing_graal_then_rebuilding_it/">last release to include the experimental Graal JIT compiler</a></strong>, and GraalVM for JDK 24 was the last version licensed under Java SE - effectively detaching GraalVM&#8217;s polyglot story from the JDK ecosystem train. And now, barely a year and a half later, Oracle is rebuilding the polyglot interop capability from scratch, this time with a radically simpler architecture - to be fair, Detroit&#8217;s approach is architecturally quite different from Truffle.</p><p>The project team includes some serious OpenJDK heavyweights (Jim Laskey, Maurizio Cimadamore, Alan Bateman, among others), and the <strong><a href="https://mail.openjdk.org/pipermail/announce/2026-February/000364.html">CFV (Call for Votes) passed on the OpenJDK announce list</a></strong> in March. Oracle is now officially proposing it as an OpenJDK project with repos already up on GitHub (<strong><a href="https://github.com/openjdk/detroit">detroit</a></strong>, <strong><a href="https://github.com/openjdk/detroit-python">detroit-python</a></strong>).</p><h3><strong>Helidon &#8594; OpenJDK</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ewfr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0de1263d-7a62-4651-9458-125a6fc8d345_2232x1184.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ewfr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0de1263d-7a62-4651-9458-125a6fc8d345_2232x1184.png 424w, https://substackcdn.com/image/fetch/$s_!Ewfr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0de1263d-7a62-4651-9458-125a6fc8d345_2232x1184.png 848w, https://substackcdn.com/image/fetch/$s_!Ewfr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0de1263d-7a62-4651-9458-125a6fc8d345_2232x1184.png 1272w, https://substackcdn.com/image/fetch/$s_!Ewfr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0de1263d-7a62-4651-9458-125a6fc8d345_2232x1184.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ewfr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0de1263d-7a62-4651-9458-125a6fc8d345_2232x1184.png" width="1456" height="772" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0de1263d-7a62-4651-9458-125a6fc8d345_2232x1184.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:772,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!Ewfr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0de1263d-7a62-4651-9458-125a6fc8d345_2232x1184.png 424w, https://substackcdn.com/image/fetch/$s_!Ewfr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0de1263d-7a62-4651-9458-125a6fc8d345_2232x1184.png 848w, https://substackcdn.com/image/fetch/$s_!Ewfr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0de1263d-7a62-4651-9458-125a6fc8d345_2232x1184.png 1272w, https://substackcdn.com/image/fetch/$s_!Ewfr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0de1263d-7a62-4651-9458-125a6fc8d345_2232x1184.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>Oracle is contributing Helidon to OpenJDK and aligning its release cadence with the JDK - meaning Helidon will ship alongside each JDK release and share LTS timelines. This is a notable move: it elevates Helidon from &#8220;Oracle&#8217;s microservices framework&#8221; to a community-governed project with first-class JDK integration.</p><p>Waiting for additional details here! As soon I have them, I&#8217;ll share &#128522;</p><h3><strong>JetBrains Announces Koog for Java</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BFxP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb66c4491-c423-45fb-8aee-f974fb468045_1488x832.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BFxP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb66c4491-c423-45fb-8aee-f974fb468045_1488x832.png 424w, https://substackcdn.com/image/fetch/$s_!BFxP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb66c4491-c423-45fb-8aee-f974fb468045_1488x832.png 848w, https://substackcdn.com/image/fetch/$s_!BFxP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb66c4491-c423-45fb-8aee-f974fb468045_1488x832.png 1272w, https://substackcdn.com/image/fetch/$s_!BFxP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb66c4491-c423-45fb-8aee-f974fb468045_1488x832.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BFxP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb66c4491-c423-45fb-8aee-f974fb468045_1488x832.png" width="1456" height="814" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b66c4491-c423-45fb-8aee-f974fb468045_1488x832.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:814,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!BFxP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb66c4491-c423-45fb-8aee-f974fb468045_1488x832.png 424w, https://substackcdn.com/image/fetch/$s_!BFxP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb66c4491-c423-45fb-8aee-f974fb468045_1488x832.png 848w, https://substackcdn.com/image/fetch/$s_!BFxP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb66c4491-c423-45fb-8aee-f974fb468045_1488x832.png 1272w, https://substackcdn.com/image/fetch/$s_!BFxP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb66c4491-c423-45fb-8aee-f974fb468045_1488x832.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>Not all JavaOne news came from Oracle. JetBrains chose the conference to announce <strong><a href="https://blog.jetbrains.com/ai/2026/03/koog-comes-to-java/">Koog for Java</a></strong> - bringing their AI agent framework, originally built in Kotlin, to idiomatic Java with fluent builder-style APIs.</p><p>Koog is an open-source framework for building enterprise-ready AI agents on the JVM. What makes it interesting is that it&#8217;s not a research project - JetBrains built it to power their own AI features in IntelliJ and other products, then extracted it as a standalone framework. The feature set reads like a wishlist for anyone who&#8217;s tried to build reliable agents: graph-based workflow strategies, persistent checkpointing (resume from exactly where you stopped after a crash), intelligent history compression for long-running conversations, Spring Boot integration, MCP support, and observability via OpenTelemetry exporters to Langfuse and W&amp;B Weave.</p><p>The Java API launch is particularly well-timed. With Oracle pushing the &#8220;Java for AI&#8221; narrative hard (see below), and Rod Johnson&#8217;s <strong><a href="https://embabel.com/">Embabel</a></strong> taking a Spring-native, domain-modeling approach to the same problem space, we&#8217;re suddenly seeing a real competition for the JVM agent framework crown. As a <strong><a href="https://www.javacodegeeks.com/2026/03/the-first-jvm-native-ai-agent-frameworks-and-why-rod-johnson-built-one-of-them.html">recent comparison piece</a></strong> put it: Embabel reasons about goals and conditions (think: declarative planning), while Koog asks you to define a directed graph of nodes (think: LangGraph, but on the JVM). Different philosophies, same goal - making Python optional for the agent layer of your stack.</p><p>BTW: <strong><a href="https://blog.jetbrains.com/idea/2026/03/java-26-in-intellij-idea/">Java 26 is already available in IntelliJ IDEA.</a></strong></p><h3><strong>The AI Narrative</strong></h3><p>The keynote&#8217;s title alone - &#8220;Java for an AI World&#8221; - tells you everything about where Oracle&#8217;s head is at right now.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9Iir!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0927be8-08ae-4e28-9e63-de32bae87722_1488x830.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9Iir!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0927be8-08ae-4e28-9e63-de32bae87722_1488x830.png 424w, https://substackcdn.com/image/fetch/$s_!9Iir!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0927be8-08ae-4e28-9e63-de32bae87722_1488x830.png 848w, https://substackcdn.com/image/fetch/$s_!9Iir!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0927be8-08ae-4e28-9e63-de32bae87722_1488x830.png 1272w, https://substackcdn.com/image/fetch/$s_!9Iir!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0927be8-08ae-4e28-9e63-de32bae87722_1488x830.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9Iir!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0927be8-08ae-4e28-9e63-de32bae87722_1488x830.png" width="1456" height="812" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d0927be8-08ae-4e28-9e63-de32bae87722_1488x830.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:812,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!9Iir!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0927be8-08ae-4e28-9e63-de32bae87722_1488x830.png 424w, https://substackcdn.com/image/fetch/$s_!9Iir!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0927be8-08ae-4e28-9e63-de32bae87722_1488x830.png 848w, https://substackcdn.com/image/fetch/$s_!9Iir!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0927be8-08ae-4e28-9e63-de32bae87722_1488x830.png 1272w, https://substackcdn.com/image/fetch/$s_!9Iir!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0927be8-08ae-4e28-9e63-de32bae87722_1488x830.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p><strong><a href="https://www.linkedin.com/in/ana-maria-mihalceanu-1508/">Ana-Maria Mihalceanu</a></strong> and <strong><a href="https://www.linkedin.com/in/lize-raes-a8a34110/">Lize Raes</a></strong> - both Oracle Developer Advocates - had a remarkably long segment during the keynote. Together with <strong><a href="https://www.linkedin.com/in/paul-sandoz-4704562/">Paul Sandoz</a></strong>, they covered two angles: the Babylon/HAT stack (from JDK building blocks through GPU-enabled libraries to Java code running on GPUs), and a practical demo of an LLM-powered triage system for a medical appointment helpdesk - automatic ticket classification, urgency flagging, matching against known bugs with relevance scores, and a clear split between what AI handles and where humans stay in control.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ndP9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F526adf2b-1646-4510-b455-0c03ea025402_1488x821.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ndP9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F526adf2b-1646-4510-b455-0c03ea025402_1488x821.png 424w, https://substackcdn.com/image/fetch/$s_!ndP9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F526adf2b-1646-4510-b455-0c03ea025402_1488x821.png 848w, https://substackcdn.com/image/fetch/$s_!ndP9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F526adf2b-1646-4510-b455-0c03ea025402_1488x821.png 1272w, https://substackcdn.com/image/fetch/$s_!ndP9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F526adf2b-1646-4510-b455-0c03ea025402_1488x821.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ndP9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F526adf2b-1646-4510-b455-0c03ea025402_1488x821.png" width="1456" height="803" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/526adf2b-1646-4510-b455-0c03ea025402_1488x821.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:803,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!ndP9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F526adf2b-1646-4510-b455-0c03ea025402_1488x821.png 424w, https://substackcdn.com/image/fetch/$s_!ndP9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F526adf2b-1646-4510-b455-0c03ea025402_1488x821.png 848w, https://substackcdn.com/image/fetch/$s_!ndP9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F526adf2b-1646-4510-b455-0c03ea025402_1488x821.png 1272w, https://substackcdn.com/image/fetch/$s_!ndP9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F526adf2b-1646-4510-b455-0c03ea025402_1488x821.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>The amount of keynote time Oracle gave to these topics says more than any roadmap slide.</p><h3><strong>Who outside of Oracle team was on the JavaOne Stage</strong></h3><p>The opening keynote - wasn&#8217;t just an Oracle show. Rod Johnson, Josh Long, and engineering leads from Microsoft, NVIDIA, and Uber all shared the stage. That lineup alone tells you something about where the Java ecosystem is headed.</p><p><strong><a href="https://devblogs.microsoft.com/java/microsoft-at-javaone-empowering-java-developers-to-lead-the-next-era-of-ai/">Microsoft came with a concrete developer play</a></strong>: the <strong>GitHub Copilot Community SDK for Java</strong>, which brings programmatic control of Copilot CLI and its agents into the Java ecosystem &#8212; including conversational AI sessions, custom tools, streaming events, and MCP server integration. Their sessions covered building production GenAI systems with LangChain4j and vector search on Azure. Oh, and mark your calendars: Microsoft also invited evereyone to <strong><a href="https://jdconf.com/">JDConf 2026</a></strong> (April 8&#8211;9), their free virtual Java developer conference, now in its sixth year.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kFpd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00e2fb39-f95c-4777-8b30-709c09b27406_1488x823.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kFpd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00e2fb39-f95c-4777-8b30-709c09b27406_1488x823.png 424w, https://substackcdn.com/image/fetch/$s_!kFpd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00e2fb39-f95c-4777-8b30-709c09b27406_1488x823.png 848w, https://substackcdn.com/image/fetch/$s_!kFpd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00e2fb39-f95c-4777-8b30-709c09b27406_1488x823.png 1272w, https://substackcdn.com/image/fetch/$s_!kFpd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00e2fb39-f95c-4777-8b30-709c09b27406_1488x823.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kFpd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00e2fb39-f95c-4777-8b30-709c09b27406_1488x823.png" width="1456" height="805" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/00e2fb39-f95c-4777-8b30-709c09b27406_1488x823.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:805,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!kFpd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00e2fb39-f95c-4777-8b30-709c09b27406_1488x823.png 424w, https://substackcdn.com/image/fetch/$s_!kFpd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00e2fb39-f95c-4777-8b30-709c09b27406_1488x823.png 848w, https://substackcdn.com/image/fetch/$s_!kFpd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00e2fb39-f95c-4777-8b30-709c09b27406_1488x823.png 1272w, https://substackcdn.com/image/fetch/$s_!kFpd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00e2fb39-f95c-4777-8b30-709c09b27406_1488x823.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p><strong>NVIDIA</strong> and <strong><a href="https://www.linkedin.com/in/ikroopdhillon?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAAD-dnQBK52_UhjHkwQvh-JqiuOySS6dp2k">Ikroop Dhillon</a></strong> had a presence that reflects Java&#8217;s growing role in GPU-accelerated workloads. With GTC 2026 running concurrently (literally across town in San Jose), the Java-NVIDIA intersection is Project Babylon territory - extending Java&#8217;s reach into AI model training and GPU compute. The broader theme: Java as the orchestration layer for inference pipelines that run on NVIDIA hardware. However, while it was interesting, it was more about Nvidia than Java, with an Apache Solr guest appearing.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!W0VA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f1f4bc2-4386-42f7-bf65-9e530572d2d4_1488x831.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!W0VA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f1f4bc2-4386-42f7-bf65-9e530572d2d4_1488x831.png 424w, https://substackcdn.com/image/fetch/$s_!W0VA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f1f4bc2-4386-42f7-bf65-9e530572d2d4_1488x831.png 848w, https://substackcdn.com/image/fetch/$s_!W0VA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f1f4bc2-4386-42f7-bf65-9e530572d2d4_1488x831.png 1272w, https://substackcdn.com/image/fetch/$s_!W0VA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f1f4bc2-4386-42f7-bf65-9e530572d2d4_1488x831.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!W0VA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f1f4bc2-4386-42f7-bf65-9e530572d2d4_1488x831.png" width="1456" height="813" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9f1f4bc2-4386-42f7-bf65-9e530572d2d4_1488x831.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:813,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!W0VA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f1f4bc2-4386-42f7-bf65-9e530572d2d4_1488x831.png 424w, https://substackcdn.com/image/fetch/$s_!W0VA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f1f4bc2-4386-42f7-bf65-9e530572d2d4_1488x831.png 848w, https://substackcdn.com/image/fetch/$s_!W0VA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f1f4bc2-4386-42f7-bf65-9e530572d2d4_1488x831.png 1272w, https://substackcdn.com/image/fetch/$s_!W0VA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f1f4bc2-4386-42f7-bf65-9e530572d2d4_1488x831.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p><strong>Uber</strong> presented probably the most hands-on production story at the conference: how they scaled GPU-accelerated inference while maintaining strict tail-latency SLOs in a JVM-centric environment. Their talk covered how Java services integrate with NVIDIA Triton Inference Server to serve models from small neural nets to multi-hundred-gigabyte LLMs, and the JVM tuning rabbit holes that followed. If you want proof that &#8220;Java for AI&#8221; isn&#8217;t just marketing, this is it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WeBf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7211f635-8a7b-4333-a035-52cff6bb832b_1488x806.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WeBf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7211f635-8a7b-4333-a035-52cff6bb832b_1488x806.png 424w, https://substackcdn.com/image/fetch/$s_!WeBf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7211f635-8a7b-4333-a035-52cff6bb832b_1488x806.png 848w, https://substackcdn.com/image/fetch/$s_!WeBf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7211f635-8a7b-4333-a035-52cff6bb832b_1488x806.png 1272w, https://substackcdn.com/image/fetch/$s_!WeBf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7211f635-8a7b-4333-a035-52cff6bb832b_1488x806.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WeBf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7211f635-8a7b-4333-a035-52cff6bb832b_1488x806.png" width="1456" height="789" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7211f635-8a7b-4333-a035-52cff6bb832b_1488x806.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:789,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!WeBf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7211f635-8a7b-4333-a035-52cff6bb832b_1488x806.png 424w, https://substackcdn.com/image/fetch/$s_!WeBf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7211f635-8a7b-4333-a035-52cff6bb832b_1488x806.png 848w, https://substackcdn.com/image/fetch/$s_!WeBf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7211f635-8a7b-4333-a035-52cff6bb832b_1488x806.png 1272w, https://substackcdn.com/image/fetch/$s_!WeBf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7211f635-8a7b-4333-a035-52cff6bb832b_1488x806.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p><strong><a href="https://www.linkedin.com/in/joshlong/">Josh Long</a></strong> , in his trademark style, took the stage to show just how quickly you can go from zero to a working AI-integrated application with Spring Boot 4.0.3 and Spring AI. Starting from Spring Initializr he demoed the new capabilities of the Spring ecosystem, building an app on the spot. He also showed off the OpenAI integration and PassKeys support in Spring Security via a pre-recorded demo &#8212; the keynote pace was so relentless that even Josh Long couldn&#8217;t live-code everything. And because it&#8217;s Josh Long, the whole thing came with Hitchhiker&#8217;s Guide to the Galaxy references, because of course it did.</p><p>42.</p><h3><strong>PS: Valhalla Update: Early Access 3 Is Here</strong></h3><p>On the Valhalla front, things are moving faster than it might seem from the JDK 26 JEP list alone. While JDK 26 ships without any Valhalla features (and the Vector API remains in incubation waiting for them), the Valhalla team has been busy outside the main release train. Just last week, <strong><a href="https://www.reddit.com/r/java/comments/1rw886e/early_access_3_for_project_valhallas_jep_401/">Build 27-jep401ea3+1-1</a></strong> - the <strong>third Early Access build</strong> of JEP 401: Value Classes and Objects - was made available, based on an incomplete version of JDK 27.</p><p>This is the third EA milestone since the first build <strong><a href="https://inside.java/2025/10/27/try-jep-401-value-classes/">dropped in October 2025</a></strong>, and the pace of iteration suggests that JEP 401 is getting closer to targeting a release. The EA build focuses on two key optimizations: <strong>heap flattening</strong> (reducing the memory footprint of value objects in fields and arrays) and <strong>scalarization</strong> (avoiding memory allocation in JIT-compiled code). In benchmarks, the results are already impressive - Dan Smith&#8217;s original demo showed significant performance improvements for arrays of value objects compared to identity objects.</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!POIg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79ee004-41a8-4bd4-bef9-11e5317f8ab1_1333x1000.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!POIg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79ee004-41a8-4bd4-bef9-11e5317f8ab1_1333x1000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!POIg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79ee004-41a8-4bd4-bef9-11e5317f8ab1_1333x1000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!POIg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79ee004-41a8-4bd4-bef9-11e5317f8ab1_1333x1000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!POIg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79ee004-41a8-4bd4-bef9-11e5317f8ab1_1333x1000.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!POIg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79ee004-41a8-4bd4-bef9-11e5317f8ab1_1333x1000.jpeg" width="1333" height="1000" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c79ee004-41a8-4bd4-bef9-11e5317f8ab1_1333x1000.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1000,&quot;width&quot;:1333,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!POIg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79ee004-41a8-4bd4-bef9-11e5317f8ab1_1333x1000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!POIg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79ee004-41a8-4bd4-bef9-11e5317f8ab1_1333x1000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!POIg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79ee004-41a8-4bd4-bef9-11e5317f8ab1_1333x1000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!POIg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79ee004-41a8-4bd4-bef9-11e5317f8ab1_1333x1000.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>And a shout-out to the <strong><a href="https://www.linkedin.com/company/datasetlinks/">DataLinks</a></strong> crew who are on the ground at JavaOne! Thanks to <strong><a href="https://www.linkedin.com/in/michalniczyporuk/">Michal Niczyporuk</a></strong> for the photo - great to have Polish representation in Redwood Shores.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[JetBrains launches Air and Junie CLI - JVM Weekly vol. 166]]></title><description><![CDATA[JetBrains launches Air and Junie CLI, the community reacts with mixed feelings, I try to code from an iPhone (and learn more than I wanted about Mosh), and TornadoVM 3.0 quietly keeps pushing Java.]]></description><link>https://www.jvm-weekly.com/p/jetbrains-launches-air-and-junie</link><guid isPermaLink="false">https://www.jvm-weekly.com/p/jetbrains-launches-air-and-junie</guid><dc:creator><![CDATA[Artur Skowronski]]></dc:creator><pubDate>Thu, 12 Mar 2026 14:02:37 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!9nUQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a3ffdbe-0de1-4c54-89b5-ecb9e20547e7_1920x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9nUQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a3ffdbe-0de1-4c54-89b5-ecb9e20547e7_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9nUQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a3ffdbe-0de1-4c54-89b5-ecb9e20547e7_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!9nUQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a3ffdbe-0de1-4c54-89b5-ecb9e20547e7_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!9nUQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a3ffdbe-0de1-4c54-89b5-ecb9e20547e7_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!9nUQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a3ffdbe-0de1-4c54-89b5-ecb9e20547e7_1920x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9nUQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a3ffdbe-0de1-4c54-89b5-ecb9e20547e7_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4a3ffdbe-0de1-4c54-89b5-ecb9e20547e7_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2034895,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/190704447?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a3ffdbe-0de1-4c54-89b5-ecb9e20547e7_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!9nUQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a3ffdbe-0de1-4c54-89b5-ecb9e20547e7_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!9nUQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a3ffdbe-0de1-4c54-89b5-ecb9e20547e7_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!9nUQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a3ffdbe-0de1-4c54-89b5-ecb9e20547e7_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!9nUQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a3ffdbe-0de1-4c54-89b5-ecb9e20547e7_1920x1080.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>It was supposed to be a quiet week. JavaOne is next week, JDK 26 is looming, and I already had that prepared for vol. 167. But JetBrains apparently didn&#8217;t get the memo about pacing, because they dropped two product launches on a Sunday.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OJtf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3957bd61-164b-47ac-a75c-2210bdd1fbc2_1488x928.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OJtf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3957bd61-164b-47ac-a75c-2210bdd1fbc2_1488x928.png 424w, https://substackcdn.com/image/fetch/$s_!OJtf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3957bd61-164b-47ac-a75c-2210bdd1fbc2_1488x928.png 848w, https://substackcdn.com/image/fetch/$s_!OJtf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3957bd61-164b-47ac-a75c-2210bdd1fbc2_1488x928.png 1272w, https://substackcdn.com/image/fetch/$s_!OJtf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3957bd61-164b-47ac-a75c-2210bdd1fbc2_1488x928.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OJtf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3957bd61-164b-47ac-a75c-2210bdd1fbc2_1488x928.png" width="1456" height="908" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3957bd61-164b-47ac-a75c-2210bdd1fbc2_1488x928.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:908,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!OJtf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3957bd61-164b-47ac-a75c-2210bdd1fbc2_1488x928.png 424w, https://substackcdn.com/image/fetch/$s_!OJtf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3957bd61-164b-47ac-a75c-2210bdd1fbc2_1488x928.png 848w, https://substackcdn.com/image/fetch/$s_!OJtf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3957bd61-164b-47ac-a75c-2210bdd1fbc2_1488x928.png 1272w, https://substackcdn.com/image/fetch/$s_!OJtf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3957bd61-164b-47ac-a75c-2210bdd1fbc2_1488x928.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Let me get the biggest thing out of the way first: announced product, <strong>Jetbrains Air,</strong> is not an IDE in a classic sense. JetBrains is calling it an &#8220;Agentic Development Environment&#8221; - an ADE, if you will - and the distinction actually matters. Where an IDE adds tools <em>to a code editor</em>, Air builds tools <em>around the agent</em>. Your job isn&#8217;t to write code; it&#8217;s to define tasks, supervise agents, and review their output. If that sounds like a philosophical shift, that&#8217;s because it is.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1vzl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89aafa6f-2d86-4a1e-a9a2-5ea75b068136_1332x906.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1vzl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89aafa6f-2d86-4a1e-a9a2-5ea75b068136_1332x906.png 424w, https://substackcdn.com/image/fetch/$s_!1vzl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89aafa6f-2d86-4a1e-a9a2-5ea75b068136_1332x906.png 848w, https://substackcdn.com/image/fetch/$s_!1vzl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89aafa6f-2d86-4a1e-a9a2-5ea75b068136_1332x906.png 1272w, https://substackcdn.com/image/fetch/$s_!1vzl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89aafa6f-2d86-4a1e-a9a2-5ea75b068136_1332x906.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1vzl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89aafa6f-2d86-4a1e-a9a2-5ea75b068136_1332x906.png" width="1332" height="906" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/89aafa6f-2d86-4a1e-a9a2-5ea75b068136_1332x906.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:906,&quot;width&quot;:1332,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!1vzl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89aafa6f-2d86-4a1e-a9a2-5ea75b068136_1332x906.png 424w, https://substackcdn.com/image/fetch/$s_!1vzl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89aafa6f-2d86-4a1e-a9a2-5ea75b068136_1332x906.png 848w, https://substackcdn.com/image/fetch/$s_!1vzl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89aafa6f-2d86-4a1e-a9a2-5ea75b068136_1332x906.png 1272w, https://substackcdn.com/image/fetch/$s_!1vzl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89aafa6f-2d86-4a1e-a9a2-5ea75b068136_1332x906.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Air launched on <strong><a href="https://blog.jetbrains.com/air/2026/03/air-launches-as-public-preview-a-new-wave-of-dev-tooling-built-on-26-years-of-experience/">March 9th</a></strong> as a public preview, and it supports Codex, Claude Agent, Gemini CLI, and Junie out of the box. It&#8217;s built on the Agent Client Protocol (ACP), the open standard JetBrains has been co-developing with Zed since last year (with an <strong><a href="https://blog.jetbrains.com/ai/2026/01/acp-agent-registry/">ACP Registry</a></strong> already live since January). The idea is simple: implement ACP once, and your agent works in Zed, JetBrains IDEs, Neovim, and anywhere else the protocol reaches. Think LSP, but for AI agents.</p><p>The key concept in Air is a task - you describe what you want done, optionally mentioning specific lines, commits, classes or methods for precise context, and an agent goes off to work on it. You can run multiple agents on different tasks concurrently, each isolated in its own Git worktree or Docker container. When an agent finishes, you review the changes not just as a diff, but in the context of your entire codebase, with a terminal, Git client, and built-in preview right there.</p><p>Now, here&#8217;s the part that will raise eyebrows for some: Air is built on the <strong>Fleet codebase</strong>. Yes, <em>that</em> Fleet - the one JetBrains <strong><a href="https://devclass.com/2025/12/09/jetbrains-abandons-fleet-ide-pins-hopes-on-forthcoming-air-agentic-development-tool/">discontinued in December 2025</a></strong> after four years in preview without ever reaching GA. The architecture is modern (closer to VS Code than IntelliJ in terms of performance), but some of Fleet&#8217;s ghosts linger - early users are already reporting the familiar memory footprint issues, and the whole thing is <strong>macOS-only</strong> for now, with Windows and Linux promised for later.</p><p>For the business model: if you have a JetBrains AI Pro or AI Ultimate subscription (included in the All Products Pack), all agents are included. Otherwise, it&#8217;s BYOK - bring your own API keys from Anthropic, OpenAI, or Google. Cloud execution (agents running in remote sandboxes) is in tech preview and coming soon.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UsgF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91f6e5f7-876b-41a4-b3f4-f7b49e4356d6_1360x968.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UsgF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91f6e5f7-876b-41a4-b3f4-f7b49e4356d6_1360x968.png 424w, https://substackcdn.com/image/fetch/$s_!UsgF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91f6e5f7-876b-41a4-b3f4-f7b49e4356d6_1360x968.png 848w, https://substackcdn.com/image/fetch/$s_!UsgF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91f6e5f7-876b-41a4-b3f4-f7b49e4356d6_1360x968.png 1272w, https://substackcdn.com/image/fetch/$s_!UsgF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91f6e5f7-876b-41a4-b3f4-f7b49e4356d6_1360x968.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UsgF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91f6e5f7-876b-41a4-b3f4-f7b49e4356d6_1360x968.png" width="1360" height="968" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/91f6e5f7-876b-41a4-b3f4-f7b49e4356d6_1360x968.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:968,&quot;width&quot;:1360,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!UsgF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91f6e5f7-876b-41a4-b3f4-f7b49e4356d6_1360x968.png 424w, https://substackcdn.com/image/fetch/$s_!UsgF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91f6e5f7-876b-41a4-b3f4-f7b49e4356d6_1360x968.png 848w, https://substackcdn.com/image/fetch/$s_!UsgF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91f6e5f7-876b-41a4-b3f4-f7b49e4356d6_1360x968.png 1272w, https://substackcdn.com/image/fetch/$s_!UsgF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91f6e5f7-876b-41a4-b3f4-f7b49e4356d6_1360x968.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>The strategic positioning is clear. JetBrains is looking at Cursor, Warp Oz, AWS Kiro, Google Antigravity, and the whole wave of AI-native tools and saying: &#8220;We&#8217;ve been building developer tools for 26 years - we can do this too, but <em>our</em> way.&#8221; Whether that&#8217;s a strength or a liability depends on whom you ask.</p><p>As <strong><a href="https://www.theregister.com/2026/03/10/jetbrains_previews_air_proclaims_new/">The Register noted</a></strong>, JetBrains will have a difficult time balancing the needs of their loyal IntelliJ customers - who absolutely do not want to switch to a different product - while trying to establish a new AI-centric environment.</p><p>Alongside Air, JetBrains also released <strong><a href="https://blog.jetbrains.com/junie/2026/03/junie-cli-the-llm-agnostic-coding-agent-is-now-in-beta/">Junie CLI</a></strong> in beta - essentially making their coding agent a standalone tool that works from the terminal, inside any IDE, in CI/CD pipelines, and on GitHub/GitLab. It&#8217;s LLM-agnostic (supporting models from OpenAI, Anthropic, Google, and Grok), open-source on <strong><a href="https://github.com/JetBrains/junie">GitHub</a></strong>, and ships with a BYOK pricing model. There&#8217;s even a free week of Gemini 3 Flash to get you started.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fkoM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4d87919-d3b1-424b-a382-dbb232fc0ece_728x400.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fkoM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4d87919-d3b1-424b-a382-dbb232fc0ece_728x400.png 424w, https://substackcdn.com/image/fetch/$s_!fkoM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4d87919-d3b1-424b-a382-dbb232fc0ece_728x400.png 848w, https://substackcdn.com/image/fetch/$s_!fkoM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4d87919-d3b1-424b-a382-dbb232fc0ece_728x400.png 1272w, https://substackcdn.com/image/fetch/$s_!fkoM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4d87919-d3b1-424b-a382-dbb232fc0ece_728x400.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fkoM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4d87919-d3b1-424b-a382-dbb232fc0ece_728x400.png" width="728" height="400" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f4d87919-d3b1-424b-a382-dbb232fc0ece_728x400.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:400,&quot;width&quot;:728,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!fkoM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4d87919-d3b1-424b-a382-dbb232fc0ece_728x400.png 424w, https://substackcdn.com/image/fetch/$s_!fkoM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4d87919-d3b1-424b-a382-dbb232fc0ece_728x400.png 848w, https://substackcdn.com/image/fetch/$s_!fkoM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4d87919-d3b1-424b-a382-dbb232fc0ece_728x400.png 1272w, https://substackcdn.com/image/fetch/$s_!fkoM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4d87919-d3b1-424b-a382-dbb232fc0ece_728x400.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>The feature list reads well: one-click migration from Claude Code or Codex, custom subagents, Agent Skills for domain-specific rules, project-level guidelines via .junie/guidelines.md, and a <strong><a href="https://github.com/JetBrains/junie-github-action">GitHub Action</a></strong> for automated PR handling. Junie CLI positions itself as the &#8220;coding buddy&#8221; that goes wherever you work.</p><p>But here&#8217;s the elephant in the room that the community has been pointing out for a while now: <strong>JetBrains&#8217; AI product lineup is getting confusing</strong>. You&#8217;ve got the AI Assistant (the in-IDE chat), Junie (the agent, now in both IDE plugin and CLI forms), Mellum (JetBrains&#8217; own LLM), and now Air (the ADE). As <strong><a href="https://www.linkedin.com/preload/#">&#128075; julien lengrand-lambert &#128075;</a></strong> in <strong><a href="https://lengrand.fr/my-experience-using-junie-for-the-past-few-months/">a bit old, but still valid longer experience post</a></strong> put it well - it feels like learning a bunch of new product names with little differentiation. The pricing page says you kind of get everything with a subscription, but the &#8220;when should I use what&#8221; story needs serious work.</p><p>On the positive side, Junie&#8217;s deep integration with JetBrains&#8217; static analysis engine is a genuine differentiator. As one Hacker News commenter <strong><a href="https://news.ycombinator.com/item?id=43704579">noted</a></strong>, an agent with access to the IDE&#8217;s own analysis database - navigate into functions, check API docs, validate code without full compilation - has massive potential compared to agents that can only grep and hope.</p><p>The biggest open question from the community: will JetBrains support <strong>local models</strong> (Ollama, Qwen, etc.)? The official answer for now is &#8220;no ETA, but it&#8217;s an active topic.&#8221; For enterprise customers with data sensitivity concerns, this might be a dealbreaker and very nice competitor to Open Code.</p><div><hr></div><p>And since we&#8217;re on the topic of Junie CLI, let me sneak in a personal story that ties rather nicely to the whole &#8220;agents are changing developer workflows&#8221; narrative. Because last month I went down a rabbit hole that started with &#8220;I want to run Claude Code from my iPhone&#8221; and ended... somewhere else entirely.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eWas!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffee95ba4-5821-4589-a192-bf90afec2c37_929x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eWas!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffee95ba4-5821-4589-a192-bf90afec2c37_929x1000.png 424w, https://substackcdn.com/image/fetch/$s_!eWas!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffee95ba4-5821-4589-a192-bf90afec2c37_929x1000.png 848w, https://substackcdn.com/image/fetch/$s_!eWas!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffee95ba4-5821-4589-a192-bf90afec2c37_929x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!eWas!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffee95ba4-5821-4589-a192-bf90afec2c37_929x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eWas!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffee95ba4-5821-4589-a192-bf90afec2c37_929x1000.png" width="929" height="1000" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fee95ba4-5821-4589-a192-bf90afec2c37_929x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1000,&quot;width&quot;:929,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!eWas!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffee95ba4-5821-4589-a192-bf90afec2c37_929x1000.png 424w, https://substackcdn.com/image/fetch/$s_!eWas!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffee95ba4-5821-4589-a192-bf90afec2c37_929x1000.png 848w, https://substackcdn.com/image/fetch/$s_!eWas!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffee95ba4-5821-4589-a192-bf90afec2c37_929x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!eWas!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffee95ba4-5821-4589-a192-bf90afec2c37_929x1000.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Here&#8217;s the context. The fire-and-forget pattern of agentic coding - give an AI a task, let it work, check in periodically - fundamentally changes what you need from a terminal. You don&#8217;t need to <em>write</em> code on your phone. You need to <em>supervise</em> it. Peek at progress while your daughter refuses to fall asleep unless you&#8217;re sitting next to her bed (yes, my five-year-old has strong opinions about bedtime protocol &#129335;). Confirm a decision from a train somewhere around Miech&#243;w. Glance at a build from the couch. That kind of thing.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ukiO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce97f1b2-e22b-46ce-bc08-d69466ed4148_857x1000.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ukiO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce97f1b2-e22b-46ce-bc08-d69466ed4148_857x1000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ukiO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce97f1b2-e22b-46ce-bc08-d69466ed4148_857x1000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ukiO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce97f1b2-e22b-46ce-bc08-d69466ed4148_857x1000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ukiO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce97f1b2-e22b-46ce-bc08-d69466ed4148_857x1000.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ukiO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce97f1b2-e22b-46ce-bc08-d69466ed4148_857x1000.jpeg" width="857" height="1000" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ce97f1b2-e22b-46ce-bc08-d69466ed4148_857x1000.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1000,&quot;width&quot;:857,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!ukiO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce97f1b2-e22b-46ce-bc08-d69466ed4148_857x1000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ukiO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce97f1b2-e22b-46ce-bc08-d69466ed4148_857x1000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ukiO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce97f1b2-e22b-46ce-bc08-d69466ed4148_857x1000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ukiO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce97f1b2-e22b-46ce-bc08-d69466ed4148_857x1000.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>So I built a stack: <strong>Tailscale</strong> for mesh VPN (every device gets a private 100.x.x.x IP, zero port forwarding, just works - if more technology was this invisible, half of DevOps would need new hobbies), <strong>Mosh</strong> (Mobile Shell from MIT) instead of SSH for connection resilience (UDP-based, survives network switches, local echo for instant keystroke feedback - research shows 0.33s response at 29% packet loss vs 16.8s for SSH, which is a 50x difference), <strong>tmux</strong> for persistent sessions, and <strong>Terminus</strong> on iOS as the client.</p><p>Beautiful theory. Then I launched Claude Code inside that stack and the screen turned into the Matrix after a panic attack.</p><p>The issue is fundamental: Claude Code&#8217;s TUI uses complex ANSI escape sequences - syntax coloring, box drawing, spinner animations, multi-region screen updates. Mosh synchronizes <em>snapshots of visible terminal state</em>, not the full byte stream. These two approaches simply don&#8217;t get along. I tried everything - Ctrl+l redraws (temporary fix), --output-format stream-json (works but you lose the TUI), tmux with screen-256color and escape-time 10 (marginal improvement). Pure SSH fixes the rendering but kills the connection resilience - which was the whole point.</p><p>And here&#8217;s where the plot twist happens that anyone who&#8217;s worked with technology knows well: <strong>sometimes it&#8217;s better to change the problem than to keep looking for a solution</strong>.</p><p>Junie CLI has a much simpler terminal interface. Less ANSI fanfare, less UI complexity - but what you need, works. Through Mosh, through tmux, from a phone. No artifacts, no garbled screens. The final workflow: ssh from phone triggers an auto-attach script that detects existing junie-* sessions, shows a picker menu, and either joins an existing session or creates a new one with a timestamp name. Detach with Ctrl+b d, close the laptop, attach an hour later from the phone - agent&#8217;s still working, output waiting in the session. Exactly the fire-and-forget I was after.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;42f919ef-32d0-4ce1-8294-af138010655b&quot;,&quot;duration&quot;:null}"></div><p>Is it an optimal setup? Probably not. Does it work? Yes. And in our industry, that&#8217;s sometimes the only metric that counts. And you do not need to pay for Claude Code Max &#128513;</p><p>(PS within a PS: The whole adventure of debugging Mosh + Claude Code took longer than the actual coding I wanted to do from my phone. Classic developer move &#8212; spending hours automating something you could do manually in five minutes. But at least I have notes for next time. And an article.)</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EyOK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34ab181a-2856-4bf1-8da3-42372df76e8b_1227x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EyOK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34ab181a-2856-4bf1-8da3-42372df76e8b_1227x1000.png 424w, https://substackcdn.com/image/fetch/$s_!EyOK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34ab181a-2856-4bf1-8da3-42372df76e8b_1227x1000.png 848w, https://substackcdn.com/image/fetch/$s_!EyOK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34ab181a-2856-4bf1-8da3-42372df76e8b_1227x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!EyOK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34ab181a-2856-4bf1-8da3-42372df76e8b_1227x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EyOK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34ab181a-2856-4bf1-8da3-42372df76e8b_1227x1000.png" width="1227" height="1000" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/34ab181a-2856-4bf1-8da3-42372df76e8b_1227x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1000,&quot;width&quot;:1227,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!EyOK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34ab181a-2856-4bf1-8da3-42372df76e8b_1227x1000.png 424w, https://substackcdn.com/image/fetch/$s_!EyOK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34ab181a-2856-4bf1-8da3-42372df76e8b_1227x1000.png 848w, https://substackcdn.com/image/fetch/$s_!EyOK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34ab181a-2856-4bf1-8da3-42372df76e8b_1227x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!EyOK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34ab181a-2856-4bf1-8da3-42372df76e8b_1227x1000.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><div><hr></div><p>Let&#8217;s shift gears entirely. While the AI tooling world is busy arguing about which agent is better at writing <em>your</em> code, there&#8217;s a project that&#8217;s been quietly enabling Java to run <em>on the hardware</em> that powers all those AI models. <strong>TornadoVM 3.0</strong> <strong><a href="https://github.com/beehive-lab/TornadoVM/releases/tag/v3.0.0-jdk25">landed in late February</a></strong>, and while it&#8217;s not a flashy launch, it&#8217;s a significant milestone for an important project.</p><p>For those not yet familiar (and I realize I&#8217;ve been writing about TornadoVM in this newsletter since... well, a while), here&#8217;s the pitch: TornadoVM is a plugin for OpenJDK that allows Java programs to be automatically offloaded to GPUs, FPGAs, and multi-core CPUs. It compiles Java bytecode at runtime - acting as a JIT compiler - to one of three backends: <strong>OpenCL C, NVIDIA CUDA PTX, and SPIR-V</strong>. The project comes from the <strong><a href="https://www.tornadovm.org/">Beehive Lab</a></strong> at the University of Manchester, and it supports hardware from NVIDIA, Intel, AMD, ARM, and even RISC-V.</p><p>The 3.0 release itself is primarily a maintenance milestone - bug fixes, dependency upgrades, a refactor of IntelliJ project generation, and a split of JDK 21/JDK 25 testing pipelines. Not headline material on its own. But what makes TornadoVM worth watching right now is the trajectory, not just the release.</p><p>Consider what&#8217;s been happening: version 2.0 (December 2025) brought GPU-native INT8 types for PTX and OpenCL, zero-copy native array types, FP32 to FP16 conversion across all backends, and (crucially) <strong>GPULlama3.java</strong> - a Java-native implementation of Llama 3 inference that compiles and runs on GPUs. Version 2.2 shipped just weeks later with further optimizations. And on the roadmap, there&#8217;s an <strong><a href="https://github.com/beehive-lab/TornadoVM/issues/780">open issue for CUDA Graphs support</a></strong> - which would allow TornadoVM&#8217;s TaskGraphs to be captured and replayed with minimal CPU overhead, a natural fit for iterative workloads like ML inference and physics simulations.</p><p>The reason I&#8217;m filing TornadoVM under &#8220;loosely related to AI&#8221; is that the project sits at a fascinating intersection. Java enterprises - banks, insurers, logistics companies - have decades of investment in the JVM. AI inference requires GPU compute. Today, that usually means crossing a language boundary to Python or C++. TornadoVM (along with Project Babylon/HAT, which I&#8217;ll write more about when JDK 26 drops) sketches a path where Java applications can stay in Java all the way down to the GPU kernel.</p><p>TornadoVM offers two APIs for expressing parallelism: a <strong>Loop Parallel API</strong> using @Parallel and @Reduce annotations (ideal for non-GPU-experts), and a <strong>Kernel API</strong> via KernelContext that gives you explicit thread IDs, local memory, and barriers - essentially CUDA/OpenCL-style programming in pure Java. Both can be combined in a single TaskGraph. It&#8217;s not going to replace PyTorch or CUDA in raw performance benchmarks any time soon, but for Java shops that want to offload compute-intensive workloads to GPU hardware without learning a new language stack, there&#8217;s genuinely nothing else like it in the ecosystem.</p><p>And yes, this <em>is</em> related to the AI tooling story. Because if we&#8217;re going to have a conversation about &#8220;Java in the age of AI&#8221;, it&#8217;s not just about which agent writes your Java code fastest. It&#8217;s about whether Java can be the language that <em>runs</em> the AI workload too. TornadoVM is one of the strongest arguments that it can.</p><div><hr></div><p><strong>PS:</strong> Next week is JavaOne, and I&#8217;ve already reserved vol. 167 for JDK 26 coverage - there&#8217;s going to be a lot to unpack.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!W5z6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F049a373b-9369-4c3b-b6af-bdd2971a60d2_744x299.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!W5z6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F049a373b-9369-4c3b-b6af-bdd2971a60d2_744x299.png 424w, https://substackcdn.com/image/fetch/$s_!W5z6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F049a373b-9369-4c3b-b6af-bdd2971a60d2_744x299.png 848w, https://substackcdn.com/image/fetch/$s_!W5z6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F049a373b-9369-4c3b-b6af-bdd2971a60d2_744x299.png 1272w, https://substackcdn.com/image/fetch/$s_!W5z6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F049a373b-9369-4c3b-b6af-bdd2971a60d2_744x299.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!W5z6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F049a373b-9369-4c3b-b6af-bdd2971a60d2_744x299.png" width="744" height="299" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/049a373b-9369-4c3b-b6af-bdd2971a60d2_744x299.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:299,&quot;width&quot;:744,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!W5z6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F049a373b-9369-4c3b-b6af-bdd2971a60d2_744x299.png 424w, https://substackcdn.com/image/fetch/$s_!W5z6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F049a373b-9369-4c3b-b6af-bdd2971a60d2_744x299.png 848w, https://substackcdn.com/image/fetch/$s_!W5z6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F049a373b-9369-4c3b-b6af-bdd2971a60d2_744x299.png 1272w, https://substackcdn.com/image/fetch/$s_!W5z6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F049a373b-9369-4c3b-b6af-bdd2971a60d2_744x299.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[java.evolved - Translating a Website into 8 Languages with AI Agents in One Night with Bruno Borges - JVM Weekly vol. 165]]></title><description><![CDATA[This month: AI-powered i18n at scale, 25 years of IntelliJ IDEA, Java on RISC-V, developer branding, MongoDB driver optimizations, unikernels, and Java in education.]]></description><link>https://www.jvm-weekly.com/p/javaevolved-translating-a-website</link><guid isPermaLink="false">https://www.jvm-weekly.com/p/javaevolved-translating-a-website</guid><dc:creator><![CDATA[Artur Skowronski]]></dc:creator><pubDate>Thu, 05 Mar 2026 14:03:20 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!wqzO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4e8615c-9daa-4f68-979f-8077e068e0e3_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wqzO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4e8615c-9daa-4f68-979f-8077e068e0e3_1456x1048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wqzO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4e8615c-9daa-4f68-979f-8077e068e0e3_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!wqzO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4e8615c-9daa-4f68-979f-8077e068e0e3_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!wqzO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4e8615c-9daa-4f68-979f-8077e068e0e3_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!wqzO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4e8615c-9daa-4f68-979f-8077e068e0e3_1456x1048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wqzO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4e8615c-9daa-4f68-979f-8077e068e0e3_1456x1048.png" width="1456" height="1048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d4e8615c-9daa-4f68-979f-8077e068e0e3_1456x1048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1048,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1710042,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/189863506?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4e8615c-9daa-4f68-979f-8077e068e0e3_1456x1048.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!wqzO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4e8615c-9daa-4f68-979f-8077e068e0e3_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!wqzO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4e8615c-9daa-4f68-979f-8077e068e0e3_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!wqzO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4e8615c-9daa-4f68-979f-8077e068e0e3_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!wqzO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4e8615c-9daa-4f68-979f-8077e068e0e3_1456x1048.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><blockquote><p>Year ago I announced that JVM Weekly had joined the <strong><a href="https://foojay.io">Friends of OpenJDK (Foojay.io)</a></strong> family. <strong><a href="https://foojay.io">Foojay.io</a></strong> is a dynamic, community-driven platform for OpenJDK users, primarily Java and Kotlin enthusiasts. As a hub for the &#8220;Friends of OpenJDK,&#8221; <strong><a href="https://foojay.io">Foojay.io</a></strong> gathers a rich collection of articles written by industry experts and active community members, offering valuable insights into the latest trends, tools, and practices within the OpenJDK ecosystem.</p></blockquote><p>This month&#8217;s main feature is a piece that is a follow up to what I was already men. <a href="https://www.linkedin.com/in/brunoborges/">Bruno Borges</a> from the Developer Relations team at Microsoft/GitHub published <a href="https://foojay.io/today/translating-a-website-into-8-languages-with-ai-agents-in-one-night/">a fantastic writeup on Foojay</a> about how he internationalized his <a href="https://javaevolved.github.io">java.evolved</a> website - 112 patterns across 11 categories - into 9 languages in a single night. </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h2>Translating a Website into 8 Languages with AI Agents in One Night</h2><p><em>How I used Claude Sonnet 4.6 and fleets of GitHub Copilot Coding Agents to internationalize java.evolved - from spec to deployment</em></p><p><a href="https://javaevolved.github.io">java.evolved</a> is a static site I built to showcase modern Java patterns side-by-side with their legacy equivalents. 112 patterns across 11 categories -- language, collections, streams, concurrency, and more - each with code comparisons, explanations, and curated documentation links. All generated from YAML content files by a JBang-powered Java build script.</p><p>By the end of February 25, the entire site was English-only. By the morning of February 26, it was available in <strong>9 languages</strong> - English, German, Spanish, Portuguese (Brazil), Simplified Chinese, Arabic, French, Japanese, and Korean -- with full RTL support for Arabic. The total human effort was a few hours of prompting, reviewing PRs, and filing one bug.</p><p>This is the story of that experiment.</p><h3>The Architecture Decision: Let the AI Draft the Spec</h3><p>The first step wasn&#8217;t writing code. It was writing a specification.</p><p>I opened <a href="https://github.com/javaevolved/javaevolved.github.io/issues/74">issue #74</a> - &#8220;Plan architectural change for i18n&#8221; - and assigned it to a Copilot Coding Agent. The prompt was simple: propose an architectural plan for internationalizing the website, considering the existing static-site structure.</p><p>The agent (<a href="https://github.com/javaevolved/javaevolved.github.io/pull/75">PR #75</a>) came back with a comprehensive i18n specification that addressed:</p><ul><li><p><strong>Two-layer translation model:</strong> UI strings (labels, nav, footer) separated from content translations (pattern titles, explanations, summaries)</p></li><li><p><strong>Partial translation files:</strong> Translation files contain <em>only</em> translatable fields. Structural data (code snippets, navigation links, metadata) always comes from the English source of truth</p></li><li><p><strong>Graceful fallback:</strong> Missing translations fall back to English with a build-time warning -- no page is ever blank</p></li><li><p><strong>Locale registry:</strong> A simple <code>locales.properties</code> file drives the entire build pipeline and language selector</p></li><li><p><strong>AI-friendly design:</strong> The architecture was explicitly designed so that an AI receives the full English content and returns a partial translation file -- no field-filtering logic needed in the prompt</p></li></ul><p>This last point proved prescient. The clean separation between &#8220;what changes per locale&#8221; and &#8220;what stays constant&#8221; meant each translation task was self-contained and parallelizable.</p><p>After iterating through review comments over 5 days (the original PR had 12 comments of back-and-forth), the spec was merged on February 25.</p><h3>Phase 1: Building the Infrastructure</h3><p>With the spec in hand, I coordinated an agent locally with Copilot CLI to implement the core i18n infrastructure in <a href="https://github.com/javaevolved/javaevolved.github.io/pull/83">PR #83</a> - the generator changes that made everything locale-aware:</p><ul><li><p>The <code>generate.java</code> build script learned to iterate all locales from <code>locales.properties</code></p></li><li><p>Template tokens like <code>{{sections.codeComparison}}</code> replaced hard-coded English strings</p></li><li><p><code>hreflang</code> meta tags, a locale picker dropdown, and client-side locale detection were added</p></li><li><p>The <code>resolveSnippet</code> function loads translated content overlaid onto the English base, falling back gracefully when a translation doesn&#8217;t exist</p></li></ul><p>This was the only PR that required significant intervention. Everything after it was delegation.</p><h3>Phase 2: The First Translations (Spanish + Portuguese)</h3><p>The first real translation - Spanish - came in <a href="https://github.com/javaevolved/javaevolved.github.io/pull/84">PR #84</a>. This PR also migrated the English content files from JSON to YAML for improved readability -- a format change that the AI handled naturally since the generator already supported multiple formats.</p><p>Brazilian Portuguese followed immediately in <a href="https://github.com/javaevolved/javaevolved.github.io/pull/85">PR #85</a>, completing all 112 pattern files. These first two translations validated the architecture and surfaced a CI issue: the deploy workflow&#8217;s path triggers didn&#8217;t match YAML files or the <code>translations/</code> directory. A quick fix in <a href="https://github.com/javaevolved/javaevolved.github.io/pull/86">PR #86</a> resolved that.</p><h3>Phase 3: The Fleet - 6 Languages in Parallel</h3><p>This is where things got interesting. With the architecture proven and two complete translations validated, I launched a <strong>fleet of Copilot Coding Agents</strong> -- multiple agents working in parallel, each assigned a single language. I used the Copilot CLI <code>/delegate</code> command to dispatch them asynchronously, all with the same prompt:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1PRB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe010c524-a2cc-4091-af9b-8b6e6c78191a_1426x455.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1PRB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe010c524-a2cc-4091-af9b-8b6e6c78191a_1426x455.png 424w, https://substackcdn.com/image/fetch/$s_!1PRB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe010c524-a2cc-4091-af9b-8b6e6c78191a_1426x455.png 848w, https://substackcdn.com/image/fetch/$s_!1PRB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe010c524-a2cc-4091-af9b-8b6e6c78191a_1426x455.png 1272w, https://substackcdn.com/image/fetch/$s_!1PRB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe010c524-a2cc-4091-af9b-8b6e6c78191a_1426x455.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1PRB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe010c524-a2cc-4091-af9b-8b6e6c78191a_1426x455.png" width="1426" height="455" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e010c524-a2cc-4091-af9b-8b6e6c78191a_1426x455.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:455,&quot;width&quot;:1426,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:86781,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/189863506?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe010c524-a2cc-4091-af9b-8b6e6c78191a_1426x455.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1PRB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe010c524-a2cc-4091-af9b-8b6e6c78191a_1426x455.png 424w, https://substackcdn.com/image/fetch/$s_!1PRB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe010c524-a2cc-4091-af9b-8b6e6c78191a_1426x455.png 848w, https://substackcdn.com/image/fetch/$s_!1PRB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe010c524-a2cc-4091-af9b-8b6e6c78191a_1426x455.png 1272w, https://substackcdn.com/image/fetch/$s_!1PRB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe010c524-a2cc-4091-af9b-8b6e6c78191a_1426x455.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Each agent independently:</p><ol><li><p>Read the i18n spec and understood the file structure</p></li><li><p>Created a UI strings YAML file with 60+ translated keys</p></li><li><p>Generated 112 content translation YAML files -- one per pattern, across all 11 categories</p></li><li><p>Registered the locale in <code>locales.properties</code></p></li><li><p>Opened a PR with a detailed description of what was translated</p></li></ol><p>All six PRs were opened within a span of about 12 minutes (2:33 AM to 2:45 AM) and were all merged within the next hour. <strong>No translation conflicts</strong>, no merge issues, no structural errors.</p><h3>The Numbers</h3><p>By the time the fleet finished:</p><ul><li><p><strong>8 locales</strong> fully supported (besides English)</p></li><li><p><strong>112 patterns x 8 translated locales = 896 content translation files</strong></p></li><li><p><strong>8 UI string files</strong> with 60+ keys each</p></li><li><p><strong>~1,008 generated HTML pages</strong> (112 pages x 8 locales)</p></li><li><p><strong>8 localized search indexes</strong> (<code>snippets.json</code> per locale)</p></li></ul><h3>The Arabic Surprise: RTL Support</h3><p>The most impressive moment was the Arabic translation (<a href="https://github.com/javaevolved/javaevolved.github.io/pull/91">PR #91</a>). The agent not only translated, it also noted that Arabic is a right-to-left language and <strong>proactively added RTL infrastructure</strong>:</p><ul><li><p>Added <code>dir="{{htmlDir}}"</code> to the <code>&lt;html&gt;</code> tag in both templates</p></li><li><p>Modified the generator to resolve <code>htmlDir</code> to <code>"rtl"</code> for Arabic and <code>"ltr"</code> for all other locales</p></li><li><p>Updated the Python benchmark generator to pass the new token</p></li></ul><p>This was a genuinely thoughtful architectural change that I hadn&#8217;t explicitly requested. The agent understood that Arabic support implies RTL layout and acted on it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fQNb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cc442d4-54ac-48f2-8d62-d92abdf8a673_845x639.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fQNb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cc442d4-54ac-48f2-8d62-d92abdf8a673_845x639.png 424w, https://substackcdn.com/image/fetch/$s_!fQNb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cc442d4-54ac-48f2-8d62-d92abdf8a673_845x639.png 848w, https://substackcdn.com/image/fetch/$s_!fQNb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cc442d4-54ac-48f2-8d62-d92abdf8a673_845x639.png 1272w, https://substackcdn.com/image/fetch/$s_!fQNb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cc442d4-54ac-48f2-8d62-d92abdf8a673_845x639.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fQNb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cc442d4-54ac-48f2-8d62-d92abdf8a673_845x639.png" width="845" height="639" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9cc442d4-54ac-48f2-8d62-d92abdf8a673_845x639.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:639,&quot;width&quot;:845,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Arabic localization on the Java Evolved website&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Arabic localization on the Java Evolved website" title="Arabic localization on the Java Evolved website" srcset="https://substackcdn.com/image/fetch/$s_!fQNb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cc442d4-54ac-48f2-8d62-d92abdf8a673_845x639.png 424w, https://substackcdn.com/image/fetch/$s_!fQNb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cc442d4-54ac-48f2-8d62-d92abdf8a673_845x639.png 848w, https://substackcdn.com/image/fetch/$s_!fQNb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cc442d4-54ac-48f2-8d62-d92abdf8a673_845x639.png 1272w, https://substackcdn.com/image/fetch/$s_!fQNb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cc442d4-54ac-48f2-8d62-d92abdf8a673_845x639.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>The One Bug</h3><p>Of course, it wasn&#8217;t perfect. When <code>dir="rtl"</code> is applied globally, the browser flips <em>everything</em> -- including Java source code blocks and the navigation bar, which should always be LTR regardless of locale. I spotted this when reviewing the deployed site and <a href="https://github.com/javaevolved/javaevolved.github.io/issues/96">filed issue #96</a>.</p><p>A Copilot Coding Agent <a href="https://github.com/javaevolved/javaevolved.github.io/pull/97">fixed it in PR #97</a> within minutes, adding targeted CSS overrides. Arabic prose continues to render RTL. Java code stays LTR. One bug, one issue, one PR, fixed in minutes.</p><pre><code><code>[dir="rtl"] nav,
[dir="rtl"] .nav-inner {
  direction: ltr;
}

[dir="rtl"] pre,
[dir="rtl"] code,
[dir="rtl"] .code-text,
[dir="rtl"] .card-code,
[dir="rtl"] .compare-code {
  direction: ltr;
  text-align: left;
  unicode-bidi: embed;
}</code></code></pre><h3>Why It Worked: Architecture as Force Multiplier</h3><p>This experiment succeeded because of deliberate architectural decisions, not just because of a magic AI prompt:</p><p><strong>Source of Truth Separation</strong> -- Content files contain both translatable text and structural data. But translation files contain <em>only</em> the translatable fields. The generator overlays translations onto the English base at build time. AI agents can&#8217;t accidentally modify code snippets or break navigation.</p><p><strong>Partial File Fallback</strong> -- If a pattern has no translation file for a locale, the site shows the English content with an &#8220;untranslated&#8221; banner. Partial translations are always valid. New patterns added in English are immediately visible in all locales.</p><p><strong>Convention Over Configuration</strong> -- Each locale follows the same directory structure. Adding a new language is a checklist: add a line to <code>locales.properties</code>, create the strings file, create content files. No code changes needed in the generator.</p><h3>Lessons Learned</h3><p><strong>What Went Well:</strong></p><ul><li><p><strong>Spec-first approach:</strong> Having the AI draft the specification before any implementation meant the architecture was explicitly designed for AI-driven translation from day one</p></li><li><p><strong>Fleet parallelism:</strong> Six language translations running simultaneously with zero conflicts demonstrates that well-isolated task boundaries enable effortless parallelization</p></li><li><p><strong>Proactive problem-solving:</strong> The Arabic agent identifying and implementing RTL support without being explicitly asked shows that LLMs can reason about downstream implications</p></li><li><p><strong>Technical term preservation:</strong> Across all 9 languages, Java API names, annotations, JDK versions, and code examples were correctly left in English</p></li></ul><p><strong>What Required Human Intervention:</strong></p><ul><li><p><strong>One bug:</strong> The RTL global flip affecting code blocks</p></li><li><p><strong>CI pipeline fixes:</strong> The deploy workflow needed path trigger updates</p></li><li><p><strong>Review and merge:</strong> Each PR needed a human to review and merge</p></li></ul><p>The java.evolved project is open source at <a href="https://github.com/javaevolved/javaevolved.github.io">github.com/javaevolved/javaevolved.github.io</a>. The i18n specification lives at <code>specs/i18n/i18n-spec.md</code>.</p><h3>The Timeline</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EqiE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F955705eb-d376-4953-8499-e2a29ba7ecce_1015x717.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EqiE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F955705eb-d376-4953-8499-e2a29ba7ecce_1015x717.png 424w, https://substackcdn.com/image/fetch/$s_!EqiE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F955705eb-d376-4953-8499-e2a29ba7ecce_1015x717.png 848w, https://substackcdn.com/image/fetch/$s_!EqiE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F955705eb-d376-4953-8499-e2a29ba7ecce_1015x717.png 1272w, https://substackcdn.com/image/fetch/$s_!EqiE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F955705eb-d376-4953-8499-e2a29ba7ecce_1015x717.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EqiE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F955705eb-d376-4953-8499-e2a29ba7ecce_1015x717.png" width="1015" height="717" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/955705eb-d376-4953-8499-e2a29ba7ecce_1015x717.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:717,&quot;width&quot;:1015,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:158494,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/189863506?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F955705eb-d376-4953-8499-e2a29ba7ecce_1015x717.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!EqiE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F955705eb-d376-4953-8499-e2a29ba7ecce_1015x717.png 424w, https://substackcdn.com/image/fetch/$s_!EqiE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F955705eb-d376-4953-8499-e2a29ba7ecce_1015x717.png 848w, https://substackcdn.com/image/fetch/$s_!EqiE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F955705eb-d376-4953-8499-e2a29ba7ecce_1015x717.png 1272w, https://substackcdn.com/image/fetch/$s_!EqiE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F955705eb-d376-4953-8499-e2a29ba7ecce_1015x717.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>Conclusion</strong></h2><p>The experiment proved a simple thesis: <strong>if you design your architecture for AI-driven workflows, AI agents can do remarkable things.</strong></p><p>I didn&#8217;t build a custom translation pipeline or prompt-engineering framework. I wrote a specification. An AI agent drafted it, I refined it through code review, and then a fleet of agents executed against it. The architecture - partial files, fallback behavior, source-of-truth separation - did all the heavy lifting.</p><p>The result is a Java patterns reference site available in 8 languages, with 1,008 generated pages, serving developers who speak English, German, Spanish, Portuguese, Chinese, Arabic, French, and Korean. It handles right-to-left layouts. It has localized search. Every page has proper <code>hreflang</code> tags for SEO.</p><p>And the only bug was a CSS rule that took 13 minutes from report to fix.</p><p>The future isn&#8217;t AI replacing developers. It&#8217;s developers designing systems that let AI do what it&#8217;s good at - repetitive, structured, parallelizable work - while humans focus on architecture, review, and the occasional RTL bug.</p><div><hr></div><p><em>java.evolved is open source at <a href="https://github.com/javaevolved/javaevolved.github.io">github.com/javaevolved/javaevolved.github.io</a>. The i18n specification lives at <a href="https://github.com/javaevolved/javaevolved.github.io/blob/main/specs/i18n/i18n-spec.md">specs/i18n/i18n-spec.md</a>.</em></p><div><hr></div><blockquote><p><strong>My take:</strong> This article is a nice example of what I keep calling <em>&#8220;engineering-first AI usage.&#8221;</em> Bruno didn&#8217;t just throw prompts at a wall -- he made the AI <strong>draft an architecture</strong> that was explicitly designed for parallelized, agent-driven work. The spec-first approach, the partial-file design, the convention-over-configuration pattern - all of this is what separates &#8220;vibe coding&#8221; from what I&#8217;d call &#8220;vibe engineering.&#8221; The architecture <em>is</em> the prompt, in a sense.</p><p>What&#8217;s particularly interesting from the JVM perspective is that the entire build pipeline is powered by JBang - a single <code>generate.java</code> script that handles locale iteration, template resolution, and content overlay. No Maven, no Gradle, just JBang doing what it does best: making Java scripts feel as natural as shell scripts. Between this and the java.evolved project itself (which is a fantastic community resource for showcasing modern Java), Bruno keeps proving that Java&#8217;s developer experience has come a <em>long</em> way.</p><p>Also - 896 translation files, zero merge conflicts, in one night. The &#8220;fleet&#8221; pattern of dispatching multiple agents in parallel is something I expect we&#8217;ll see a lot more of. </p><p>Oh, and one more thing - inspired by Bruno&#8217;s work, I went ahead and did the Polish translation myself. It&#8217;s live at <a href="https://javaevolved.github.io/pl/">javaevolved.github.io/pl/</a>. Poland Strong.</p></blockquote><div><hr></div><h2>Also on Foojay This Month</h2><div id="youtube2-Bi3wLP5ZCWw" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;Bi3wLP5ZCWw&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/Bi3wLP5ZCWw?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p><strong><a href="https://foojay.io/today/foojay-podcast-91/">Foojay Podcast #91: 25 Years of IntelliJ IDEA: The IDE That Grew Up With Java</a></strong> - <a href="https://www.linkedin.com/in/frankdelporte/">Frank Delporte</a> celebrates a quarter century of IntelliJ IDEA with guests from the JetBrains team - <a href="https://www.linkedin.com/in/maritvandijk/">Marit van Dijk</a> and <a href="https://www.linkedin.com/in/antonarhipov/overlay/about-this-profile/">Anton Arhipov</a>. From the early days of revolutionary code completion to AI-powered features and the recent unified Community/Ultimate release - a great retrospective.</p><p>As someone deeply embedded in the JetBrains/Kotlin ecosystem (which probably surprises no one at this point), I always have a soft spot for the 'behind the scenes' stories - how IntelliJ evolved alongside Java itself. Highly recommend watching this one, as I've been following this story through pretty much my entire career, and I have to say, it's one of those tales that never gets old &#128513;</p><div><hr></div><h3><strong><a href="https://foojay.io/today/i-got-java-25-running-on-the-risc-v-beagleboard-beaglev-fire/">I Got Java 25 Running on the RISC-V BeagleBoard BeagleV-Fire</a></strong> </h3><p>by <a href="https://www.linkedin.com/in/frankdelporte/">Frank Delporte</a> </p><p>Frank continues his 2026 single-board computer testing plan and successfully gets Java 25 running on RISC-V hardware. The key was updating the OS via BeagleBoard Imaging Utility (the BeagleV-Fire uses eMMC, not SD cards like Raspberry Pi). Once on Ubuntu 24, Java 25 installed via standard <code>apt</code>. Even SDKMAN and JBang work. Exciting times for Java on RISC-V - after experimenting with Arm last year, I need to play with this a bit.</p><div><hr></div><h3><strong><a href="https://foojay.io/today/watch-the-recording-diy-technical-marketing-for-java-developers/">Watch the Recording: DIY Technical Marketing for Java Developers</a></strong> </h3><p>by <a href="https://www.linkedin.com/in/dominikatasarz/">Dominika Tasarz-Sochacka</a> from Payara</p><div id="youtube2-6orjtcu3Dhw" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;6orjtcu3Dhw&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/6orjtcu3Dhw?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p> A Jfokus 2026 talk about personal branding for developers. I was at the session and loved it. Great stuff! The core message - that small, intentional actions make a real difference for your career visibility without turning it into a full-time job - really resonated. Highly recommended for anyone who writes code for a living but hasn&#8217;t started writing <em>about</em> code yet.</p><div><hr></div><h3><strong><a href="https://foojay.io/today/optimizing-the-mongodb-java-driver-how-minor-optimizations-led-to-macro-gains/">Optimizing the MongoDB Java Driver: How Minor Optimizations Led to Macro Gains</a></strong> </h3><p>by <a href="https://www.linkedin.com/in/nasir-qureshi/">Nasir Qureshi</a> and Slab Babanin </p><p>The MongoDB Java team shares how they achieved throughput improvements between 20% and over 90% in specific workloads. Techniques include JVM intrinsics, SWAR (SIMD Within A Register) for null-terminator detection in BSON, caching BSON array indexes, and eliminating redundant invariant checks. The guiding principle: &#8220;never guess, always measure.&#8221; </p><p>The largest improvement - +96.46% in <code>Large doc Collection BulkWrite insert</code> - is jaw-dropping. A truly excellent deep-dive into low-level Java performance.</p><div><hr></div><h3><strong><a href="https://foojay.io/today/unikernel-profiling-and-troubleshooting-jvm-on-nanos-unikernel/">Unikernel: Profiling and Troubleshooting JVM on Nanos Unikernel</a></strong> </h3><p>by <a href="https://www.linkedin.com/in/angelo-rubini-1754379/">Angelo Rubini</a> </p><p>Can you profile a Java application running inside a unikernel with standard JVM tools? The answer is yes. Angelo walks through profiling a Quarkus application on Nanos unikernel using JProfiler and IBM Semeru JRE 25 (OpenJ9). </p><p>No special hacks - just standard JVMTI agent loading. Unikernels continue to be one of the most underexplored deployment targets for Java, and this article does a lot to demystify the operational side.</p><div><hr></div><h3><strong><a href="https://foojay.io/today/bringing-java-closer-to-education-a-community-driven-initiative/">Bringing Java Closer to Education: A Community-Driven Initiative</a></strong> </h3><p>by <a href="https://www.linkedin.com/in/igfasouza/">Igor De Souza</a> </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9dw4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaea0ebd-4950-40cf-bc3f-bffb45511a9b_886x346.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9dw4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaea0ebd-4950-40cf-bc3f-bffb45511a9b_886x346.png 424w, https://substackcdn.com/image/fetch/$s_!9dw4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaea0ebd-4950-40cf-bc3f-bffb45511a9b_886x346.png 848w, https://substackcdn.com/image/fetch/$s_!9dw4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaea0ebd-4950-40cf-bc3f-bffb45511a9b_886x346.png 1272w, https://substackcdn.com/image/fetch/$s_!9dw4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaea0ebd-4950-40cf-bc3f-bffb45511a9b_886x346.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9dw4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaea0ebd-4950-40cf-bc3f-bffb45511a9b_886x346.png" width="886" height="346" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/faea0ebd-4950-40cf-bc3f-bffb45511a9b_886x346.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:346,&quot;width&quot;:886,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:73413,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/189863506?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaea0ebd-4950-40cf-bc3f-bffb45511a9b_886x346.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!9dw4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaea0ebd-4950-40cf-bc3f-bffb45511a9b_886x346.png 424w, https://substackcdn.com/image/fetch/$s_!9dw4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaea0ebd-4950-40cf-bc3f-bffb45511a9b_886x346.png 848w, https://substackcdn.com/image/fetch/$s_!9dw4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaea0ebd-4950-40cf-bc3f-bffb45511a9b_886x346.png 1272w, https://substackcdn.com/image/fetch/$s_!9dw4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaea0ebd-4950-40cf-bc3f-bffb45511a9b_886x346.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A heartfelt piece about the <a href="https://github.com/foojayio/java-education-catalog">Java Education Catalog</a> on GitHub - a community-driven effort to gather, organize, and curate Java educational materials in one accessible place, especially for Raspberry Pi and physical computing contexts. The initiative grew out of conversations in the Code Club Slack, and Igor recently discussed it on Foojay Podcast #85. A wonderful example of community organizing that goes beyond code.</p><div><hr></div><p>And it&#8217;s all, folks.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LK1o!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54a18cc4-0aa0-4866-b666-ea76fa025280_1486x987.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LK1o!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54a18cc4-0aa0-4866-b666-ea76fa025280_1486x987.png 424w, https://substackcdn.com/image/fetch/$s_!LK1o!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54a18cc4-0aa0-4866-b666-ea76fa025280_1486x987.png 848w, https://substackcdn.com/image/fetch/$s_!LK1o!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54a18cc4-0aa0-4866-b666-ea76fa025280_1486x987.png 1272w, https://substackcdn.com/image/fetch/$s_!LK1o!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54a18cc4-0aa0-4866-b666-ea76fa025280_1486x987.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LK1o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54a18cc4-0aa0-4866-b666-ea76fa025280_1486x987.png" width="1456" height="967" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/54a18cc4-0aa0-4866-b666-ea76fa025280_1486x987.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:967,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2148799,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/189863506?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54a18cc4-0aa0-4866-b666-ea76fa025280_1486x987.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!LK1o!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54a18cc4-0aa0-4866-b666-ea76fa025280_1486x987.png 424w, https://substackcdn.com/image/fetch/$s_!LK1o!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54a18cc4-0aa0-4866-b666-ea76fa025280_1486x987.png 848w, https://substackcdn.com/image/fetch/$s_!LK1o!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54a18cc4-0aa0-4866-b666-ea76fa025280_1486x987.png 1272w, https://substackcdn.com/image/fetch/$s_!LK1o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54a18cc4-0aa0-4866-b666-ea76fa025280_1486x987.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[The Rest of the Story: February Edition - JVM Weekly vol. 164]]></title><description><![CDATA[Welcome to the February edition of &#8220;Rest of the Story&#8221; - our traditional review of what&#8217;s been happening in the JVM ecosystem beyond the main headlines.]]></description><link>https://www.jvm-weekly.com/p/the-rest-of-the-story-february-edition</link><guid isPermaLink="false">https://www.jvm-weekly.com/p/the-rest-of-the-story-february-edition</guid><dc:creator><![CDATA[Artur Skowronski]]></dc:creator><pubDate>Thu, 26 Feb 2026 14:03:13 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!i6eu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F453a60de-2b23-4c09-a821-2e173f49a131_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!i6eu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F453a60de-2b23-4c09-a821-2e173f49a131_1456x1048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!i6eu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F453a60de-2b23-4c09-a821-2e173f49a131_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!i6eu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F453a60de-2b23-4c09-a821-2e173f49a131_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!i6eu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F453a60de-2b23-4c09-a821-2e173f49a131_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!i6eu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F453a60de-2b23-4c09-a821-2e173f49a131_1456x1048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!i6eu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F453a60de-2b23-4c09-a821-2e173f49a131_1456x1048.png" width="1456" height="1048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/453a60de-2b23-4c09-a821-2e173f49a131_1456x1048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1048,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1838977,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/189238995?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F453a60de-2b23-4c09-a821-2e173f49a131_1456x1048.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!i6eu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F453a60de-2b23-4c09-a821-2e173f49a131_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!i6eu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F453a60de-2b23-4c09-a821-2e173f49a131_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!i6eu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F453a60de-2b23-4c09-a821-2e173f49a131_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!i6eu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F453a60de-2b23-4c09-a821-2e173f49a131_1456x1048.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>This time we have plenty of material: from a fascinating interview with Kotlin&#8217;s creator, through a groundbreaking change in Minecraft, to a whole wave of new projects proving that Java UI is in much better shape than anyone would expect. Let&#8217;s dive in!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2><strong>1. February: The Rest of the Story</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fttm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd3acac-266f-4f11-a08f-d14483034eac_863x573.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fttm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd3acac-266f-4f11-a08f-d14483034eac_863x573.png 424w, https://substackcdn.com/image/fetch/$s_!fttm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd3acac-266f-4f11-a08f-d14483034eac_863x573.png 848w, https://substackcdn.com/image/fetch/$s_!fttm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd3acac-266f-4f11-a08f-d14483034eac_863x573.png 1272w, https://substackcdn.com/image/fetch/$s_!fttm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd3acac-266f-4f11-a08f-d14483034eac_863x573.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fttm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd3acac-266f-4f11-a08f-d14483034eac_863x573.png" width="863" height="573" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6fd3acac-266f-4f11-a08f-d14483034eac_863x573.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:573,&quot;width&quot;:863,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!fttm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd3acac-266f-4f11-a08f-d14483034eac_863x573.png 424w, https://substackcdn.com/image/fetch/$s_!fttm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd3acac-266f-4f11-a08f-d14483034eac_863x573.png 848w, https://substackcdn.com/image/fetch/$s_!fttm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd3acac-266f-4f11-a08f-d14483034eac_863x573.png 1272w, https://substackcdn.com/image/fetch/$s_!fttm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd3acac-266f-4f11-a08f-d14483034eac_863x573.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p><strong><a href="https://www.linkedin.com/in/gergelyorosz/">Gergely Orosz</a></strong> on his <strong><a href="https://newsletter.pragmaticengineer.com/p/the-programming-language-after-kotlin">Pragmatic Engineer podcast</a></strong> conducted an extensive interview with <strong><a href="https://www.linkedin.com/in/abreslav/">Andrey Breslav</a></strong>, the creator of Kotlin and founder of CodeSpeak. The conversation is a goldmine of little-known facts about Kotlin&#8217;s history - for example, that the first version of Kotlin wasn&#8217;t a compiler but an IDE plugin, that the initial team consisted mainly of fresh graduates, or that smart casts were inspired by the obscure language Gosu.</p><p>But the most interesting thread concerns the future. Breslav is now building CodeSpeak - a new programming language designed to reduce boilerplate by replacing trivial code with concise natural language descriptions. The motivation? Keeping humans in control of the software development cycle in the age of LLM agents. As he put it - in the future, engineers will still be building complex systems, and it&#8217;s worth remembering that, even if Twitter is trying to convince us otherwise (heh).</p><div><hr></div><p><strong><a href="https://www.linkedin.com/company/moderneinc/">Moderne</a></strong> announced that their OpenRewrite platform - known primarily in the Java ecosystem as a tool for automatic code refactoring - <strong><a href="https://www.moderne.ai/blog/semantic-code-analysis-for-python">officially now supports Python</a></strong>. Python code can now be parsed, analyzed, and transformed alongside Java and JavaScript within the same Lossless Semantic Tree (LST).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZLRn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7de67b47-e1a9-47a3-8d22-cfe25c63fd91_795x962.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZLRn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7de67b47-e1a9-47a3-8d22-cfe25c63fd91_795x962.png 424w, https://substackcdn.com/image/fetch/$s_!ZLRn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7de67b47-e1a9-47a3-8d22-cfe25c63fd91_795x962.png 848w, https://substackcdn.com/image/fetch/$s_!ZLRn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7de67b47-e1a9-47a3-8d22-cfe25c63fd91_795x962.png 1272w, https://substackcdn.com/image/fetch/$s_!ZLRn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7de67b47-e1a9-47a3-8d22-cfe25c63fd91_795x962.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZLRn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7de67b47-e1a9-47a3-8d22-cfe25c63fd91_795x962.png" width="795" height="962" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7de67b47-e1a9-47a3-8d22-cfe25c63fd91_795x962.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:962,&quot;width&quot;:795,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!ZLRn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7de67b47-e1a9-47a3-8d22-cfe25c63fd91_795x962.png 424w, https://substackcdn.com/image/fetch/$s_!ZLRn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7de67b47-e1a9-47a3-8d22-cfe25c63fd91_795x962.png 848w, https://substackcdn.com/image/fetch/$s_!ZLRn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7de67b47-e1a9-47a3-8d22-cfe25c63fd91_795x962.png 1272w, https://substackcdn.com/image/fetch/$s_!ZLRn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7de67b47-e1a9-47a3-8d22-cfe25c63fd91_795x962.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>Why does this matter for us JVM folks? Because modern systems rarely evolve in isolation. A Java service might expose an API consumed by a Python integration, a shared dependency might appear in backend services, frontend tooling, and automation scripts. With Python in the LST, dependency upgrades can be coordinated in a single campaign across multiple languages.</p><p>An interesting extension to the mission of one of the JVM ecosystem&#8217;s most important tools.</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Uop-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a8fbe6a-bb34-4774-836a-a5268ebf85b4_1024x683.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Uop-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a8fbe6a-bb34-4774-836a-a5268ebf85b4_1024x683.png 424w, https://substackcdn.com/image/fetch/$s_!Uop-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a8fbe6a-bb34-4774-836a-a5268ebf85b4_1024x683.png 848w, https://substackcdn.com/image/fetch/$s_!Uop-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a8fbe6a-bb34-4774-836a-a5268ebf85b4_1024x683.png 1272w, https://substackcdn.com/image/fetch/$s_!Uop-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a8fbe6a-bb34-4774-836a-a5268ebf85b4_1024x683.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Uop-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a8fbe6a-bb34-4774-836a-a5268ebf85b4_1024x683.png" width="1024" height="683" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3a8fbe6a-bb34-4774-836a-a5268ebf85b4_1024x683.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:683,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!Uop-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a8fbe6a-bb34-4774-836a-a5268ebf85b4_1024x683.png 424w, https://substackcdn.com/image/fetch/$s_!Uop-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a8fbe6a-bb34-4774-836a-a5268ebf85b4_1024x683.png 848w, https://substackcdn.com/image/fetch/$s_!Uop-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a8fbe6a-bb34-4774-836a-a5268ebf85b4_1024x683.png 1272w, https://substackcdn.com/image/fetch/$s_!Uop-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a8fbe6a-bb34-4774-836a-a5268ebf85b4_1024x683.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p><strong><a href="https://www.linkedin.com/in/igfasouza/">Igor Souza</a></strong> wrote a <strong><a href="https://foojay.io/today/the-triforce-that-slays-legacy-java-myths-happy-40th-zelda/">fun article celebrating the 40th anniversary of Legend of Zelda</a></strong>, comparing the triangle of performance improvements in Java 25 to the legendary Triforce. The analogy connects three key improvements: optimized class caching (AOT caching) for faster startup, Compact Object Headers for more efficient memory use, and garbage collection improvements. Java &#8220;Power, Wisdom, Courage&#8221; - genuinely a lovely connection with gaming lore.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oOKC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62a812e1-58fb-4ab2-a5f1-70e5be66b310_1333x1000.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oOKC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62a812e1-58fb-4ab2-a5f1-70e5be66b310_1333x1000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!oOKC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62a812e1-58fb-4ab2-a5f1-70e5be66b310_1333x1000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!oOKC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62a812e1-58fb-4ab2-a5f1-70e5be66b310_1333x1000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!oOKC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62a812e1-58fb-4ab2-a5f1-70e5be66b310_1333x1000.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oOKC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62a812e1-58fb-4ab2-a5f1-70e5be66b310_1333x1000.jpeg" width="1333" height="1000" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/62a812e1-58fb-4ab2-a5f1-70e5be66b310_1333x1000.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1000,&quot;width&quot;:1333,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!oOKC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62a812e1-58fb-4ab2-a5f1-70e5be66b310_1333x1000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!oOKC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62a812e1-58fb-4ab2-a5f1-70e5be66b310_1333x1000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!oOKC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62a812e1-58fb-4ab2-a5f1-70e5be66b310_1333x1000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!oOKC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62a812e1-58fb-4ab2-a5f1-70e5be66b310_1333x1000.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Maybe not my favourite series, but I had a lot of fun with some of the editon. Happy Birthday, Link!</figcaption></figure></div><div><hr></div><p>Continuing the video games related topics, big news from the gamedev side of JVM - <strong><a href="https://www.gamingonlinux.com/2026/02/minecraft-java-is-switching-from-opengl-to-vulkan-for-the-vibrant-visuals-update/">Mojang announced</a></strong> that Minecraft Java Edition is switching from OpenGL to Vulkan as part of the upcoming &#8220;Vibrant Visuals&#8221; update. This is a massive change for one of the most popular games written in Java. The goal is both visual improvements and better performance. Mojang confirmed that the game will still support macOS and Linux (on macOS through a translation layer, since Apple doesn&#8217;t natively support Vulkan).</p><p>Interestingly, this is probably the first Java game to use Vulkan. Modders should start preparing for the migration - moving away from OpenGL will require more effort than a typical update. Snapshots with Vulkan alongside OpenGL are expected &#8220;sometime in summer,&#8221; with the ability to switch between them until things stabilize.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BAKi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f03c3d-3d8e-4155-83ff-bb8d2c662304_716x378.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BAKi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f03c3d-3d8e-4155-83ff-bb8d2c662304_716x378.png 424w, https://substackcdn.com/image/fetch/$s_!BAKi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f03c3d-3d8e-4155-83ff-bb8d2c662304_716x378.png 848w, https://substackcdn.com/image/fetch/$s_!BAKi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f03c3d-3d8e-4155-83ff-bb8d2c662304_716x378.png 1272w, https://substackcdn.com/image/fetch/$s_!BAKi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f03c3d-3d8e-4155-83ff-bb8d2c662304_716x378.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BAKi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f03c3d-3d8e-4155-83ff-bb8d2c662304_716x378.png" width="716" height="378" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d8f03c3d-3d8e-4155-83ff-bb8d2c662304_716x378.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:378,&quot;width&quot;:716,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!BAKi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f03c3d-3d8e-4155-83ff-bb8d2c662304_716x378.png 424w, https://substackcdn.com/image/fetch/$s_!BAKi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f03c3d-3d8e-4155-83ff-bb8d2c662304_716x378.png 848w, https://substackcdn.com/image/fetch/$s_!BAKi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f03c3d-3d8e-4155-83ff-bb8d2c662304_716x378.png 1272w, https://substackcdn.com/image/fetch/$s_!BAKi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f03c3d-3d8e-4155-83ff-bb8d2c662304_716x378.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>PS: I started to introduce my daughter to Minecraft &#10084;&#65039; Fun time.</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mgAj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2dd9224-0bc0-4332-a44d-a1f37ebe8cf9_1488x837.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mgAj!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2dd9224-0bc0-4332-a44d-a1f37ebe8cf9_1488x837.gif 424w, https://substackcdn.com/image/fetch/$s_!mgAj!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2dd9224-0bc0-4332-a44d-a1f37ebe8cf9_1488x837.gif 848w, https://substackcdn.com/image/fetch/$s_!mgAj!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2dd9224-0bc0-4332-a44d-a1f37ebe8cf9_1488x837.gif 1272w, https://substackcdn.com/image/fetch/$s_!mgAj!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2dd9224-0bc0-4332-a44d-a1f37ebe8cf9_1488x837.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mgAj!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2dd9224-0bc0-4332-a44d-a1f37ebe8cf9_1488x837.gif" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a2dd9224-0bc0-4332-a44d-a1f37ebe8cf9_1488x837.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!mgAj!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2dd9224-0bc0-4332-a44d-a1f37ebe8cf9_1488x837.gif 424w, https://substackcdn.com/image/fetch/$s_!mgAj!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2dd9224-0bc0-4332-a44d-a1f37ebe8cf9_1488x837.gif 848w, https://substackcdn.com/image/fetch/$s_!mgAj!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2dd9224-0bc0-4332-a44d-a1f37ebe8cf9_1488x837.gif 1272w, https://substackcdn.com/image/fetch/$s_!mgAj!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2dd9224-0bc0-4332-a44d-a1f37ebe8cf9_1488x837.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p><strong><a href="https://blog.jetbrains.com/platform/2026/02/wayland-by-default-in-2026-1-eap/">JetBrains announced</a></strong> that starting from version 2026.1 EAP, IntelliJ-based IDEs will run natively on Wayland by default. This is a significant step, particularly since Wayland has become the default display server in most modern Linux distributions.</p><p>One small difference in practice - the startup splash screen won&#8217;t be displayed, because it can&#8217;t be reliably centered on Wayland.</p><p>Positioning things is one of the hardest things in IT.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NJha!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1c4e63c-2a49-4ad4-9471-3eb2e1e3692b_572x694.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NJha!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1c4e63c-2a49-4ad4-9471-3eb2e1e3692b_572x694.png 424w, https://substackcdn.com/image/fetch/$s_!NJha!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1c4e63c-2a49-4ad4-9471-3eb2e1e3692b_572x694.png 848w, https://substackcdn.com/image/fetch/$s_!NJha!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1c4e63c-2a49-4ad4-9471-3eb2e1e3692b_572x694.png 1272w, https://substackcdn.com/image/fetch/$s_!NJha!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1c4e63c-2a49-4ad4-9471-3eb2e1e3692b_572x694.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NJha!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1c4e63c-2a49-4ad4-9471-3eb2e1e3692b_572x694.png" width="572" height="694" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f1c4e63c-2a49-4ad4-9471-3eb2e1e3692b_572x694.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:694,&quot;width&quot;:572,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!NJha!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1c4e63c-2a49-4ad4-9471-3eb2e1e3692b_572x694.png 424w, https://substackcdn.com/image/fetch/$s_!NJha!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1c4e63c-2a49-4ad4-9471-3eb2e1e3692b_572x694.png 848w, https://substackcdn.com/image/fetch/$s_!NJha!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1c4e63c-2a49-4ad4-9471-3eb2e1e3692b_572x694.png 1272w, https://substackcdn.com/image/fetch/$s_!NJha!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1c4e63c-2a49-4ad4-9471-3eb2e1e3692b_572x694.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><div><hr></div><p><strong><a href="https://www.linkedin.com/in/brunocborges/">Bruno Borges</a></strong> published a practical <strong><a href="https://dev.to/brunoborges/how-to-configure-jdk-25-for-github-copilot-coding-agent-2ecn">guide on configuring JDK 25 for GitHub Copilot Coding Agent</a></strong> - the ephemeral GitHub Actions environment where the agent builds code and runs tests. By default, the agent uses the pre-installed Java version on the runner, which can lead to failed builds if the project requires newer features. The solution? A dedicated copilot-setup-steps workflow with actions/setup-java.</p><p>Short, concrete, and useful if you&#8217;re starting to experiment with coding agents in Java projects.</p><div><hr></div><p><strong><a href="https://www.youtube.com/watch?v=k_zXrtSIiLo">SkillsJars</a></strong> is a new project showcased on the Coffee + Software livestream (<strong><a href="https://www.linkedin.com/in/joshlong?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAACXdIABb8VbfXttpb7WA9oliQsXOS5rEgw">Josh Long</a></strong>, <strong><a href="https://www.linkedin.com/in/dashaun/">DaShaun Carter</a></strong>, <strong><a href="https://www.linkedin.com/in/jamesward/">James Ward</a></strong> ) - a registry and distribution platform for Agent Skills via... Maven Central.</p><p>The idea is simple and simultaneously crazy in the best possible way: Agent Skills (the SKILL.md format introduced by Anthropic for Claude Code, also adopted by OpenAI Codex) are modular packages of instructions, scripts, and resources that extend AI agent capabilities - e.g., a skill for creating .docx documents, debugging via JDB, or building MCP servers. SkillsJars packages these skills as <strong>JAR artifacts</strong> and publishes them on Maven Central under the com.skillsjars group, with full support for Maven, Gradle, and sbt.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aQiG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F295543d7-479e-4807-bbb4-6cb5f8b516c0_935x612.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aQiG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F295543d7-479e-4807-bbb4-6cb5f8b516c0_935x612.png 424w, https://substackcdn.com/image/fetch/$s_!aQiG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F295543d7-479e-4807-bbb4-6cb5f8b516c0_935x612.png 848w, https://substackcdn.com/image/fetch/$s_!aQiG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F295543d7-479e-4807-bbb4-6cb5f8b516c0_935x612.png 1272w, https://substackcdn.com/image/fetch/$s_!aQiG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F295543d7-479e-4807-bbb4-6cb5f8b516c0_935x612.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aQiG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F295543d7-479e-4807-bbb4-6cb5f8b516c0_935x612.png" width="935" height="612" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/295543d7-479e-4807-bbb4-6cb5f8b516c0_935x612.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:612,&quot;width&quot;:935,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!aQiG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F295543d7-479e-4807-bbb4-6cb5f8b516c0_935x612.png 424w, https://substackcdn.com/image/fetch/$s_!aQiG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F295543d7-479e-4807-bbb4-6cb5f8b516c0_935x612.png 848w, https://substackcdn.com/image/fetch/$s_!aQiG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F295543d7-479e-4807-bbb4-6cb5f8b516c0_935x612.png 1272w, https://substackcdn.com/image/fetch/$s_!aQiG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F295543d7-479e-4807-bbb4-6cb5f8b516c0_935x612.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>The catalog already includes a Spring Boot 4.x skill (best practices, project structure, configuration), an agentic JDB debugger by Bruno Borges, a browser automation skill (browser-use), and official Anthropic skills for creating presentations, PDFs, frontend design, and building MCP servers. Anyone can publish their own skill - just point it to a GitHub repo.</p><p>Maven Central as a package manager for agentic AI - we truly live in interesting times.</p><div><hr></div><p><strong><a href="https://www.linkedin.com/in/johannes-bechberger/">Johannes Bechberger</a></strong> from the SapMachine team at SAP created a <strong><a href="https://mostlynerdless.de/blog/2026/02/03/the-java-version-quiz/">fun quiz</a></strong> where you have to guess the minimum Java version required from a code snippet. Over 30 years, Java added generics, lambdas, pattern matching, records... and it turns out most of us can&#8217;t precisely recall which feature arrived in which version.</p><p>A perfect way to <strong><a href="https://mostlynerdless.de/java-game/#alpha">kill five minutes over coffee</a></strong> (or an hour, if you&#8217;re as nerdy as I am).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Uh2m!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff841c40-4a25-4df1-9a1b-efbf2350412c_792x492.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Uh2m!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff841c40-4a25-4df1-9a1b-efbf2350412c_792x492.png 424w, https://substackcdn.com/image/fetch/$s_!Uh2m!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff841c40-4a25-4df1-9a1b-efbf2350412c_792x492.png 848w, https://substackcdn.com/image/fetch/$s_!Uh2m!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff841c40-4a25-4df1-9a1b-efbf2350412c_792x492.png 1272w, https://substackcdn.com/image/fetch/$s_!Uh2m!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff841c40-4a25-4df1-9a1b-efbf2350412c_792x492.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Uh2m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff841c40-4a25-4df1-9a1b-efbf2350412c_792x492.png" width="792" height="492" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ff841c40-4a25-4df1-9a1b-efbf2350412c_792x492.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:492,&quot;width&quot;:792,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!Uh2m!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff841c40-4a25-4df1-9a1b-efbf2350412c_792x492.png 424w, https://substackcdn.com/image/fetch/$s_!Uh2m!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff841c40-4a25-4df1-9a1b-efbf2350412c_792x492.png 848w, https://substackcdn.com/image/fetch/$s_!Uh2m!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff841c40-4a25-4df1-9a1b-efbf2350412c_792x492.png 1272w, https://substackcdn.com/image/fetch/$s_!Uh2m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff841c40-4a25-4df1-9a1b-efbf2350412c_792x492.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>If you think it&#8217;s too easy... I dare you to try <strong><a href="https://mostlynerdless.de/java-game/#alpha=1">Java Alpha version</a></strong> with alpha features &#128521;</p><div><hr></div><p><strong><a href="https://akamas.io/resources/the-state-of-java-on-kubernetes-2026-why-defaults-are-killing-your-performance/">Akamas published an analysis</a></strong> of the state of Java on Kubernetes based on thousands of JVMs in production.</p><p>The findings? Despite it being 2026, most Java workloads on K8s run with default settings that actively hurt performance. 60% of JVMs have no Garbage Collector configured, most heap settings are at defaults, and a significant portion of pods run with less than 1 CPU or less than 1 GiB RAM - which is a serious bottleneck for Java&#8217;s multi-threaded architecture. An old problem, but the data is striking.</p><p>PS: <strong><a href="https://github.com/microsoft/openjdk-jdk/pull/9">Ergonomic Profiles</a></strong> was always a great Idea IMHO.</p><div><hr></div><p><strong><a href="https://blog.jetbrains.com/kotlin/2026/02/java-to-kotlin-conversion-comes-to-visual-studio-code/">JetBrains released an extension</a></strong> for Visual Studio Code that enables converting Java files to Kotlin. The converter (J2K) uses the same engine as IntelliJ IDEA. Just open a .java file, right-click, and select &#8220;Convert to Kotlin.&#8221;</p><p>An interesting move - JetBrains clearly wants the Kotlin ecosystem to expand beyond their own IDE.</p><div><hr></div><p><strong><a href="https://www.linkedin.com/in/robintegg/">Robin Tegg</a></strong>, whose piece on Java UI landed in the newsletter two weeks ago, created an <strong><a href="https://awesome-java-ui.com/">awesome page</a></strong> - a comprehensive guide to Java UI frameworks, from desktop (JavaFX, Swing, Compose Desktop) through web (Vaadin, HTMX, Thymeleaf) to terminal (TamboUI, JLine, Lanterna). The motivation? Frustration with outdated articles referencing dead libraries. The result is the best single source of knowledge on the current state of Java UI in 2026.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TOF0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feea2cf42-7444-491e-aeff-cc3b3e307044_1426x856.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TOF0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feea2cf42-7444-491e-aeff-cc3b3e307044_1426x856.png 424w, https://substackcdn.com/image/fetch/$s_!TOF0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feea2cf42-7444-491e-aeff-cc3b3e307044_1426x856.png 848w, https://substackcdn.com/image/fetch/$s_!TOF0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feea2cf42-7444-491e-aeff-cc3b3e307044_1426x856.png 1272w, https://substackcdn.com/image/fetch/$s_!TOF0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feea2cf42-7444-491e-aeff-cc3b3e307044_1426x856.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TOF0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feea2cf42-7444-491e-aeff-cc3b3e307044_1426x856.png" width="1426" height="856" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/eea2cf42-7444-491e-aeff-cc3b3e307044_1426x856.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:856,&quot;width&quot;:1426,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!TOF0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feea2cf42-7444-491e-aeff-cc3b3e307044_1426x856.png 424w, https://substackcdn.com/image/fetch/$s_!TOF0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feea2cf42-7444-491e-aeff-cc3b3e307044_1426x856.png 848w, https://substackcdn.com/image/fetch/$s_!TOF0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feea2cf42-7444-491e-aeff-cc3b3e307044_1426x856.png 1272w, https://substackcdn.com/image/fetch/$s_!TOF0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feea2cf42-7444-491e-aeff-cc3b3e307044_1426x856.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>If anyone tells you &#8220;you can&#8217;t do UI in Java&#8221; - send them this link.</p><div><hr></div><p><strong>Scala Survey 2026</strong> - <strong><a href="https://www.linkedin.com/company/virtuslab/">VirtusLab</a></strong> and the <strong><a href="https://www.linkedin.com/company/scala-center/">Scala Center</a></strong> have launched their annual community survey, and if you&#8217;re using Scala in any capacity, your 5 minutes can directly shape the language&#8217;s roadmap, library ecosystem, and tooling priorities. The survey evaluates Scala adoption patterns, pain points, and what the community actually needs - and the results have historically influenced real decisions about where development effort goes.</p><p><strong><a href="https://virtuslab.typeform.com/ScalaSurvey2026">Take the survey here</a></strong>. Whether you&#8217;re a daily Scala developer or someone who occasionally dips into the ecosystem, your perspective matters. That&#8217;s unique possibility to shape the language</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BQSz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F244748df-0fc7-4ce3-9610-00766ced926a_428x425.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BQSz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F244748df-0fc7-4ce3-9610-00766ced926a_428x425.png 424w, https://substackcdn.com/image/fetch/$s_!BQSz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F244748df-0fc7-4ce3-9610-00766ced926a_428x425.png 848w, https://substackcdn.com/image/fetch/$s_!BQSz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F244748df-0fc7-4ce3-9610-00766ced926a_428x425.png 1272w, https://substackcdn.com/image/fetch/$s_!BQSz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F244748df-0fc7-4ce3-9610-00766ced926a_428x425.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BQSz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F244748df-0fc7-4ce3-9610-00766ced926a_428x425.png" width="428" height="425" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/244748df-0fc7-4ce3-9610-00766ced926a_428x425.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:425,&quot;width&quot;:428,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!BQSz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F244748df-0fc7-4ce3-9610-00766ced926a_428x425.png 424w, https://substackcdn.com/image/fetch/$s_!BQSz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F244748df-0fc7-4ce3-9610-00766ced926a_428x425.png 848w, https://substackcdn.com/image/fetch/$s_!BQSz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F244748df-0fc7-4ce3-9610-00766ced926a_428x425.png 1272w, https://substackcdn.com/image/fetch/$s_!BQSz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F244748df-0fc7-4ce3-9610-00766ced926a_428x425.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><div><hr></div><p>To wrap this section - <strong><a href="https://www.techtalksweekly.io/p/100-most-watched-java-conference">100 most-watched presentations from Java conferences in 2025</a></strong> is a solid list to catch up on. And the article on <strong><a href="https://medium.com/@martinastaberger/10-modern-java-features-senior-developers-use-to-write-50-less-code-e2bab5d8d410">10 modern Java features that let you write 50% less code</a></strong> is a good refresher, especially for those who are mentally stuck on Java 8.</p><h2><strong>2. Release Radar</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sXCE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10e6b291-7b31-40dd-afbc-501001a2dd12_862x571.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sXCE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10e6b291-7b31-40dd-afbc-501001a2dd12_862x571.png 424w, https://substackcdn.com/image/fetch/$s_!sXCE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10e6b291-7b31-40dd-afbc-501001a2dd12_862x571.png 848w, https://substackcdn.com/image/fetch/$s_!sXCE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10e6b291-7b31-40dd-afbc-501001a2dd12_862x571.png 1272w, https://substackcdn.com/image/fetch/$s_!sXCE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10e6b291-7b31-40dd-afbc-501001a2dd12_862x571.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sXCE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10e6b291-7b31-40dd-afbc-501001a2dd12_862x571.png" width="862" height="571" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/10e6b291-7b31-40dd-afbc-501001a2dd12_862x571.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:571,&quot;width&quot;:862,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!sXCE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10e6b291-7b31-40dd-afbc-501001a2dd12_862x571.png 424w, https://substackcdn.com/image/fetch/$s_!sXCE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10e6b291-7b31-40dd-afbc-501001a2dd12_862x571.png 848w, https://substackcdn.com/image/fetch/$s_!sXCE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10e6b291-7b31-40dd-afbc-501001a2dd12_862x571.png 1272w, https://substackcdn.com/image/fetch/$s_!sXCE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10e6b291-7b31-40dd-afbc-501001a2dd12_862x571.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><h3><strong>Quarkus 3.31</strong></h3><p><strong><a href="https://quarkus.io/blog/quarkus-3-31-released/">Quarkus 3.31</a></strong> is a major release that arrived after a two-month gap since the last feature release. The headline addition is <strong>full Java 25 support</strong>, but the changelog is genuinely impressive. New <strong>Panache Next</strong> - the next generation of the Panache layer with improved developer experience for Hibernate ORM and Hibernate Reactive. Upgrade to <strong>Hibernate ORM 7.2</strong> and Reactive 3.2. Support for <strong>Hibernate Spatial</strong>. Upgrade to <strong>Testcontainers 2</strong> and <strong>JUnit 6</strong> (yes, JUnit 6!). New <strong>quarkus Maven packaging</strong> with a dedicated lifecycle. On top of that: security annotations on Jakarta Data repositories, OIDC token encryption, OAuth 2.0 Pushed Authorization Requests, headless AWT on Windows for native images, and much more. Requires Maven 3.9.0+.</p><p><strong><a href="https://quarkus.io/blog/quarkus-3-31-released/">Release Notes</a></strong></p><h3><strong>Eclipse GlassFish 8.0</strong></h3><p><strong><a href="https://omnifish.ee/glassfish-8-released-enterprise-grade-java-redefined/">GlassFish 8</a></strong>, released February 5th, is the first production-ready implementation of the full <strong>Jakarta EE 11</strong> platform. The release, led by the OmniFish team, brings support for <strong>virtual threads</strong> in HTTP thread pools and managed executors, an implementation of <strong>Jakarta Data</strong> (repositories for working with both JPA entities and Jakarta NoSQL entities), and a new version of <strong>Jakarta Security</strong> with more flexible authentication options. Integration with MicroProfile 7.1 (Config, JWT, REST Client, Health). Requires JDK 21 as a minimum, supports JDK 25. Led by Arjan Tijms, Ondro Mih&#225;lyi, and David Mat&#283;j&#269;ek, GlassFish is returning as a serious production option.</p><p><strong><a href="https://github.com/eclipse-ee4j/glassfish/releases/tag/8.0.0">Release Notes</a></strong></p><h3><strong>Open Liberty 26.0.0.1</strong></h3><p><strong><a href="https://openliberty.io/blog/2026/01/27/26.0.0.1.html">Open Liberty 26.0.0.1</a></strong> is the first release of IBM&#8217;s application server in the new year - a transition from the 25.x branch to 26.x. The main addition is <strong>log throttling</strong> - a mechanism for automatically suppressing repeated log messages that simply didn&#8217;t exist in Liberty before. Throttling is enabled by default: Liberty tracks each messageID using a sliding window and after 1000 repetitions within five minutes begins suppressing messages, logging an appropriate warning. Throttling can be configured at the messageID or full message level (throttleType), and limits can be changed (throttleMaxMessagesPerWindow) - or disabled entirely by setting the limit to 0.</p><p>Security fixes include a patch for XSS (CVE-2025-12635, CVSS 5.4), issues with wlp password key decoding, and a NullPointerException in SocketRWChannelSelector. Two new guides on observability with OpenTelemetry and Grafana were also added.</p><p>Worth noting: the beta is developing a <strong>Model Context Protocol Server</strong> feature (mcpServer-1.0) - allowing Liberty application business logic to be exposed as tools for AI agents. Beta 26.0.0.2 has already added role-based authorization and async support. MCP in a Jakarta EE application server - now that&#8217;s an interesting combination.</p><p><strong><a href="https://openliberty.io/blog/2026/01/27/26.0.0.1.html">Release Notes</a></strong></p><h3><strong>BoxLang 1.9.0</strong></h3><p><strong><a href="https://boxlang.ortusbooks.com/readme/release-history/1.9.0">BoxLang 1.9.0</a></strong> announced as &#8220;production-ready&#8221; - a release focused on stability, with over 50 bug fixes, improved datasource lifecycle management (eliminating connection leaks), and better context management (eliminating memory leaks).</p><p>But what exactly is BoxLang? It&#8217;s a modern, dynamically typed JVM language from Ortus Solutions &#8212; a company well known in the ColdFusion world for the ColdBox framework and CommandBox tooling. BoxLang is essentially an answer to the question &#8220;what if we took the best ideas from CFML, Python, Kotlin, and Clojure, and built it from scratch on a modern JVM?&#8221; The language is 100% interoperable with Java, uses invokedynamic for performance, and its runtime weighs just ~6 MB. Interestingly, BoxLang has a dual parser &#8212; it can natively run existing ColdFusion/CFML code without modification, which is critical for migrations from Adobe ColdFusion or Lucee (and is also Ortus&#8217;s primary business model).</p><p>The project&#8217;s ambitions are broad &#8212; BoxLang targets multi-runtime deployment: from classic web servers, through AWS Lambda, to iOS, Android, and WebAssembly. The project is open source (Apache 2.0), with commercial BoxLang+ and BoxLang++ plans for enterprise support. Ortus also announced a cloud-native version at $5/month &#8212; a clear signal they&#8217;re trying to move beyond the ColdFusion niche and compete more broadly in the dynamic JVM language space.</p><p><strong><a href="https://boxlang.ortusbooks.com/readme/release-history/1.9.0">Release Notes</a></strong></p><h3><strong>Apache NetBeans 29</strong></h3><p><strong><a href="https://netbeans.apache.org/front/main/download/nb29/">Apache NetBeans 29</a></strong> - released February 23rd, so completely fresh. Under the hood there&#8217;s plenty of substance: Gradle Tooling API upgraded to 9.3.0, bundled Maven updated to 3.9.12, Ant bumped to 1.10.15. On the Java side &#8212; performance fixes for Find Usages and refactoring, better support for import module (keyword highlighting), fixed form designer.</p><p>Notably, NetBeans is already being tested on JDK 26-ea and sets --sun-misc-unsafe-memory-access=warn (JEP 498) &#8212; clearly laying the groundwork for upcoming changes to sun.misc.Unsafe access. The IDE supports running on JDK 25, 21, or 17, with preliminary support for JDK 26. Refactoring problem propagation to LSP clients has also been improved &#8212; NetBeans continues developing its role as a Language Server backend, not just a classic IDE.</p><p><strong><a href="https://github.com/apache/netbeans/releases/tag/29">Release Notes</a></strong></p><h3><strong>Ktor 3.4.0</strong></h3><p><strong><a href="https://blog.jetbrains.com/kotlin/2026/01/ktor-3-4-0-is-now-available/">Ktor 3.4.0</a></strong> - a new version of the Kotlin framework for building asynchronous HTTP servers and clients. A stability-focused release, but with several noteworthy additions. Most important: <strong>OpenAPI documentation generation from code</strong> &#8212; a new compiler plugin combined with the describe API lets you build a Swagger model dynamically, directly from the routing tree. No more manually maintaining static OpenAPI files that drift out of sync with the code.</p><p>Also added: <strong>Zstd compression</strong> support (Facebook&#8217;s algorithm offering an excellent compression-to-speed ratio) in the new ktor-server-compression-zstd module, <strong>duplex streaming for the OkHttp engine</strong> (simultaneous sending and receiving over HTTP/2), and a new <strong>HttpRequestLifecycle</strong> plugin - allowing in-flight requests to be automatically cancelled when a client disconnects. The last one is a nod to structured concurrency: a client disconnection cascades to cancel the coroutine handling the request along with all launch/async children, making resource management for long-running operations considerably cleaner. Currently works with Netty and CIO engines.</p><p><strong><a href="https://ktor.io/docs/whats-new-340.html">Release Notes</a></strong></p><div><hr></div><h2><strong>3. Github All-Stars</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VxrM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F374203c8-0e5d-4ea5-b49d-2a817e6966ad_866x575.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VxrM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F374203c8-0e5d-4ea5-b49d-2a817e6966ad_866x575.png 424w, https://substackcdn.com/image/fetch/$s_!VxrM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F374203c8-0e5d-4ea5-b49d-2a817e6966ad_866x575.png 848w, https://substackcdn.com/image/fetch/$s_!VxrM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F374203c8-0e5d-4ea5-b49d-2a817e6966ad_866x575.png 1272w, https://substackcdn.com/image/fetch/$s_!VxrM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F374203c8-0e5d-4ea5-b49d-2a817e6966ad_866x575.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VxrM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F374203c8-0e5d-4ea5-b49d-2a817e6966ad_866x575.png" width="866" height="575" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/374203c8-0e5d-4ea5-b49d-2a817e6966ad_866x575.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:575,&quot;width&quot;:866,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!VxrM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F374203c8-0e5d-4ea5-b49d-2a817e6966ad_866x575.png 424w, https://substackcdn.com/image/fetch/$s_!VxrM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F374203c8-0e5d-4ea5-b49d-2a817e6966ad_866x575.png 848w, https://substackcdn.com/image/fetch/$s_!VxrM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F374203c8-0e5d-4ea5-b49d-2a817e6966ad_866x575.png 1272w, https://substackcdn.com/image/fetch/$s_!VxrM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F374203c8-0e5d-4ea5-b49d-2a817e6966ad_866x575.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><h3><strong>Krema - Tauri, but in Java</strong></h3><p><strong><a href="https://github.com/krema-build/krema">Krema</a></strong> is probably the most interesting new project in this edition. For those who know Tauri from the Rust ecosystem - Krema is its Java equivalent. Lightweight, native desktop applications using the system webview instead of a bundled Chromium. Backend in Java, frontend in React/Vue/Angular/Svelte, communication through a type-safe IPC bridge.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!L3Kb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc095052f-18f1-4227-b9d9-b79e535e61a7_1184x724.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!L3Kb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc095052f-18f1-4227-b9d9-b79e535e61a7_1184x724.png 424w, https://substackcdn.com/image/fetch/$s_!L3Kb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc095052f-18f1-4227-b9d9-b79e535e61a7_1184x724.png 848w, https://substackcdn.com/image/fetch/$s_!L3Kb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc095052f-18f1-4227-b9d9-b79e535e61a7_1184x724.png 1272w, https://substackcdn.com/image/fetch/$s_!L3Kb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc095052f-18f1-4227-b9d9-b79e535e61a7_1184x724.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!L3Kb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc095052f-18f1-4227-b9d9-b79e535e61a7_1184x724.png" width="1184" height="724" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c095052f-18f1-4227-b9d9-b79e535e61a7_1184x724.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:724,&quot;width&quot;:1184,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!L3Kb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc095052f-18f1-4227-b9d9-b79e535e61a7_1184x724.png 424w, https://substackcdn.com/image/fetch/$s_!L3Kb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc095052f-18f1-4227-b9d9-b79e535e61a7_1184x724.png 848w, https://substackcdn.com/image/fetch/$s_!L3Kb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc095052f-18f1-4227-b9d9-b79e535e61a7_1184x724.png 1272w, https://substackcdn.com/image/fetch/$s_!L3Kb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc095052f-18f1-4227-b9d9-b79e535e61a7_1184x724.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>Key features: system webview (WebKit on macOS, WebView2 on Windows, WebKitGTK on Linux); native communication via <strong>Project Panama</strong> (Foreign Function &amp; Memory API from Java 25) - no JNI, annotate Java methods with @KremaCommand and call them from the frontend with full type safety, plugin system (SQLite, WebSocket, file upload, window positioning, autostart), native packaging with GraalVM or as a JAR.</p><p>The project looks well thought-out, and if it develops, it could be a game-changer for desktop apps in Java.</p><h3><strong>TamboUI - Terminal UI for Java, finally taken seriously</strong></h3><p><strong><a href="https://github.com/tamboui/tamboui">TamboUI</a></strong> announced by <strong><a href="https://www.linkedin.com/in/cedricchampeau/">C&#233;dric Champeau</a></strong> (known from Gradle and Micronaut) and <strong><a href="https://www.linkedin.com/in/maxrydahlandersen/">Max Rydahl Andersen</a></strong> (JBang, <strong><a href="https://www.linkedin.com/company/red-hat/">Red Hat</a></strong> ) - a modern Terminal UI framework for Java. It was born from the observation that Rust has <strong><a href="https://ratatui.rs/">Ratatui</a></strong>, Go has <strong><a href="https://github.com/charmbracelet/bubbletea">Bubbletea</a></strong>, Python has <strong><a href="https://textual.textualize.io/">Textual</a></strong> - and Java? System.out.println and prayers.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QfoW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccb30238-94ff-4447-9b84-0408b332e6f3_794x475.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QfoW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccb30238-94ff-4447-9b84-0408b332e6f3_794x475.png 424w, https://substackcdn.com/image/fetch/$s_!QfoW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccb30238-94ff-4447-9b84-0408b332e6f3_794x475.png 848w, https://substackcdn.com/image/fetch/$s_!QfoW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccb30238-94ff-4447-9b84-0408b332e6f3_794x475.png 1272w, https://substackcdn.com/image/fetch/$s_!QfoW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccb30238-94ff-4447-9b84-0408b332e6f3_794x475.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QfoW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccb30238-94ff-4447-9b84-0408b332e6f3_794x475.png" width="794" height="475" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ccb30238-94ff-4447-9b84-0408b332e6f3_794x475.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:475,&quot;width&quot;:794,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!QfoW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccb30238-94ff-4447-9b84-0408b332e6f3_794x475.png 424w, https://substackcdn.com/image/fetch/$s_!QfoW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccb30238-94ff-4447-9b84-0408b332e6f3_794x475.png 848w, https://substackcdn.com/image/fetch/$s_!QfoW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccb30238-94ff-4447-9b84-0408b332e6f3_794x475.png 1272w, https://substackcdn.com/image/fetch/$s_!QfoW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccb30238-94ff-4447-9b84-0408b332e6f3_794x475.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>TamboUI offers a multi-level API: from low-level widget primitives (like Ratatui), through a managed TUI with event handling, up to a declarative Toolkit DSL that handles the event loop and rendering thread for you. Immediate-mode rendering, constraint-based layout, CSS support, PicoCLI integration, multiple backends (JLine, Aesh, Panama).</p><p>And most importantly - full GraalVM native image compatibility, making Java a serious player in terminal tooling with low memory usage and fast startup. Core works on Java 8+, but it&#8217;s most enjoyable with modern Java idioms.</p><h3><strong>JADEx - Null Safety for Java Without Changing the Language</strong></h3><p><strong><a href="https://github.com/nieuwmijnleven/JADEx">JADEx (Java Annotation-Driven Extensions)</a></strong> is an approach to null safety in Java through annotations and compile-time processing - without waiting for Valhalla or a language spec change. The <strong><a href="https://www.reddit.com/r/java/comments/1r1a1s9/jadex_a_practical_null_safety_solution_for_java/">discussion on r/java</a></strong> shows the topic is still very much alive, with demand for pragmatic solutions.</p><h3><strong>JOpus - Wrapper for the Opus Codec</strong></h3><p><strong><a href="https://github.com/kinsleykajiva/jopus">JOpus</a></strong> is a high-performance Java wrapper for the Opus audio codec. Opus (not the one you might be thinking of) is an open audio format that excels at VoIP, streaming, and gaming - and is now easily accessible from the JVM.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ga9B!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff10c4ac-1fd3-41ac-8bb6-9fb0c887d121_500x500.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ga9B!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff10c4ac-1fd3-41ac-8bb6-9fb0c887d121_500x500.png 424w, https://substackcdn.com/image/fetch/$s_!Ga9B!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff10c4ac-1fd3-41ac-8bb6-9fb0c887d121_500x500.png 848w, https://substackcdn.com/image/fetch/$s_!Ga9B!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff10c4ac-1fd3-41ac-8bb6-9fb0c887d121_500x500.png 1272w, https://substackcdn.com/image/fetch/$s_!Ga9B!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff10c4ac-1fd3-41ac-8bb6-9fb0c887d121_500x500.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ga9B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff10c4ac-1fd3-41ac-8bb6-9fb0c887d121_500x500.png" width="500" height="500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ff10c4ac-1fd3-41ac-8bb6-9fb0c887d121_500x500.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:500,&quot;width&quot;:500,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!Ga9B!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff10c4ac-1fd3-41ac-8bb6-9fb0c887d121_500x500.png 424w, https://substackcdn.com/image/fetch/$s_!Ga9B!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff10c4ac-1fd3-41ac-8bb6-9fb0c887d121_500x500.png 848w, https://substackcdn.com/image/fetch/$s_!Ga9B!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff10c4ac-1fd3-41ac-8bb6-9fb0c887d121_500x500.png 1272w, https://substackcdn.com/image/fetch/$s_!Ga9B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff10c4ac-1fd3-41ac-8bb6-9fb0c887d121_500x500.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><h3><strong>ChartX - OpenGL Charting Library</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pAdW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb87d7bea-e00e-44e5-ad71-f1b2ea40b4f0_1067x619.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pAdW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb87d7bea-e00e-44e5-ad71-f1b2ea40b4f0_1067x619.png 424w, https://substackcdn.com/image/fetch/$s_!pAdW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb87d7bea-e00e-44e5-ad71-f1b2ea40b4f0_1067x619.png 848w, https://substackcdn.com/image/fetch/$s_!pAdW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb87d7bea-e00e-44e5-ad71-f1b2ea40b4f0_1067x619.png 1272w, https://substackcdn.com/image/fetch/$s_!pAdW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb87d7bea-e00e-44e5-ad71-f1b2ea40b4f0_1067x619.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pAdW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb87d7bea-e00e-44e5-ad71-f1b2ea40b4f0_1067x619.png" width="1067" height="619" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b87d7bea-e00e-44e5-ad71-f1b2ea40b4f0_1067x619.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:619,&quot;width&quot;:1067,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!pAdW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb87d7bea-e00e-44e5-ad71-f1b2ea40b4f0_1067x619.png 424w, https://substackcdn.com/image/fetch/$s_!pAdW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb87d7bea-e00e-44e5-ad71-f1b2ea40b4f0_1067x619.png 848w, https://substackcdn.com/image/fetch/$s_!pAdW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb87d7bea-e00e-44e5-ad71-f1b2ea40b4f0_1067x619.png 1272w, https://substackcdn.com/image/fetch/$s_!pAdW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb87d7bea-e00e-44e5-ad71-f1b2ea40b4f0_1067x619.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p><strong><a href="https://github.com/apokalypsix/chartx">ChartX</a></strong> is a library for creating hardware-accelerated charts using OpenGL. An interesting technology choice given that Minecraft is moving to Vulkan - but if you need performant, hardware-accelerated visualizations in Java, worth a look.</p><h3><strong>JBundle - Packaging JVM Applications</strong></h3><p><strong><a href="https://github.com/avelino/jbundle">JBundle</a></strong> is a tool for packaging JVM applications into distribution-ready formats. In the era of jpackage and GraalVM native image, JBundle offers yet another option in the deployment tooling ecosystem.</p><div><hr></div><p>As a wrap up, I have the invitation &#128513;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!s0EK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff888679c-97c8-4032-a6d5-72895f434ccc_2232x744.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!s0EK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff888679c-97c8-4032-a6d5-72895f434ccc_2232x744.png 424w, https://substackcdn.com/image/fetch/$s_!s0EK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff888679c-97c8-4032-a6d5-72895f434ccc_2232x744.png 848w, https://substackcdn.com/image/fetch/$s_!s0EK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff888679c-97c8-4032-a6d5-72895f434ccc_2232x744.png 1272w, https://substackcdn.com/image/fetch/$s_!s0EK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff888679c-97c8-4032-a6d5-72895f434ccc_2232x744.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!s0EK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff888679c-97c8-4032-a6d5-72895f434ccc_2232x744.png" width="1456" height="485" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f888679c-97c8-4032-a6d5-72895f434ccc_2232x744.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:485,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!s0EK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff888679c-97c8-4032-a6d5-72895f434ccc_2232x744.png 424w, https://substackcdn.com/image/fetch/$s_!s0EK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff888679c-97c8-4032-a6d5-72895f434ccc_2232x744.png 848w, https://substackcdn.com/image/fetch/$s_!s0EK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff888679c-97c8-4032-a6d5-72895f434ccc_2232x744.png 1272w, https://substackcdn.com/image/fetch/$s_!s0EK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff888679c-97c8-4032-a6d5-72895f434ccc_2232x744.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p><strong>PS: </strong>The full KotlinConf&#8217;26 <strong><a href="https://kotlinconf.org/6x4mmz">schedule is live</a></strong> - it&#8217;s officially time to start planning your conference experience! This year&#8217;s program highlights the ideas, tools, and real-world practices shaping the future of Kotlin. Over two days, you&#8217;ll hear from the Kotlin team and community experts as they share insights, experiments, and lessons learned from building at scale.</p><p>Amon speakers, you will find:</p><ul><li><p>Talking to Terminals (And How They Talk Back) | Jake Wharton</p></li><li><p>Bootiful Kotlin | <strong><a href="https://www.linkedin.com/in/joshlong/">Josh Long</a></strong></p></li><li><p>Evolving Language Defaults | <strong><a href="https://www.linkedin.com/in/michail-zare%C4%8Denskij-21209042/">Michail Zare&#269;enskij</a></strong></p></li><li><p>Practical Filament &#8211; Reshape Your UI! | <strong><a href="https://www.linkedin.com/in/nicoleterc/">Nicole Terc Vega</a></strong></p></li><li><p>Dissecting Kotlin: 2026 | <strong><a href="https://www.linkedin.com/in/huyentuedao/">Huyen Tue Dao</a></strong></p></li><li><p>Why Most AI Agents Never Scale: Building Enterprise-Ready AI With Koog | <strong><a href="https://www.linkedin.com/in/vadim-briliantov/">Vadim Briliantov</a></strong></p></li></ul><p>The full list you can <strong><a href="https://kotlinconf.org/7ai8b9">find there</a></strong>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Hey Peter, ask OpenClaw what Java looks like in 2026. It might surprise you both - JVM Weekly vol. 163]]></title><description><![CDATA[Rant Edition. Because sometimes AI-Bro narratives aren&#8217;t just annoying - they&#8217;re dangerously stupid. And I&#8217;m too tired for diplomacy, so I chose violence.]]></description><link>https://www.jvm-weekly.com/p/hey-peter-ask-openclaw-what-java</link><guid isPermaLink="false">https://www.jvm-weekly.com/p/hey-peter-ask-openclaw-what-java</guid><dc:creator><![CDATA[Artur Skowronski]]></dc:creator><pubDate>Thu, 19 Feb 2026 14:01:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Hj6v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6684e9f5-e93a-4a6a-aa42-850b9bde5d08_853x611.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Hj6v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6684e9f5-e93a-4a6a-aa42-850b9bde5d08_853x611.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Hj6v!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6684e9f5-e93a-4a6a-aa42-850b9bde5d08_853x611.png 424w, https://substackcdn.com/image/fetch/$s_!Hj6v!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6684e9f5-e93a-4a6a-aa42-850b9bde5d08_853x611.png 848w, https://substackcdn.com/image/fetch/$s_!Hj6v!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6684e9f5-e93a-4a6a-aa42-850b9bde5d08_853x611.png 1272w, https://substackcdn.com/image/fetch/$s_!Hj6v!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6684e9f5-e93a-4a6a-aa42-850b9bde5d08_853x611.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Hj6v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6684e9f5-e93a-4a6a-aa42-850b9bde5d08_853x611.png" width="853" height="611" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6684e9f5-e93a-4a6a-aa42-850b9bde5d08_853x611.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:611,&quot;width&quot;:853,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:780622,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/188377879?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6684e9f5-e93a-4a6a-aa42-850b9bde5d08_853x611.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Hj6v!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6684e9f5-e93a-4a6a-aa42-850b9bde5d08_853x611.png 424w, https://substackcdn.com/image/fetch/$s_!Hj6v!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6684e9f5-e93a-4a6a-aa42-850b9bde5d08_853x611.png 848w, https://substackcdn.com/image/fetch/$s_!Hj6v!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6684e9f5-e93a-4a6a-aa42-850b9bde5d08_853x611.png 1272w, https://substackcdn.com/image/fetch/$s_!Hj6v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6684e9f5-e93a-4a6a-aa42-850b9bde5d08_853x611.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>For those who&#8217;ve been living under a rock: Let&#8217;s start with the <em>Hitchhiker Guide to the Vibe Coded Lobster galaxy</em>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Let&#8217;s start from the beginning, because I know not all of you follow Twitter &#8212; though I have to admit, right now it&#8217;s <em>(gulp)</em> probably the most interesting social media out there (which is more of a commentary on the state of online discourse in 2026 than a compliment).</p><p>OpenClaw (formerly Clawdbot, then Moltbot - because Anthropic&#8217;s lawyers called) is an open-source AI agent created by <a href="https://steipete.me/">Peter Steinberger</a>. The project exploded in January 2026, racked up over 180,000 GitHub stars, spawned MoltBook (a social network <em>for AI agents only</em>, which my mom recently asked me about &#129327;), and Steinberger himself just announced he&#8217;s joining OpenAI to - and I quote - &#8220;build the next generation of personal agents.&#8221;</p><p>The whole story is fascinating. Peter previously sold his company PSPDFKit for well over $100 million, went through three years of therapy and ayahuasca (yes, really), launched 43 projects, 42 flopped, and the 43rd hit the bullseye. Steinberger openly admits: &#8220;I never read parts of the code I shipped&#8221; - because OpenClaw is largely <em>vibe-coded</em>.</p><p>If someone had told me a few years ago that this is what programming would look like in the third decade - I wouldn&#8217;t have believed it.</p><p>Though my own <a href="https://news.ycombinator.com/item?id=47038318">Token Anxiety</a> shows me just how addictive this process can be.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kX06!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1feb5f8-b409-420e-bc1e-9ade8f9ba477_435x516.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kX06!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1feb5f8-b409-420e-bc1e-9ade8f9ba477_435x516.png 424w, https://substackcdn.com/image/fetch/$s_!kX06!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1feb5f8-b409-420e-bc1e-9ade8f9ba477_435x516.png 848w, https://substackcdn.com/image/fetch/$s_!kX06!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1feb5f8-b409-420e-bc1e-9ade8f9ba477_435x516.png 1272w, https://substackcdn.com/image/fetch/$s_!kX06!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1feb5f8-b409-420e-bc1e-9ade8f9ba477_435x516.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kX06!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1feb5f8-b409-420e-bc1e-9ade8f9ba477_435x516.png" width="435" height="516" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a1feb5f8-b409-420e-bc1e-9ade8f9ba477_435x516.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:516,&quot;width&quot;:435,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:121274,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/188377879?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1feb5f8-b409-420e-bc1e-9ade8f9ba477_435x516.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!kX06!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1feb5f8-b409-420e-bc1e-9ade8f9ba477_435x516.png 424w, https://substackcdn.com/image/fetch/$s_!kX06!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1feb5f8-b409-420e-bc1e-9ade8f9ba477_435x516.png 848w, https://substackcdn.com/image/fetch/$s_!kX06!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1feb5f8-b409-420e-bc1e-9ade8f9ba477_435x516.png 1272w, https://substackcdn.com/image/fetch/$s_!kX06!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1feb5f8-b409-420e-bc1e-9ade8f9ba477_435x516.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>And to be clear: <strong>I&#8217;m genuinely interested in OpenClaw myself</strong>. I even <a href="https://github.com/ArturSkowronski/clawd-reachy-mini">built a client for it</a> running on <a href="https://www.pollen-robotics.com/reachy-mini/">Reachy Mini</a> - an open-source humanoid robot from Pollen Robotics/Hugging Face - and hooking it up to OpenClaw was <em>freaking fun</em>. Reachy Mini is fantastic hardware at $299, with a Python SDK and Hugging Face integration - the perfect toy for someone who (like me) wrote their bachelor&#8217;s thesis on controlling a robotic arm with a Kinect.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!orf5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7f24364-a03a-46df-9fea-ca630f7020a3_1096x1170.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!orf5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7f24364-a03a-46df-9fea-ca630f7020a3_1096x1170.png 424w, https://substackcdn.com/image/fetch/$s_!orf5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7f24364-a03a-46df-9fea-ca630f7020a3_1096x1170.png 848w, https://substackcdn.com/image/fetch/$s_!orf5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7f24364-a03a-46df-9fea-ca630f7020a3_1096x1170.png 1272w, https://substackcdn.com/image/fetch/$s_!orf5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7f24364-a03a-46df-9fea-ca630f7020a3_1096x1170.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!orf5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7f24364-a03a-46df-9fea-ca630f7020a3_1096x1170.png" width="1096" height="1170" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c7f24364-a03a-46df-9fea-ca630f7020a3_1096x1170.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1170,&quot;width&quot;:1096,&quot;resizeWidth&quot;:0,&quot;bytes&quot;:1748335,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/188377879?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7f24364-a03a-46df-9fea-ca630f7020a3_1096x1170.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!orf5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7f24364-a03a-46df-9fea-ca630f7020a3_1096x1170.png 424w, https://substackcdn.com/image/fetch/$s_!orf5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7f24364-a03a-46df-9fea-ca630f7020a3_1096x1170.png 848w, https://substackcdn.com/image/fetch/$s_!orf5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7f24364-a03a-46df-9fea-ca630f7020a3_1096x1170.png 1272w, https://substackcdn.com/image/fetch/$s_!orf5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7f24364-a03a-46df-9fea-ca630f7020a3_1096x1170.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>But just because something is fun doesn&#8217;t mean it&#8217;s above criticism. And I&#8217;m not talking about OpenClaw here.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Q7gw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1614167-8723-4d0c-8b86-b17bb96d96f0_900x526.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Q7gw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1614167-8723-4d0c-8b86-b17bb96d96f0_900x526.png 424w, https://substackcdn.com/image/fetch/$s_!Q7gw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1614167-8723-4d0c-8b86-b17bb96d96f0_900x526.png 848w, https://substackcdn.com/image/fetch/$s_!Q7gw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1614167-8723-4d0c-8b86-b17bb96d96f0_900x526.png 1272w, https://substackcdn.com/image/fetch/$s_!Q7gw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1614167-8723-4d0c-8b86-b17bb96d96f0_900x526.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Q7gw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1614167-8723-4d0c-8b86-b17bb96d96f0_900x526.png" width="900" height="526" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f1614167-8723-4d0c-8b86-b17bb96d96f0_900x526.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:526,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:95264,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/188377879?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1614167-8723-4d0c-8b86-b17bb96d96f0_900x526.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Q7gw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1614167-8723-4d0c-8b86-b17bb96d96f0_900x526.png 424w, https://substackcdn.com/image/fetch/$s_!Q7gw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1614167-8723-4d0c-8b86-b17bb96d96f0_900x526.png 848w, https://substackcdn.com/image/fetch/$s_!Q7gw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1614167-8723-4d0c-8b86-b17bb96d96f0_900x526.png 1272w, https://substackcdn.com/image/fetch/$s_!Q7gw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1614167-8723-4d0c-8b86-b17bb96d96f0_900x526.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I&#8217;m talking about a <a href="https://x.com/steipete/status/2023056565968749040">tweet</a> that triggered a wave of frustration in the JVM community. A tweet in which 300,000 lines of unaudited TypeScript are presented as proof that traditional enterprise is dead. A tweet racking up hundreds of thousands of views, amplifying a narrative that everyone recruiting Java developers is already fighting.</p><p>So let&#8217;s talk about what actually lies behind that narrative. From both sides.</p><p>Let&#8217;s start with facts, because anyone can rant with emotions. Ranting with receipts - that&#8217;s a different league.</p><p>OpenClaw as an <em>idea</em> is fascinating. OpenClaw as a <em>production system</em> is a security disaster documented by at least five independent organizations:</p><ul><li><p><strong><a href="https://thehackernews.com/2026/02/openclaw-bug-enables-one-click-remote.html">CVE-2026-25253</a></strong> (CVSS 8.8) - one-click RCE. The Control UI trusted <code>gatewayUrl</code> from query strings without validation and sent auth tokens over WebSocket. Clicking a single link = full instance compromise. Exploitable even on localhost.</p></li><li><p><strong><a href="https://blogs.cisco.com/ai/personal-ai-agents-like-openclaw-are-a-security-nightmare">Cisco AI Defense</a></strong> tested the &#8220;What Would Elon Do?&#8221; skill - 9 vulnerabilities, 2 critical. Silent data exfiltration and prompt injection bypassing safety guidelines. Their verdict, verbatim: <em>&#8220;From a security perspective, it&#8217;s an absolute nightmare.&#8221;</em></p></li><li><p><strong><a href="https://snyk.io/blog/toxicskills-malicious-ai-agent-skills-clawhub/">Snyk ToxicSkills</a></strong> - the first comprehensive ecosystem audit: 3,984 skills, <strong>36% contain prompt injection</strong>, 341 malicious, including 335 installing Atomic Stealer on macOS. 76 confirmed credential-stealing payloads.</p></li><li><p><strong><a href="https://thehackernews.com/2026/02/openclaw-integrates-virustotal-scanning.html">Moltbook leak</a></strong> - misconfigured Supabase instance: 1.5 million API tokens, 35,000 email addresses, private messages between agents. All publicly accessible.</p></li><li><p><strong><a href="https://cyberinsights.substack.com/p/is-openclaw-the-biggest-security">135,000+ instances exposed to the internet</a></strong> - the gateway binds to <code>0.0.0.0:18789</code> by default. SecurityScorecard tracked a jump from 40K to 135K in <em>a single day</em>. 63% classified as vulnerable.</p></li><li><p><strong><a href="https://adversa.ai/blog/openclaw-security-101-vulnerabilities-hardening-2026/">Adversa AI</a></strong> warns: <code>~/.openclaw/</code> stores API keys, WhatsApp tokens, and Discord credentials in <strong>plaintext JSON and Markdown</strong>. Infostealers RedLine, Lumma, and Vidar are already building modules to harvest these files.</p></li><li><p><strong>Gartner</strong> rated it an <em>&#8220;unacceptable cybersecurity risk&#8221;</em> - immediate ban recommended for enterprise.</p></li></ul><p>And <a href="https://novalogiq.com/2026/02/11/nanoclaw-solves-one-of-openclaws-biggest-security-issues-and-its-already-powering-the-creators-biz/">NanoClaw</a> by Gavriel Cohen rewrote the core logic in ~500 lines of TypeScript. Five hundred. Auditable in a single afternoon. That says enough about the state of the original 300,000.</p><p>My problem isn&#8217;t with OpenClaw - as I said, my inner nerd is having the time of his life... in general, it&#8217;s fun. My problem is with the narrative in which a vibe-coded agent with three CVEs, 341 malware skills, and Gartner saying &#8220;ban this&#8221; gets presented as <em>the future of programming</em> - while an ecosystem with 30 years of production history is &#8220;boomer tech.&#8221;</p><div id="youtube2-QAW9QpBG80s" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;QAW9QpBG80s&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/QAW9QpBG80s?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h2>Honest about Java&#8217;s problems - because we&#8217;re not fanboys</h2><p>The rant edition format makes it easy to slip into <em>Java is doing great, haters gonna hate mode</em>. I&#8217;m not going there.</p><p>Java is unfortunately dropping in rankings - TIOBE February 2026: fourth place, ~8-9%. C# <a href="https://adtmag.com/articles/2026/01/07/tiobe-language-rankings-for-2025.aspx">was named Language of the Year 2025</a>. Paul Jansen openly asks whether <em>&#8220;Java, with its verbose, boilerplate-heavy style and Oracle ownership, can continue to keep C# at bay.&#8221;</em> Python is at 22%+. Rust - &#8220;most admired&#8221; for the ninth year running (82.2%). TypeScript has overtaken Java on GitHub. <a href="https://survey.stackoverflow.co/2025/technology/#admired-and-desired">Stack Overflow 2025</a>: only 15.8% of developers <em>want</em> to work in Java. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aTwv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88570d0f-f515-452a-a278-ea3b3d203373_480x835.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aTwv!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88570d0f-f515-452a-a278-ea3b3d203373_480x835.gif 424w, https://substackcdn.com/image/fetch/$s_!aTwv!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88570d0f-f515-452a-a278-ea3b3d203373_480x835.gif 848w, https://substackcdn.com/image/fetch/$s_!aTwv!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88570d0f-f515-452a-a278-ea3b3d203373_480x835.gif 1272w, https://substackcdn.com/image/fetch/$s_!aTwv!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88570d0f-f515-452a-a278-ea3b3d203373_480x835.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aTwv!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88570d0f-f515-452a-a278-ea3b3d203373_480x835.gif" width="480" height="835" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/88570d0f-f515-452a-a278-ea3b3d203373_480x835.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:835,&quot;width&quot;:480,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:6241069,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/188377879?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88570d0f-f515-452a-a278-ea3b3d203373_480x835.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!aTwv!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88570d0f-f515-452a-a278-ea3b3d203373_480x835.gif 424w, https://substackcdn.com/image/fetch/$s_!aTwv!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88570d0f-f515-452a-a278-ea3b3d203373_480x835.gif 848w, https://substackcdn.com/image/fetch/$s_!aTwv!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88570d0f-f515-452a-a278-ea3b3d203373_480x835.gif 1272w, https://substackcdn.com/image/fetch/$s_!aTwv!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88570d0f-f515-452a-a278-ea3b3d203373_480x835.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Of course, worth knowing only if you still care about StackOverflow opinion. You will be missed the old friend.</figcaption></figure></div><p>On top of that, the AI narrative favors Python and TypeScript - and not without reason. Vibe coding, agents, OpenClaw, Cursor, Claude Code - that&#8217;s TypeScript and Python. The feedback loop is shorter, the entry barrier lower, and LLMs generate better code in languages they were trained on. If you&#8217;re a junior in 2026, your first AI project will be in Python. One hundred percent. That&#8217;s a real problem for the JVM talent pipeline.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0LPc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9332124-cc5f-4da1-9e04-8d13b8a5b3f4_609x378.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0LPc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9332124-cc5f-4da1-9e04-8d13b8a5b3f4_609x378.png 424w, https://substackcdn.com/image/fetch/$s_!0LPc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9332124-cc5f-4da1-9e04-8d13b8a5b3f4_609x378.png 848w, https://substackcdn.com/image/fetch/$s_!0LPc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9332124-cc5f-4da1-9e04-8d13b8a5b3f4_609x378.png 1272w, https://substackcdn.com/image/fetch/$s_!0LPc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9332124-cc5f-4da1-9e04-8d13b8a5b3f4_609x378.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0LPc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9332124-cc5f-4da1-9e04-8d13b8a5b3f4_609x378.png" width="609" height="378" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e9332124-cc5f-4da1-9e04-8d13b8a5b3f4_609x378.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:378,&quot;width&quot;:609,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:181819,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/188377879?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9332124-cc5f-4da1-9e04-8d13b8a5b3f4_609x378.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!0LPc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9332124-cc5f-4da1-9e04-8d13b8a5b3f4_609x378.png 424w, https://substackcdn.com/image/fetch/$s_!0LPc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9332124-cc5f-4da1-9e04-8d13b8a5b3f4_609x378.png 848w, https://substackcdn.com/image/fetch/$s_!0LPc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9332124-cc5f-4da1-9e04-8d13b8a5b3f4_609x378.png 1272w, https://substackcdn.com/image/fetch/$s_!0LPc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9332124-cc5f-4da1-9e04-8d13b8a5b3f4_609x378.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Juniors? What juniors.</figcaption></figure></div><p>Unfortunately, Java is still perceived through the lens of version 8. It&#8217;s an ugly vicious cycle: the more people think of Java in terms of EJBs, getters, and <code>AbstractSingletonProxyFactoryBean</code>, the fewer newcomers bother to check what&#8217;s changed, which cements the image of an &#8220;old&#8221; language. We don&#8217;t help ourselves either &#8212; many of us live in a bubble and aren&#8217;t explaining loudly enough that Java 25 is a <em>completely different language</em> than Java 8.</p><p>These are real problems. Treating them as &#8220;hate&#8221; instead of signals is a mistake.</p><p>Now - the counterattack. Because the data tells a more interesting story than the Twitter narratives.</p><div><hr></div><p><a href="https://www.linkedin.com/feed/update/urn:li:activity:7429146312501207040/">The JVM ecosystem hasn&#8217;t been sitting still</a>. The GraalVM team, among others, decided to remind the world of a few facts. Rightly so.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OIKD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cd0482a-12e7-48c2-9f6a-518bb82d2661_998x674.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OIKD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cd0482a-12e7-48c2-9f6a-518bb82d2661_998x674.png 424w, https://substackcdn.com/image/fetch/$s_!OIKD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cd0482a-12e7-48c2-9f6a-518bb82d2661_998x674.png 848w, https://substackcdn.com/image/fetch/$s_!OIKD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cd0482a-12e7-48c2-9f6a-518bb82d2661_998x674.png 1272w, https://substackcdn.com/image/fetch/$s_!OIKD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cd0482a-12e7-48c2-9f6a-518bb82d2661_998x674.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OIKD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cd0482a-12e7-48c2-9f6a-518bb82d2661_998x674.png" width="998" height="674" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5cd0482a-12e7-48c2-9f6a-518bb82d2661_998x674.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:674,&quot;width&quot;:998,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:351668,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/188377879?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cd0482a-12e7-48c2-9f6a-518bb82d2661_998x674.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!OIKD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cd0482a-12e7-48c2-9f6a-518bb82d2661_998x674.png 424w, https://substackcdn.com/image/fetch/$s_!OIKD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cd0482a-12e7-48c2-9f6a-518bb82d2661_998x674.png 848w, https://substackcdn.com/image/fetch/$s_!OIKD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cd0482a-12e7-48c2-9f6a-518bb82d2661_998x674.png 1272w, https://substackcdn.com/image/fetch/$s_!OIKD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cd0482a-12e7-48c2-9f6a-518bb82d2661_998x674.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><a href="https://github.com/brunoborges">Bruno Borges</a>, Developer Advocate at GitHub (previously Microsoft, Oracle), created <a href="https://javaevolved.github.io/">java.evolved</a> - a site comparing old Java code with its modern equivalent. 86 comparisons, JDK 8 to JDK 25. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CVfr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ca9646d-a5fd-44af-b5d4-e3cae68f5552_1768x1310.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CVfr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ca9646d-a5fd-44af-b5d4-e3cae68f5552_1768x1310.png 424w, https://substackcdn.com/image/fetch/$s_!CVfr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ca9646d-a5fd-44af-b5d4-e3cae68f5552_1768x1310.png 848w, https://substackcdn.com/image/fetch/$s_!CVfr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ca9646d-a5fd-44af-b5d4-e3cae68f5552_1768x1310.png 1272w, https://substackcdn.com/image/fetch/$s_!CVfr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ca9646d-a5fd-44af-b5d4-e3cae68f5552_1768x1310.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CVfr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ca9646d-a5fd-44af-b5d4-e3cae68f5552_1768x1310.png" width="1456" height="1079" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9ca9646d-a5fd-44af-b5d4-e3cae68f5552_1768x1310.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1079,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:262743,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/188377879?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ca9646d-a5fd-44af-b5d4-e3cae68f5552_1768x1310.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!CVfr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ca9646d-a5fd-44af-b5d4-e3cae68f5552_1768x1310.png 424w, https://substackcdn.com/image/fetch/$s_!CVfr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ca9646d-a5fd-44af-b5d4-e3cae68f5552_1768x1310.png 848w, https://substackcdn.com/image/fetch/$s_!CVfr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ca9646d-a5fd-44af-b5d4-e3cae68f5552_1768x1310.png 1272w, https://substackcdn.com/image/fetch/$s_!CVfr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ca9646d-a5fd-44af-b5d4-e3cae68f5552_1768x1310.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Take a look:</p><pre><code><code>// Back then
public class Point {
    private final int x, y;
    public Point(int x, int y) { ... }
    public int getX() { return x; }
    public int getY() { return y; }
    // equals, hashCode, toString...
}

// Java 16+
public record Point(int x, int y) {}</code></code></pre><pre><code><code>// Back then
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

// Java 25
void main() {
    println("Hello, World!");
}</code></code></pre><p>Virtual threads. Structured concurrency. Pattern matching in switch. Sealed classes. Gatherers in streams. This is not the same Java people picture when they say &#8220;enterprise bloat.&#8221;</p><p>So first action point from this piece: <a href="https://javaevolved.github.io/">java.evolved</a> - worth sending to anyone still citing Java circa 2015.</p><p>Now let&#8217;s look at an alternative perspective our community has been wielding like a shield - Thiago Mendes <a href="https://www.tmdevlab.com/mcp-server-performance-benchmark.html">published an open-source benchmark</a> of MCP servers in four languages - 3.9 million requests, three rounds, <a href="https://github.com/thiagomendes/benchmark-mcp-servers">full code on GitHub</a>. Each server in an identical Docker container (1 core, 1GB RAM), four identical test tools.</p><p>The headline number: Java (Spring Boot + Spring AI) achieved 0.835ms average latency vs Python (FastMCP) at 26.45ms. A 31x difference. Go right next to Java (0.855ms), Node.js in the middle (10.66ms).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GRXl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac0017ca-1f13-440a-a401-c8fbce39a739_1578x734.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GRXl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac0017ca-1f13-440a-a401-c8fbce39a739_1578x734.png 424w, https://substackcdn.com/image/fetch/$s_!GRXl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac0017ca-1f13-440a-a401-c8fbce39a739_1578x734.png 848w, https://substackcdn.com/image/fetch/$s_!GRXl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac0017ca-1f13-440a-a401-c8fbce39a739_1578x734.png 1272w, https://substackcdn.com/image/fetch/$s_!GRXl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac0017ca-1f13-440a-a401-c8fbce39a739_1578x734.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GRXl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac0017ca-1f13-440a-a401-c8fbce39a739_1578x734.png" width="1456" height="677" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ac0017ca-1f13-440a-a401-c8fbce39a739_1578x734.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:677,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:114371,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/188377879?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac0017ca-1f13-440a-a401-c8fbce39a739_1578x734.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!GRXl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac0017ca-1f13-440a-a401-c8fbce39a739_1578x734.png 424w, https://substackcdn.com/image/fetch/$s_!GRXl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac0017ca-1f13-440a-a401-c8fbce39a739_1578x734.png 848w, https://substackcdn.com/image/fetch/$s_!GRXl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac0017ca-1f13-440a-a401-c8fbce39a739_1578x734.png 1272w, https://substackcdn.com/image/fetch/$s_!GRXl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac0017ca-1f13-440a-a401-c8fbce39a739_1578x734.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>But - let&#8217;s be honest - raw MCP server latency is rarely the bottleneck in practice. A typical flow looks like: LLM generates request (500&#8211;2000ms) &#8594; MCP routes to tool (those 0.8&#8211;26ms) &#8594; tool queries database/API (50&#8211;3000ms) &#8594; LLM processes response (500&#8211;2000ms). The bottleneck is the LLM - by a huge margin. Those 25ms difference between Java and Python drown in the seconds the model spends thinking. The end user won&#8217;t feel it. I think anyone who&#8217;s used any MCP in practice will confirm that.</p><p>Where this data <em>actually</em> matters is resource efficiency under load. And here the table says more than the latency numbers:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vfI7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6779b137-5532-457e-b8de-ea4ffaa1c4f1_1598x742.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vfI7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6779b137-5532-457e-b8de-ea4ffaa1c4f1_1598x742.png 424w, https://substackcdn.com/image/fetch/$s_!vfI7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6779b137-5532-457e-b8de-ea4ffaa1c4f1_1598x742.png 848w, https://substackcdn.com/image/fetch/$s_!vfI7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6779b137-5532-457e-b8de-ea4ffaa1c4f1_1598x742.png 1272w, https://substackcdn.com/image/fetch/$s_!vfI7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6779b137-5532-457e-b8de-ea4ffaa1c4f1_1598x742.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vfI7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6779b137-5532-457e-b8de-ea4ffaa1c4f1_1598x742.png" width="1456" height="676" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6779b137-5532-457e-b8de-ea4ffaa1c4f1_1598x742.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:676,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:91292,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/188377879?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6779b137-5532-457e-b8de-ea4ffaa1c4f1_1598x742.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vfI7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6779b137-5532-457e-b8de-ea4ffaa1c4f1_1598x742.png 424w, https://substackcdn.com/image/fetch/$s_!vfI7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6779b137-5532-457e-b8de-ea4ffaa1c4f1_1598x742.png 848w, https://substackcdn.com/image/fetch/$s_!vfI7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6779b137-5532-457e-b8de-ea4ffaa1c4f1_1598x742.png 1272w, https://substackcdn.com/image/fetch/$s_!vfI7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6779b137-5532-457e-b8de-ea4ffaa1c4f1_1598x742.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Java and Go handle 1600 req/s using ~30% CPU. They have headroom. Add more load - they&#8217;ll hold. Python and Node.js are already hitting the wall at 50 concurrent users. In practice that means: if you&#8217;re building an MCP gateway for one developer - Python is fine. If you&#8217;re building shared MCP infrastructure for an organization with hundreds of agents - the difference between 30% and 94% CPU utilization is the difference between &#8220;it works&#8221; and &#8220;we need three times as many Kubernetes pods.&#8221;</p><p><strong>Disclaimer:</strong> Node.js with per-request instantiation (mitigation for <a href="https://nvd.nist.gov/vuln/detail/CVE-2026-25536">CVE-2026-25536</a> - shared instance would be faster), Python with single-worker uvicorn (multi-worker would improve things), Java without JVM tuning.</p><p>So the <em><strong>Java is 31x faster than Python in AI</strong></em> claim - I wouldn&#8217;t push that too hard people. More accurately: Java and Go give you headroom that Python and Node.js don&#8217;t have, when MCP stops being a single developer&#8217;s toy and becomes infrastructure.</p><p>Which is exactly what I&#8217;d expect from it.</p><div><hr></div><p>Moving on: the <a href="https://www.azul.com/state-of-java-2026/">Azul 2026 State of Java Report</a> (2000+ respondents) shows 62% using Java for AI functionality - up from 50% the year before. 31% say more than half of their Java applications contain AI.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0ytN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d40f2eb-f39d-4b15-a403-357e29cac31e_1562x680.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0ytN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d40f2eb-f39d-4b15-a403-357e29cac31e_1562x680.png 424w, https://substackcdn.com/image/fetch/$s_!0ytN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d40f2eb-f39d-4b15-a403-357e29cac31e_1562x680.png 848w, https://substackcdn.com/image/fetch/$s_!0ytN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d40f2eb-f39d-4b15-a403-357e29cac31e_1562x680.png 1272w, https://substackcdn.com/image/fetch/$s_!0ytN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d40f2eb-f39d-4b15-a403-357e29cac31e_1562x680.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0ytN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d40f2eb-f39d-4b15-a403-357e29cac31e_1562x680.png" width="1456" height="634" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7d40f2eb-f39d-4b15-a403-357e29cac31e_1562x680.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:634,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:157380,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/188377879?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d40f2eb-f39d-4b15-a403-357e29cac31e_1562x680.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!0ytN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d40f2eb-f39d-4b15-a403-357e29cac31e_1562x680.png 424w, https://substackcdn.com/image/fetch/$s_!0ytN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d40f2eb-f39d-4b15-a403-357e29cac31e_1562x680.png 848w, https://substackcdn.com/image/fetch/$s_!0ytN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d40f2eb-f39d-4b15-a403-357e29cac31e_1562x680.png 1272w, https://substackcdn.com/image/fetch/$s_!0ytN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d40f2eb-f39d-4b15-a403-357e29cac31e_1562x680.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Standard disclaimer from my side (of which there are many today) - <strong>this is a survey of people who </strong><em><strong>already use Java</strong></em>, so there&#8217;s naturally a bias. But the trend is clear: Python dominates in prototyping and experimentation, Java in production.</p><p><a href="https://thenewstack.io/2026-java-ai-apps/">The New Stack</a> quotes Gil Tene, CTO of Azul:</p><blockquote><p>People are not playing around making little demos; they&#8217;re making real applications with Java for AI.</p></blockquote><p>The report summarizes it this way:</p><blockquote><p>While Python might never relinquish its position as the top programming language for producing AI functionality, Java is becoming the default language for running the AI applications themselves.</p></blockquote><p>Python prototypes. Java produces. Both are needed. But only one of them keeps banking systems on their feet at three in the morning.</p><p>One more thing that kind of blew my mind: 98% of respondents use AI tools to generate code (last year: 76%). 30% say more than half of new code is entirely AI-generated. </p><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mjo_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1756035-d16f-4947-96f2-f4970155190f_728x318.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mjo_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1756035-d16f-4947-96f2-f4970155190f_728x318.png 424w, https://substackcdn.com/image/fetch/$s_!mjo_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1756035-d16f-4947-96f2-f4970155190f_728x318.png 848w, https://substackcdn.com/image/fetch/$s_!mjo_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1756035-d16f-4947-96f2-f4970155190f_728x318.png 1272w, https://substackcdn.com/image/fetch/$s_!mjo_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1756035-d16f-4947-96f2-f4970155190f_728x318.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mjo_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1756035-d16f-4947-96f2-f4970155190f_728x318.png" width="728" height="318" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b1756035-d16f-4947-96f2-f4970155190f_728x318.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:318,&quot;width&quot;:728,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:95678,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/188377879?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1756035-d16f-4947-96f2-f4970155190f_728x318.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mjo_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1756035-d16f-4947-96f2-f4970155190f_728x318.png 424w, https://substackcdn.com/image/fetch/$s_!mjo_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1756035-d16f-4947-96f2-f4970155190f_728x318.png 848w, https://substackcdn.com/image/fetch/$s_!mjo_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1756035-d16f-4947-96f2-f4970155190f_728x318.png 1272w, https://substackcdn.com/image/fetch/$s_!mjo_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1756035-d16f-4947-96f2-f4970155190f_728x318.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p> </p><p>The &#8220;irrelevant in the AI era&#8221; ecosystem looks rather different in my head.</p><div><hr></div><p>The <a href="https://www.jvm-weekly.com/about">about</a> section of this newsletter has always featured a certain comic strip:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YyO_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7e504cd6-142f-478e-85d2-dca0f29ead88_1024x853.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YyO_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7e504cd6-142f-478e-85d2-dca0f29ead88_1024x853.png 424w, https://substackcdn.com/image/fetch/$s_!YyO_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7e504cd6-142f-478e-85d2-dca0f29ead88_1024x853.png 848w, https://substackcdn.com/image/fetch/$s_!YyO_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7e504cd6-142f-478e-85d2-dca0f29ead88_1024x853.png 1272w, https://substackcdn.com/image/fetch/$s_!YyO_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7e504cd6-142f-478e-85d2-dca0f29ead88_1024x853.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YyO_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7e504cd6-142f-478e-85d2-dca0f29ead88_1024x853.png" width="1024" height="853" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/7e504cd6-142f-478e-85d2-dca0f29ead88_1024x853.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:853,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!YyO_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7e504cd6-142f-478e-85d2-dca0f29ead88_1024x853.png 424w, https://substackcdn.com/image/fetch/$s_!YyO_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7e504cd6-142f-478e-85d2-dca0f29ead88_1024x853.png 848w, https://substackcdn.com/image/fetch/$s_!YyO_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7e504cd6-142f-478e-85d2-dca0f29ead88_1024x853.png 1272w, https://substackcdn.com/image/fetch/$s_!YyO_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7e504cd6-142f-478e-85d2-dca0f29ead88_1024x853.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>And as always, it&#8217;s still relevant.</p><p>&#8220;Java is dead&#8221; is its own <em>literary genre</em> by now. Paul Graham himself <a href="https://paulgraham.com/javacover.html">weighed in back in 2001</a> - we&#8217;ve had time to get used to it. Java survived applets, EJB, &#8220;XML everywhere,&#8221; the rise of Scala, Kotlin, Node.js, Go, Rust, and Python-as-the-one-true-language. It will survive &#8220;vibe coding killed enterprise Java&#8221; too.</p><p>But survival doesn&#8217;t mean no problems. Java has a real mindshare gap among new developers - and with every tweet like Steinberger&#8217;s, that gap widens. Few people have that kind of reach today.</p><div><hr></div><p>Peter Steinberger is a great builder - this is definitely the <strong>Age of Builders</strong>. What&#8217;s more, OpenClaw is a fascinating project. But 300,000 lines of unaudited code with <a href="https://cyberinsights.substack.com/p/is-openclaw-the-biggest-security">135K open instances</a>, <a href="https://blogs.cisco.com/ai/personal-ai-agents-like-openclaw-are-a-security-nightmare">Cisco</a> catching malware in skills, <a href="https://snyk.io/blog/toxicskills-malicious-ai-agent-skills-clawhub/">Snyk</a> finding 341 malicious packages, and Gartner saying &#8220;ban this&#8221; - that&#8217;s not proof that enterprise is dead. That&#8217;s proof that adoption &#8800; quality. We are not living in the <a href="https://www.youtube.com/watch?v=fwnAoTMWIMs&amp;t=695s">age of polished, Apple-like experience</a>, I agree, but there is a need for both approaches.</p><p>And the narrative that &#8220;<em>real programmers vibe, and the rest are enterprise boomers</em>&#8221; is toxic. We should name it for what it is.</p><p><strong>PS:</strong> Even if you&#8217;re up to date, still browse <a href="https://javaevolved.github.io/">java.evolved</a> yourself - 86 <em>old-vs-modern</em> comparisons are satisfying on an almost therapeutic level. Like organizing a sock drawer, but for programmers.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Java reaches for the GPU, Records fall off the Cliff, and Gatherers prove that Data Structures still matter - JVM Weekly vol. 162]]></title><description><![CDATA[Babylon finally gets its JEP, Brian Goetz opens a new chapter of data-oriented programming, and two gems from the ecosystem.]]></description><link>https://www.jvm-weekly.com/p/java-reaches-for-the-gpu-records</link><guid isPermaLink="false">https://www.jvm-weekly.com/p/java-reaches-for-the-gpu-records</guid><dc:creator><![CDATA[Artur Skowronski]]></dc:creator><pubDate>Thu, 12 Feb 2026 14:02:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!eSpS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55d9c097-185e-4f38-81af-42ce8f6bd894_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eSpS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55d9c097-185e-4f38-81af-42ce8f6bd894_1456x1048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eSpS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55d9c097-185e-4f38-81af-42ce8f6bd894_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!eSpS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55d9c097-185e-4f38-81af-42ce8f6bd894_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!eSpS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55d9c097-185e-4f38-81af-42ce8f6bd894_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!eSpS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55d9c097-185e-4f38-81af-42ce8f6bd894_1456x1048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eSpS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55d9c097-185e-4f38-81af-42ce8f6bd894_1456x1048.png" width="1456" height="1048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/55d9c097-185e-4f38-81af-42ce8f6bd894_1456x1048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1048,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1951481,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/187739382?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55d9c097-185e-4f38-81af-42ce8f6bd894_1456x1048.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!eSpS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55d9c097-185e-4f38-81af-42ce8f6bd894_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!eSpS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55d9c097-185e-4f38-81af-42ce8f6bd894_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!eSpS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55d9c097-185e-4f38-81af-42ce8f6bd894_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!eSpS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55d9c097-185e-4f38-81af-42ce8f6bd894_1456x1048.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Recent weeks are exceptionally juicy when it comes to &#8220;fundamentals.&#8221; We have two really big moves on the OpenJDK mailing lists - one I&#8217;ve been waiting for a long time, and another that could change the way we think about classes in Java. Plus two items from the ecosystem that are begging for attention. Let&#8217;s go.</p><h2><strong>1. Code Reflection Gets Its JEP - and Babylon Finally Speaks to GPUs in Java</strong></h2><p>Some of you probably remember that I&#8217;ve been repeating like a mantra for a while now that Project Babylon is one of the most exciting endeavors in the OpenJDK ecosystem. And at last we have something concrete to talk about - <strong><a href="https://openjdk.org/jeps/8361105">JEP draft: Code Reflection (Incubator)</a></strong>, owned by <strong><a href="https://www.linkedin.com/in/paul-sandoz-4704562/">Paul Sandoz</a></strong>, with reviewers including <strong><a href="https://www.linkedin.com/in/sotona/">Adam Sotona</a></strong> , <strong><a href="https://www.linkedin.com/in/juanjosefumeroalfonso/">Juan Fumero</a></strong> , and <strong><a href="https://www.linkedin.com/in/mcimadamore/">Maurizio Cimadamore</a></strong> . The very composition of such a trio should give you pause - we&#8217;re connecting the worlds of core Java, hardware accelerators, and the Foreign Function API.</p><p>Let&#8217;s start with what Code Reflection actually is, because I know not everyone follows Babylon as obsessively as I do. Traditional reflection in Java let us inspect classes, fields, and methods &#8212; but not the code inside those methods. Let me repeat: from Java 1.1 to today, reflection lets you find out that the method add takes two ints and returns an int, but doesn&#8217;t let you look <em>inside</em> and see what that method does. Code Reflection changes this situation fundamentally.</p><p>The mechanism works like this: we annotate a method or lambda expression with <code>@Reflect</code> (formerly <code>@CodeReflection</code> - the name refactoring is fairly recent). The javac compiler translates the internal code model into a standard <em>code model</em> - an immutable tree of <em>code elements</em> - and saves it in a separate class file associated with the original class. At runtime, we can retrieve this model via the API: Op.ofMethod(method) for methods, Op.ofLambda(instance) for lambdas. Sounds simple? Conceptually it is - but the consequences are enormous.</p><p>Because what can you do with a code model? You can traverse it, build one from scratch, transform it - and translate it into something entirely different. The JEP explicitly talks about &#8220;foreign programming models,&#8221; and GPU is the flagship example here. Instead of embedding CUDA C as strings in Java code (yes, people did this), you can write a normal Java lambda, annotate it with @Reflect, and let a library translate it into GPU code:</p><pre><code><code>dispatchKernel((@Reflect IntConsumer) i -&gt; {
    byte r = rgbImage[i * 3 + 0];
    byte g = rgbImage[i * 3 + 1];
    byte b = rgbImage[i * 3 + 2];
    grayImage[i] = gray(r, g, b);
});</code></code></pre><p>This isn&#8217;t pseudocode but a real vision of how a GPU library could work, extracting the code model from a lambda and generating the appropriate kernel from it. Crucially, the JEP explicitly emphasizes that it is <em>not</em> a goal for the JVM itself to run code on GPUs. This is a primitive that gives libraries the tools to do so. Just as the FFM API knows nothing about GPUs but lets you talk to them. The philosophy is the same: the platform provides building blocks, the ecosystem builds solutions from them.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0hG6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936d1090-9d40-4d64-9e71-1bbb7814d416_556x500.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0hG6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936d1090-9d40-4d64-9e71-1bbb7814d416_556x500.png 424w, https://substackcdn.com/image/fetch/$s_!0hG6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936d1090-9d40-4d64-9e71-1bbb7814d416_556x500.png 848w, https://substackcdn.com/image/fetch/$s_!0hG6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936d1090-9d40-4d64-9e71-1bbb7814d416_556x500.png 1272w, https://substackcdn.com/image/fetch/$s_!0hG6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936d1090-9d40-4d64-9e71-1bbb7814d416_556x500.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0hG6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936d1090-9d40-4d64-9e71-1bbb7814d416_556x500.png" width="556" height="500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/936d1090-9d40-4d64-9e71-1bbb7814d416_556x500.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:500,&quot;width&quot;:556,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!0hG6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936d1090-9d40-4d64-9e71-1bbb7814d416_556x500.png 424w, https://substackcdn.com/image/fetch/$s_!0hG6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936d1090-9d40-4d64-9e71-1bbb7814d416_556x500.png 848w, https://substackcdn.com/image/fetch/$s_!0hG6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936d1090-9d40-4d64-9e71-1bbb7814d416_556x500.png 1272w, https://substackcdn.com/image/fetch/$s_!0hG6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936d1090-9d40-4d64-9e71-1bbb7814d416_556x500.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>And that leads us to the second link in this section, which is a natural complement to the JEP. <a href="https://www.linkedin.com/in/juanjosefumeroalfonso/">Juan Fumero</a> (from the JEP&#8217;s review group - coincidence? I think not) published an <a href="https://openjdk.org/projects/babylon/articles/hat-matmul/hat-matmul">extensive article on optimizing matrix multiplication on GPUs from Java using Babylon and HAT (Heterogeneous Accelerator Toolkit)</a>. The article is technical, but it&#8217;s worth pushing through - because it shows what the practical use of Code Reflection looks like on the example of one of the most important algorithms of the AI era.</p><p>HAT is a framework built on Babylon that offers several key abstractions: an ND-Range API for defining GPU thread configurations (similar to OpenCL or CUDA), a Kernel-Context Layer for expressing per-thread code, a Compute-Context Layer for orchestrating multiple kernels, and an Interface Mapper for efficient memory mapping between CPU and GPU (based on Panama FFM). The programmer writes a Java method annotated with @Reflect, HAT extracts the code model from it, performs transformations, and generates the appropriate CUDA or OpenCL program.</p><p>And now for the numbers, because they speak louder than a thousand paragraphs. Fumero performs 1024&#215;1024 matrix multiplication on an NVIDIA A10 GPU, step by step optimizing the kernel: from naive 1D, through 2D, coalesced memory access, loop tiling with shared memory, register tiling, vectorization, all the way to FP16. The result? <strong>A jump from ~7 GFLOP/s on CPU (Java parallel streams) to ~14 TFLOP/s on GPU</strong> - close to native cuBLAS. Yes, you read that right: code written in Java, translated to CUDA by Babylon+HAT, achieves performance comparable to NVIDIA&#8217;s native library.</p><p>Not bad... not bad at all.</p><p>This changes the perspective. Project Sumatra in the 2010s tried to hide the GPU from the programmer - and failed, because GPUs are a fundamentally different execution model (&#8221;Single instruction, multiple threads&#8221;, separate memory, no polymorphism). HAT approaches this completely differently: it doesn&#8217;t pretend GPUs don&#8217;t exist but gives the Java developer tools for consciously programming for that architecture. And thanks to Code Reflection, it does so without leaving Java.</p><p>It&#8217;s worth adding that GPUs are just one of the use cases. The JEP explicitly mentions automatic differentiation, translating Java to SQL, and passing translated code to native ML runtimes. In an era where every framework wants to have an &#8220;AI story,&#8221; Java is getting the foundation on which that story can be told without needing to escape to Python at every tu</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!To3g!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb68b7e78-1b0b-4ff7-afa3-82152323f993_710x399.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!To3g!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb68b7e78-1b0b-4ff7-afa3-82152323f993_710x399.png 424w, https://substackcdn.com/image/fetch/$s_!To3g!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb68b7e78-1b0b-4ff7-afa3-82152323f993_710x399.png 848w, https://substackcdn.com/image/fetch/$s_!To3g!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb68b7e78-1b0b-4ff7-afa3-82152323f993_710x399.png 1272w, https://substackcdn.com/image/fetch/$s_!To3g!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb68b7e78-1b0b-4ff7-afa3-82152323f993_710x399.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!To3g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb68b7e78-1b0b-4ff7-afa3-82152323f993_710x399.png" width="710" height="399" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b68b7e78-1b0b-4ff7-afa3-82152323f993_710x399.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:399,&quot;width&quot;:710,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!To3g!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb68b7e78-1b0b-4ff7-afa3-82152323f993_710x399.png 424w, https://substackcdn.com/image/fetch/$s_!To3g!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb68b7e78-1b0b-4ff7-afa3-82152323f993_710x399.png 848w, https://substackcdn.com/image/fetch/$s_!To3g!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb68b7e78-1b0b-4ff7-afa3-82152323f993_710x399.png 1272w, https://substackcdn.com/image/fetch/$s_!To3g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb68b7e78-1b0b-4ff7-afa3-82152323f993_710x399.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>PS: The topic of GPUs in Java is particularly close to my heart, because just a week ago I had the chance to talk about it live - at <strong><a href="https://www.linkedin.com/company/jfokus/">Jfokus</a></strong> in Stockholm I presented<em> </em><strong><a href="https://github.com/ArturSkowronski/conference-jvm-in-age-ai-2026">JVM in the Age of AI</a></strong><em>,</em> where a significant part of the talk was dedicated to how Java is reaching for the GPU and why Babylon changes the rules of the game. The repo I linked has an set of different technologies already set-up, so you can check them by yourself.</p><h2><strong>2. Carrier Classes - Brian Goetz Beyond Records, or the End of the &#8220;Cliff&#8221;</strong></h2><p>Brian Goetz published on <strong><a href="https://mail.openjdk.org/pipermail/amber-spec-experts/2026-January/004307.html">amber-spec-experts</a></strong> one of those posts where it&#8217;s worth sitting down with a coffee, because it changes the map of where data-oriented programming in Java is heading. Title: <em><strong><a href="https://mail.openjdk.org/pipermail/amber-spec-experts/2026-January/004307.html">Data Oriented Programming, Beyond Records</a></strong> - </em>and yes, it&#8217;s exactly as big as it sounds.</p><p>The problem is well known to anyone who has ever started with a record and then realized they needed even one mutable field, or an internal representation different from the API, or inheritance. The result? A &#8220;cliff&#8221; - you fall off the full set of record benefits (automatic constructor, accessors, equals/hashCode/toString, destructuring in pattern matching) straight down to a bare class where you have to write all of it manually.</p><p>Visualization of your miserable experience.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LKXO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76d332e2-2251-4770-b256-0202acf4e302_640x476.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LKXO!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76d332e2-2251-4770-b256-0202acf4e302_640x476.gif 424w, https://substackcdn.com/image/fetch/$s_!LKXO!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76d332e2-2251-4770-b256-0202acf4e302_640x476.gif 848w, https://substackcdn.com/image/fetch/$s_!LKXO!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76d332e2-2251-4770-b256-0202acf4e302_640x476.gif 1272w, https://substackcdn.com/image/fetch/$s_!LKXO!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76d332e2-2251-4770-b256-0202acf4e302_640x476.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LKXO!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76d332e2-2251-4770-b256-0202acf4e302_640x476.gif" width="640" height="476" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/76d332e2-2251-4770-b256-0202acf4e302_640x476.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:476,&quot;width&quot;:640,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!LKXO!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76d332e2-2251-4770-b256-0202acf4e302_640x476.gif 424w, https://substackcdn.com/image/fetch/$s_!LKXO!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76d332e2-2251-4770-b256-0202acf4e302_640x476.gif 848w, https://substackcdn.com/image/fetch/$s_!LKXO!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76d332e2-2251-4770-b256-0202acf4e302_640x476.gif 1272w, https://substackcdn.com/image/fetch/$s_!LKXO!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76d332e2-2251-4770-b256-0202acf4e302_640x476.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>Goetz explicitly calls this a problem and finally proposes a solution - <strong>carrier classes</strong>.</p><p>A carrier class is a regular class declared with a <em>state description</em>, exactly like a record &#8212; but without record restrictions. It doesn&#8217;t have to be final. Fields don&#8217;t have to be final. It can inherit from something other than Record. The only commitment: the state description is a complete, canonical, nominal description of the object&#8217;s state &#8212; meaning if you extract those components and reconstruct the object, you get an &#8220;equivalent&#8221; instance. In return, the language gives you almost everything it gives records: deconstruction in pattern matching, sensible default Object methods, and (crucially!) support for the upcoming reconstruction with <em>with</em> expressions (<strong><a href="https://openjdk.org/jeps/468">JEP 468</a></strong>).</p><p>What excites me most about this proposal is the approach to bridging between the API and internal representation. Goetz introduces the concept of <strong>component fields</strong> &#8212; fields marked with the component modifier that tell the language: &#8220;this field is a direct representation of a component from my state description.&#8221; This lets the compiler generate an accessor &#8212; exactly like in records.</p><p>And when there <em>isn&#8217;t</em> a direct mapping? Goetz illustrates this with an elegant example of a class with state description (int x, int y, Optional&lt;String&gt; s) that internally stores s as a nullable String. In a record, this is impossible &#8212; the state description <em>is</em> the representation. In a carrier class, you write only the few lines that handle the difference: conversion in the constructor and in the accessor. The rest is derived.</p><p>This is actually the key motif of the entire document &#8212; the amount of help from the language should be proportional to the deviation from the record ideal. The closer to a record, the less code you write. The further away &#8212; the more, but <em>only</em> as much as the actual differences require. No cliff. Goetz literally writes:</p><blockquote><p>It would be nice if the author of this class only had to write the code that was different from what we could derive for a record.</p></blockquote><p>Compact constructors also get generalized. In records, the compact constructor frees you from assigning parameters to fields. In carrier classes, it frees you from initializing <em>component fields</em>, leaving you responsible only for fields that don&#8217;t map directly to components. In the extreme case, when all components have their component fields and you don&#8217;t need any additional logic &#8212; you can skip the compact constructor entirely. The end result looks like this:</p><pre><code><code>class Point(int x, int y) {
    private /* mutable */ component int x;
    private /* mutable */ component int y;
    // derived: compact constructor, accessors, equals, hashCode, toString
    // supports: pattern matching, with-expressions
}</code></code></pre><p>For someone who has been watching for years as Amber step by step builds a coherent vision of data-oriented programming, this document is a breakthrough moment. Records, sealed classes, and pattern matching were the first story arc. Carrier classes, with their generalized state description, compact constructors, and component fields, open the second arc - and finally provide the answer to the question that has been hanging in the air since JDK 14: &#8220;What if my class is <em>almost</em> a record?&#8221;</p><p>But man does not live by the JDK alone - let&#8217;s move on to the ecosystem.</p><h2><strong>3. Gatherers in Practice - or Why Data Structures Still Matter</strong></h2><p>Gatherers are one of those things that &#8220;finally&#8221; made it into the standard library (with finalization in JDK 24), but their practical applications are only now crystallizing in developers&#8217; heads. <strong><a href="https://www.linkedin.com/in/gpiwowarek/">Grzegorz Piwowarek</a></strong>, current maintainer of Vavr, decided to change that, presenting a case study of implementing a Gatherer that returns the last N elements of a stream - like limit() from the other end.</p><p>And here&#8217;s the catch, because his article <strong><a href="https://4comprehension.com/java-last-gatherer/">Implementing Efficient Last Stream Elements Gatherer in Java</a></strong> isn&#8217;t a dry tutorial on &#8220;how to implement a Gatherer.&#8221; It&#8217;s a story about optimization, profiling, and choosing the right data structure - guided step by step, with JMH benchmarks and flamegraphs from async-profiler. Grzegorz starts with a naive implementation on ArrayList, moves through buffering, <em>ArrayDeque</em>, circular buffer, all the way to power-of-two bit masking - and at each stage shows <em>why</em> the previous version was slow.</p><p>The results speak for themselves: from ~1.3 ops/s in the first version (where ArrayList.removeFirst() was copying the entire array on every element!) to over 100 ops/s in the final version with a circular buffer sized to a power of two. Nearly a hundredfold jump. And the climactic moment is dropping down to the assembly level, where Piwowarek shows that the modulo operation (sdiv + msub on ARM) costs 7 to 21 cycles, while a bitwise AND after aligning the size to a power of two - 1&#8211;2 cycles. That kind of <em>detour</em> through <em>Integer.highestOneBit()</em> and a bit mask is something that wouldn&#8217;t occur to you if you were coding &#8220;by eye&#8221; - but it makes a huge difference.</p><p>So yes - the article is ostensibly about Gatherers, but really about the fact that even in 2026, when we have Virtual Threads, Structured Concurrency, and AI-generated code, the ability to choose the right data structure and profile at the assembly level is still what separates &#8220;it works&#8221; from &#8220;it works well.&#8221; If you haven&#8217;t played with the Gatherers API yet - this is a great entry point. And if you have but haven&#8217;t done benchmarks - time to catch up.</p><h2><strong>4. True Gem: Java UI in 2026 - The Complete Guide</strong></h2><p>To finish, something that is a little gem in its own right - <strong><a href="https://www.linkedin.com/article/edit/7427316416225198080/#">Robin Tegg</a></strong>, a developer from <strong><a href="https://www.linkedin.com/company/createfuture-digital/">CreateFuture</a></strong>, <strong><a href="https://robintegg.com/2026/02/08/java-ui-in-2026-the-complete-guide.html">compiled a complete overview of UI frameworks</a></strong> available in the Java ecosystem in 2026, divided into four platforms: desktop, web, mobile, and terminal.</p><p>Why is this a gem? Because nobody normally does compilations like this - and if they do, they&#8217;re either superficial or immediately outdated. Tegg covered 25+ frameworks (yes, really!), from obvious choices like JavaFX, Vaadin, and Compose Desktop, through Gluon Mobile and Codename One on mobile, all the way to terminals with JLine. Each framework gets a summary, a code example, and links to documentation. There&#8217;s also a &#8220;quick reference guide&#8221; organized by scenarios - looking for full-stack Java without JavaScript? Vaadin or Wicket. Cross-platform mobile? Codename One. And so on.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TQSj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfbd3ff3-cfa5-4e4a-a219-587721520547_1488x948.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TQSj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfbd3ff3-cfa5-4e4a-a219-587721520547_1488x948.png 424w, https://substackcdn.com/image/fetch/$s_!TQSj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfbd3ff3-cfa5-4e4a-a219-587721520547_1488x948.png 848w, https://substackcdn.com/image/fetch/$s_!TQSj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfbd3ff3-cfa5-4e4a-a219-587721520547_1488x948.png 1272w, https://substackcdn.com/image/fetch/$s_!TQSj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfbd3ff3-cfa5-4e4a-a219-587721520547_1488x948.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TQSj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfbd3ff3-cfa5-4e4a-a219-587721520547_1488x948.png" width="1456" height="928" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bfbd3ff3-cfa5-4e4a-a219-587721520547_1488x948.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:928,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!TQSj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfbd3ff3-cfa5-4e4a-a219-587721520547_1488x948.png 424w, https://substackcdn.com/image/fetch/$s_!TQSj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfbd3ff3-cfa5-4e4a-a219-587721520547_1488x948.png 848w, https://substackcdn.com/image/fetch/$s_!TQSj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfbd3ff3-cfa5-4e4a-a219-587721520547_1488x948.png 1272w, https://substackcdn.com/image/fetch/$s_!TQSj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfbd3ff3-cfa5-4e4a-a219-587721520547_1488x948.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">My darling is Casciian - Text User Interface library</figcaption></figure></div><p>The article&#8217;s conclusion is one that&#8217;s hard to disagree with: Java UI development is alive, modern, and production-ready on every platform. React and the JavaScript ecosystem dominate in mindshare, but Java frameworks power critical applications in the largest enterprises, banks, and government institutions, serving hundreds of millions of users. Add to that the fact that most of the described frameworks are open source &#8212; so if you&#8217;re looking for something to contribute to or simply want to know what your options are &#8212; this is your starting point.</p><div><hr></div><p><strong>PS:</strong> I know this issue is a bit heavier than usual - but both the JEP on Code Reflection and Goetz&#8217;s post on carrier classes are documents worth reading in full. If you only have time for one, go with Goetz - carrier classes are about the everyday code we all write. The Babylon JEP is wonderful, but if you&#8217;re not programming GPUs or writing frameworks, it&#8217;s more of a medium-term perspective (though a fascinating one).</p><p>And let&#8217;s be honest - who among us hasn&#8217;t had an &#8220;almost-record&#8221; in their life? &#128521;</p>]]></content:encoded></item><item><title><![CDATA[Understanding MCP Through Raw STDIO Communication with David Parry - JVM Weekly vol. 161]]></title><description><![CDATA[This month: MCP demystified, garbage collection wisdom, processor architecture deep dives, and IDE productivity tricks.]]></description><link>https://www.jvm-weekly.com/p/understanding-mcp-through-raw-stdio</link><guid isPermaLink="false">https://www.jvm-weekly.com/p/understanding-mcp-through-raw-stdio</guid><dc:creator><![CDATA[Artur Skowronski]]></dc:creator><pubDate>Thu, 05 Feb 2026 14:03:50 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!RLf0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa476f42-900e-44a1-8f39-09cfe7502ba2_1920x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RLf0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa476f42-900e-44a1-8f39-09cfe7502ba2_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RLf0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa476f42-900e-44a1-8f39-09cfe7502ba2_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!RLf0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa476f42-900e-44a1-8f39-09cfe7502ba2_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!RLf0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa476f42-900e-44a1-8f39-09cfe7502ba2_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!RLf0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa476f42-900e-44a1-8f39-09cfe7502ba2_1920x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RLf0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa476f42-900e-44a1-8f39-09cfe7502ba2_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aa476f42-900e-44a1-8f39-09cfe7502ba2_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2197024,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/186864274?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa476f42-900e-44a1-8f39-09cfe7502ba2_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!RLf0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa476f42-900e-44a1-8f39-09cfe7502ba2_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!RLf0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa476f42-900e-44a1-8f39-09cfe7502ba2_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!RLf0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa476f42-900e-44a1-8f39-09cfe7502ba2_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!RLf0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa476f42-900e-44a1-8f39-09cfe7502ba2_1920x1080.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Today I&#8217;m handing over the main feature to a guest author. Recently on the <strong><a href="https://foojay.io/">foojay.io</a></strong>, <strong><a href="https://www.linkedin.com/in/daviddryparry?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAADIt58BI4WgTq3puEpMaIuepkC3GQGr2SE">David Parry</a></strong> from <strong><a href="https://www.linkedin.com/company/qodoai/">Qodo</a></strong> published what I consider <strong><a href="https://foojay.io/today/understanding-mcp-through-raw-stdio-communication/">one of the best technical deep-dives on MCP I&#8217;ve ever read</a></strong>. If you&#8217;ve been scratching your head about how AI assistants actually communicate with external tools - not at the SDK level, but at the raw protocol level - this is the piece you&#8217;ve been waiting for.</p><p>I asked David (in person, as we are both on <strong><a href="https://www.linkedin.com/company/jfokus/">Jfokus</a></strong> Today!) whether he&#8217;d let me feature it in JVM Weekly. The answer was a &#8220;yes&#8221; &#10084;&#65039;.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2><strong>Understanding MCP Through Raw STDIO Communication</strong></h2><p><em>Ever wondered how AI assistants like Claude actually communicate with external tools and services? While most tutorials focus on using pre-built SDKs and frameworks, this article takes a different approach&#8212;we&#8217;ll dissect a production MCP server built from scratch using only Java&#8217;s standard libraries and raw STDIO communication.</em></p><p><em>By stripping away all the abstractions and implementing the Model Context Protocol directly, we&#8217;ll uncover the surprisingly elegant mechanics that enable AI systems to discover, understand, and execute tools.</em></p><p><em>Whether you&#8217;re building AI integrations, debugging mysterious protocol errors, or simply curious about what really happens when an AI &#8220;uses a tool,&#8221; this deep dive will transform JSON-RPC messages flowing through stdin/stdout from abstract concepts into concrete, debuggable reality.</em></p><p><em>No frameworks, no magic&#8212;just the protocol in its purest form.</em></p><blockquote><p><strong>Want to build this yourself?</strong> This article is based on code from the <strong><a href="https://github.com/David-Parry/agent-mcp-workshop">Agent MCP Workshop</a></strong>, an instructor-led workshop that guides you through building a complete MCP server from scratch. The workshop includes hands-on exercises, detailed explanations, and practical examples that complement the concepts discussed in this article.</p></blockquote><h3><strong>Understanding MCP Through Raw STDIO Communication</strong></h3><p>The Model Context Protocol (MCP) represents a paradigm shift in how AI systems interact with external tools and data sources. This article dives deep into the protocol&#8217;s STDIO-based communication layer, examining a real-world Java implementation built without frameworks to better understand how the protocol and communication actually work at the fundamental level.</p><p>By implementing MCP from scratch using only standard Java libraries, we gain invaluable insights into the protocol&#8217;s inner workings&#8212;insights often hidden by higher-level abstractions and frameworks. This bare-metal approach reveals the elegant simplicity underlying MCP&#8217;s powerful capabilities.</p><h3><strong>Why STDIO? The Power of Universal Communication</strong></h3><p>Before diving into the implementation, it&#8217;s crucial to understand why MCP chose STDIO (Standard Input/Output) as its primary transport mechanism. STDIO provides:</p><ul><li><p><strong>Universal compatibility</strong>: Every programming language can read from stdin and write to stdout</p></li><li><p><strong>Process isolation</strong>: Natural security boundaries between the AI client and tool server</p></li><li><p><strong>Simplicity</strong>: No network configuration, firewall rules, or authentication complexity</p></li><li><p><strong>Debugging ease</strong>: Messages can be logged, inspected, and replayed</p></li></ul><p>This implementation demonstrates these principles by building everything from scratch&#8212;no MCP SDK, no framework dependencies, just pure Java interacting with STDIO streams.</p><p>At the heart of any MCP implementation lies a robust transport layer. The Java implementation demonstrates a clean separation of concerns through its I/O handler architecture:</p><pre><code><code>public class IOHandlerImpl implements IOHandler {
    private final static LogFile logger = LogFileWriter.getInstance();
    private final PrintWriter writer;
    private final List&lt;Consumer&lt;String&gt;&gt; lineListeners;
    private final AtomicBoolean running;
    private final Gson gson = new Gson();
    @Override
    public void emit(Object message) {
        String text = gson.toJson(message);
        logger.log("[API][SENT]: " + text);
        writer.println(text);
        writer.flush();
    }
    @Override
    public void startInputReader() {
        if (running.get()) {
            return; // Already running
        }
        try (Scanner scanner = new Scanner(System.in)) {
            running.set(true);
            while (running.get()) {
                if (!scanner.hasNextLine()) {
                    running.set(false);
                    break;
                }
                String line = scanner.nextLine();
                logger.log("[API][RECEIVED]" + line);
                publishLine(line);
            }
        }
    }
}</code></code></pre><p>This implementation showcases several critical design decisions:</p><ul><li><p><strong>Direct STDIO access</strong>: Reading from <code>System.in</code> and writing to <code>System.out</code> without buffering frameworks</p></li><li><p><strong>Thread-safe operations</strong> using <code>AtomicBoolean</code> and <code>CopyOnWriteArrayList</code></p></li><li><p><strong>Event-driven architecture</strong> with listener patterns for incoming messages</p></li><li><p><strong>Line-based protocol</strong>: Each JSON-RPC message is a complete line, enabling simple parsing</p></li><li><p><strong>Comprehensive logging</strong> that writes to files (never stdout!) for debugging</p></li></ul><p>The beauty of this approach is its transparency. When the server emits a message:</p><pre><code><code>public void emit(Object message) {
    String text = gson.toJson(message);
    logger.log("[API][SENT]: " + text);  // Log to file, not stdout!
    writer.println(text);  // Send to stdout
    writer.flush();        // Ensure immediate delivery
}</code></code></pre><p>The message goes directly to stdout as a single line of JSON. No framing, no length prefixes, no binary protocols&#8212;just newline-delimited JSON that any tool can read and debug.</p><h3><strong>Understanding the JSON-RPC Message Flow</strong></h3><p>MCP uses JSON-RPC 2.0 over STDIO, which means every message is a self-contained JSON object on a single line. Let&#8217;s trace through an actual message exchange to see how this works:</p><h3><strong>Client &#8594; Server: Initialization Request</strong></h3><pre><code><code>{"jsonrpc":"2.0","method":"initialize","params":{"protocolVersion":"0.1.0","capabilities":{"roots":{},"sampling":{}},"clientInfo":{"name":"mcp-inspector","version":"0.1.0"}},"id":0}</code></code></pre><p>This single line contains everything needed for initialization. The server reads it from stdin using:</p><pre><code><code>String line = scanner.nextLine();
logger.log("[API][RECEIVED]" + line);
publishLine(line);  // Notify the router</code></code></pre><h3><strong>Server &#8594; Client: Initialization Response</strong></h3><pre><code><code>{"jsonrpc":"2.0","id":0,"result":{"protocolVersion":"0.1.0","capabilities":{"tools":{},"prompts":{},"resources":{}},"serverInfo":{"name":"agent-mcp-workshop","version":"0.0.1"}}}</code></code></pre><p>The server writes this response directly to stdout. No HTTP headers, no WebSocket frames - just a line of JSON followed by a newline character.</p><h3><strong>The Message Type Hierarchy</strong></h3><p>The implementation uses Java records to model the JSON-RPC message types:</p><pre><code><code>public record JsonRpcRequest(
    String jsonrpc,
    Long id,
    String method,
    Object params
) {}

public record JsonRpcNotification(
    String jsonrpc,
    String method,
    Object params
) {}  // Note: No id field for notifications!

public record JsonRpcResponse(
    String jsonrpc,
    Long id,
    Object result
) {}

public record JsonRpcErrorResponse(
    String jsonrpc,
    Long id,
    JsonRpcError error
) {}</code></code></pre><p>This type system directly maps to the JSON-RPC 2.0 specification, making the protocol implementation clear and type-safe.</p><p>Every MCP session begins with a crucial initialization handshake. The implementation demonstrates how servers advertise their capabilities:</p><pre><code><code>case INITIALIZE -&gt; {
    InitializeParams initializeParams = deserializer.deserializeParams(
        message, InitializeParams.class
    );
    ClientCapabilities clientCapabilities = initializeParams.capabilities();
    if (clientCapabilities.roots() != null) {
        hasRoots = true;
    }
    if (clientCapabilities.sampling() != null) {
        hasSampling = true;
    }
    InitializeResultBuilder builder = InitializeResultBuilder
            .builder()
            .withProtocolVersion(initializeParams.protocolVersion())
            .withDefaultCapabilities()
            .withDefaultServerInfo();
    success(message.id(), builder.build());
}</code></code></pre><p>This approach allows servers to clearly declare what they support, enabling intelligent capability negotiation between clients and servers.</p><h3><strong>Bidirectional Communication: Beyond Request-Response</strong></h3><p>One of MCP&#8217;s powerful features is true bidirectional communication. The server can send requests to the client, not just respond to them. This implementation demonstrates this with the roots feature:</p><pre><code><code>case NOTIFICATIONS_INITIALIZED -&gt; {
    // Server initiates a request to the client!
    if (hasRoots) {
        io.emit(rootsRequest);
    }
}</code></code></pre><p>The <code>rootsRequest</code> is a server-initiated message:</p><pre><code><code>private static final JsonRpcRequest rootsRequest = new JsonRpcRequest(
    JSON_RPC_VERSION, 
    ROOTS_REQUEST_ID,  // Negative ID to avoid conflicts
    "roots/list", 
    null
);</code></code></pre><p>When the client responds, the server processes it just like any other response:</p><pre><code><code>private void process(JsonRpcResponse message) {
    if (ROOTS_REQUEST_ID.equals(message.id())) {
        RootsResponse rootsResponse = deserializer.deserializeResult(
            message, RootsResponse.class
        );
        roots.clear();
        for (Root root : rootsResponse.roots()) {
            roots.add(root.uri());
        }
    }
}</code></code></pre><p>This bidirectional flow over STDIO demonstrates that MCP isn&#8217;t limited to simple request-response patterns&#8212;it&#8217;s a full-duplex protocol where both parties can initiate communication.</p><p>The routing mechanism demonstrates how MCP servers handle different message types:</p><pre><code><code>public void route(String message) {
    if (message == null || message.isEmpty()) {
        return;
    }
    Object object = deserializer.deserialize(message);
    switch (object) {
        case JsonRpcRequest request -&gt; process(request);
        case JsonRpcNotification notification -&gt; process(notification);
        case JsonRpcResponse successResponse -&gt; process(successResponse);
        case JsonRpcErrorResponse errorResponse -&gt; process(errorResponse);
        default -&gt; logger.log("Unknown message type: " + object);
    }
}</code></code></pre><p>This pattern matching approach (using Java&#8217;s modern switch expressions) creates a clean, extensible routing system. Each message type has its own processing logic:</p><pre><code><code>private void process(JsonRpcRequest message) {
    UniqueKeys uniqueKey = UniqueKeys.fromValue(message.method());
    switch (uniqueKey) {
        case INITIALIZE -&gt; { /* ... */ }
        case PROMPTS_LIST -&gt; { /* ... */ }
        case PROMPTS_GET -&gt; { /* ... */ }
        case TOOLS_LIST -&gt; { /* ... */ }
        case TOOLS_CALL -&gt; { /* ... */ }
        case RESOURCES_LIST -&gt; { /* ... */ }
        case RESOURCES_READ -&gt; { /* ... */ }
        case PING -&gt; { /* ... */ }
        default -&gt; logger.log("Unhandled RpcRequest method: " + uniqueKey);
    }
}</code></code></pre><h3><strong>The Complete STDIO Loop: Putting It All Together</strong></h3><p>Let&#8217;s trace through a complete interaction to see how STDIO communication enables MCP:</p><h3><strong>1. Server Startup</strong></h3><pre><code><code>public void start() {
    // Register the router to handle incoming lines
    this.io.addLineListener(router::route);

    // Start reading from stdin in a separate thread
    this.io.startInputReader();

    // Keep the main thread alive
    keepRunning();
}</code></code></pre><h3><strong>2. Client Connects (via process spawn)</strong></h3><p>The client spawns the server process and connects to its stdin/stdout:</p><pre><code><code>java -jar agent-mcp-workshop-0.0.1.jar</code></code></pre><h3><strong>3. Message Exchange Begins</strong></h3><pre><code><code>&#8594; [stdin]  {"jsonrpc":"2.0","method":"initialize","params":{...},"id":0}
&#8592; [stdout] {"jsonrpc":"2.0","id":0,"result":{...}}
&#8594; [stdin]  {"jsonrpc":"2.0","method":"notifications/initialized"}
&#8592; [stdout] {"jsonrpc":"2.0","method":"roots/list","id":-1000}
&#8594; [stdin]  {"jsonrpc":"2.0","id":-1000,"result":{"roots":[...]}}</code></code></pre><p>Each arrow represents a complete line written to stdin or stdout. The server never writes partial messages or multiple messages on one line&#8212;maintaining the protocol&#8217;s simplicity.</p><h3><strong>4. Error Handling Without Exceptions</strong></h3><p>Since STDIO doesn&#8217;t have error channels like HTTP status codes, errors are part of the protocol:</p><pre><code><code>success(message.id(), ToolCallResultBuilder
    .builder()
    .addTextContent("Tool not found: " + toolCallParams.name())
    .asError()
    .build());</code></code></pre><p>This creates a valid response with an error flag, keeping the STDIO stream clean and the protocol predictable.</p><p>The keyword search tool demonstrates how to create self-describing, executable functionality:</p><pre><code><code>public class KeyWordSearch implements Tool {
    @Override
    public String name() {
        return "key_word_search";
    }

    @Override
    public String description() {
        return "Searches for a specified keyword across all files in a project. " +
               "Returns the total count of matches and the absolute file paths " +
               "of the files containing the keyword.";
    }

    @Override
    public InputSchema schema() {
        InputSchemaBuilder builder = InputSchemaBuilder
                .builder()
                .withType("object")
                .addProperty(PropertySchemaBuilder
                        .builder()
                        .withKey("keyword")
                        .withType("string")
                        .withDescription("the keyword to search for in a file")
                        .required());
        if (this.roots == null || this.roots.isEmpty()) {
            builder.addProperty(PropertySchemaBuilder
                    .builder()
                    .withKey("root_directory")
                    .withType("string")
                    .withDescription("The absolute path to the root directory")
                    .required());
        }
        return builder.build();
    }
}</code></code></pre><p>The schema definition is particularly important&#8212;it enables AI clients to understand exactly how to invoke the tool. The actual implementation showcases robust file handling:</p><pre><code><code>public ToolCallResult call(ToolCallParams toolCallParams) {
    String keyword = toolCallParams.arguments().get("keyword");
    ToolCallResultBuilder builder = ToolCallResultBuilder.builder();

    if (roots.isEmpty()) {
        builder.addTextContent("No root directories specified for search.");
        builder.asError();
    } else {
        List&lt;ContentItem&gt; contentItems = searchKeywordInDirectories(roots, keyword);
        builder.withContent(contentItems);
    }
    return builder.build();
}</code></code></pre><h3><strong>Debugging STDIO Communication</strong></h3><p>One of the advantages of building MCP without frameworks is the ability to debug at the protocol level. The implementation includes comprehensive logging:</p><pre><code><code>logger.log("[API][RECEIVED]" + line);  // Every incoming message
logger.log("[API][SENT]: " + text);     // Every outgoing message</code></code></pre><p>This creates a complete trace of the STDIO communication:</p><pre><code><code>[2024-01-15 10:23:45] [API][RECEIVED]{"jsonrpc":"2.0","method":"tools/list","id":5}
[2024-01-15 10:23:45] [API][SENT]: {"jsonrpc":"2.0","id":5,"result":{"tools":[{"name":"key_word_search","description":"Searches for a specified keyword...","inputSchema":{...}}]}}
[2024-01-15 10:23:46] [API][RECEIVED]{"jsonrpc":"2.0","method":"tools/call","params":{"name":"key_word_search","arguments":{"keyword":"TODO"}},"id":6}
[2024-01-15 10:23:47] [API][SENT]: {"jsonrpc":"2.0","id":6,"result":{"content":[{"text":"/src/main/java/Server.java, keyword_count=3","type":"text"}]}}</code></code></pre><p>This trace can be replayed for testing, analyzed for performance, or used to debug protocol issues&#8212;something much harder with framework-heavy implementations.</p><pre><code><code>case RESOURCES_LIST -&gt; {
    ResourcesListResultBuilder builder = ResourcesListResultBuilder
            .builder()
            .withResources(JavadocResources.loadAllHtmlResourcesFromFolder(
                "javadoc/com/workshop/mcp/spec"
            ))
            .withNextCursor("pageNext");
    success(message.id(), builder.build());
}</code></code></pre><p>The JavadocResources class shows sophisticated resource handling:</p><pre><code><code>public static String readResourceContent(String resourcePath) throws IOException {
    try (InputStream inputStream = JavadocResources.class.getClassLoader()
                                                         .getResourceAsStream(resourcePath)) {
        if (inputStream == null) {
            throw new IOException("Resource not found: " + resourcePath);
        }

        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(inputStream))) {
            return reader.lines().collect(Collectors.joining("\n"));
        }
    }
}</code></code></pre><p>This approach allows servers to bundle and serve documentation, configurations, or any other static content directly from the JAR file&#8212;all transmitted as JSON over STDIO. When a client requests a resource:</p><pre><code><code>&#8594; {"jsonrpc":"2.0","method":"resources/read","params":{"uri":"javadoc/com/workshop/mcp/spec/Tool.html"},"id":10}
&#8592; {"jsonrpc":"2.0","id":10,"result":{"contents":[{"uri":"javadoc/com/workshop/mcp/spec/Tool.html","mimeType":"text/html","text":"&lt;!DOCTYPE HTML&gt;..."}]}}</code></code></pre><p>The entire HTML document is embedded in the JSON response, properly escaped and transmitted as a single line. This demonstrates STDIO&#8217;s flexibility&#8212;it can handle everything from simple method calls to large content transfers.</p><h3><strong>Prompts: Bridging Human Intent and Tool Execution</strong></h3><p>The prompt system creates user-friendly interfaces for tools:</p><pre><code><code>case PROMPTS_LIST -&gt; {
    KeyWordSearch keyWordSearch = new KeyWordSearch(this.roots);
    PromptsListResultBuilder builder = PromptsListResultBuilder
            .builder()
            .withPrompt("search_keyword",
                        "Creates a prompt, to search for a word using the " + 
                        keyWordSearch.name() + " tool.")
            .withPromptArgument("keyword", "The word to search for", true)
            .withNextCursor("nextPage");
    success(message.id(), builder.build());
}</code></code></pre><p>When retrieving a prompt, the server can provide intelligent guidance:</p><pre><code><code>case PROMPTS_GET -&gt; {
    PromptsGetParams params = deserializer.deserializeParams(
        message, PromptsGetParams.class
    );
    PromptsGetResultBuilder builder = PromptsGetResultBuilder
            .builder()
            .withDescription("keyword")
            .addTextMessage("user", KEY_WORD_MESSAGE, params.arguments());
    success(message.id(), builder.build());
}</code></code></pre><h3><strong>Advanced Features: Notification Handling</strong></h3><p>The implementation includes sophisticated notification handling:</p><pre><code><code>private void process(JsonRpcNotification message) {
    UniqueKeys uniqueKey = UniqueKeys.fromValue(message.method());
    switch (uniqueKey) {
        case NOTIFICATIONS_INITIALIZED -&gt; {
            if (hasRoots) {
                io.emit(rootsRequest);
            }
        }
        case NOTIFICATIONS_ROOTS_LIST_CHANGED -&gt; {
            io.emit(rootsRequest);
        }
        case NOTIFICATION_CANCELLED -&gt; {
            NotificationCancelledParams params = deserializer.deserializeParams(
                message, NotificationCancelledParams.class
            );
            logger.log("Notification cancelled reason " + params.reason());
        }
        default -&gt; logger.log("Unhandled notification method: " + uniqueKey);
    }
}</code></code></pre><p>This shows how servers can react to client-side events and maintain synchronized state.</p><h3><strong>Server Lifecycle Management</strong></h3><p>The Server class demonstrates robust lifecycle management:</p><pre><code><code>public class Server {
    private final AtomicBoolean isShuttingDown = new AtomicBoolean(false);
    private final CountDownLatch shutdownLatch;

    public void start() {
        try {
            this.io.addLineListener(router::route);

            Runtime.getRuntime().addShutdownHook(new Thread(() -&gt; {
                if (isShuttingDown.compareAndSet(false, true)) {
                    stop();
                    logger.close();
                    shutdownLatch.countDown();
                }
            }));

            this.io.startInputReader();
            keepRunning();
        } catch (Exception e) {
            logger.log("Error in main method", e);
            stop();
            System.exit(0);
        }
    }
}</code></code></pre><p>The use of shutdown hooks and countdown latches ensures graceful termination even in complex scenarios.</p><h3><strong>Key Architectural Patterns</strong></h3><p><strong>1. Record Types for Protocol Messages</strong></p><pre><code><code>public record JsonRpcRequest(
    String jsonrpc,
    Long id,
    String method,
    Object params
) {}</code></code></pre><p>Java records provide immutable, self-documenting protocol structures.</p><p><strong>2. Builder Pattern for Complex Responses</strong></p><pre><code><code>InitializeResult result = InitializeResultBuilder.builder()
    .withProtocolVersion("1.0")
    .withServerInfo("my-server", "1.0.0")
    .withDefaultCapabilities()
    .build();</code></code></pre><p>Builders ensure valid, complete responses while maintaining readability.</p><p><strong>3. Enum-Based Method Routing</strong></p><pre><code><code>public enum UniqueKeys {
    INITIALIZE("initialize"),
    NOTIFICATIONS_INITIALIZED("notifications/initialized"),
    PROMPTS_LIST("prompts/list"),
    // ... more methods

    public static UniqueKeys fromValue(String value) {
        for (UniqueKeys key : UniqueKeys.values()) {
            if (key.value.equalsIgnoreCase(value)) {
                return key;
            }
        }
        return NOT_FOUND;
    }
}</code></code></pre><p>This approach provides type-safe method handling with built-in validation.</p><h3><strong>Why Building Without Frameworks Matters</strong></h3><p>This implementation deliberately avoids MCP SDKs or frameworks to reveal important insights:</p><h3><strong>1. The Protocol is Simple</strong></h3><p>At its core, MCP is just JSON-RPC 2.0 over newline-delimited streams. No magic, no hidden complexity&#8212;just structured messages over STDIO.</p><h3><strong>2. Debugging is Straightforward</strong></h3><p>Without framework abstractions, every message is visible and every routing decision is explicit. Problems can be traced directly to protocol-level issues.</p><h3><strong>3. Portability is Maximized</strong></h3><p>This implementation could be ported to any language that can read stdin and write stdout&#8212;no framework dependencies to worry about.</p><h3><strong>4. Understanding is Complete</strong></h3><p>By implementing from scratch, developers gain deep understanding of:</p><ul><li><p>How capability negotiation works</p></li><li><p>Why message IDs matter</p></li><li><p>How bidirectional communication flows</p></li><li><p>What makes MCP transport-agnostic</p></li></ul><h3><strong>5. Performance is Transparent</strong></h3><p>Without framework overhead, the performance characteristics are clear:</p><ul><li><p>Message parsing time = JSON deserialization</p></li><li><p>Routing overhead = switch statement</p></li><li><p>I/O latency = STDIO buffering</p></li></ul><h3><strong>Conclusion: The Elegance of STDIO-Based Protocols</strong></h3><p>This deep dive into a framework-free MCP implementation reveals the elegant simplicity at the protocol&#8217;s heart. By using STDIO as the transport layer, MCP achieves:</p><ul><li><p><strong>Universal compatibility</strong>: Any language that can read and write text can implement MCP</p></li><li><p><strong>Process isolation</strong>: Natural security boundaries without complex authentication</p></li><li><p><strong>Debugging transparency</strong>: Every message is visible and reproducible</p></li><li><p><strong>Deployment simplicity</strong>: No ports, no certificates, no network configuration</p></li></ul><p>The implementation demonstrates that building AI-integrated tools doesn&#8217;t require complex frameworks or abstractions. At its core, MCP is about structured communication&#8212;JSON messages flowing over STDIO streams, enabling AI systems to discover and use tools in a standardized way.</p><p>By understanding these fundamentals through a bare-metal implementation, developers gain the knowledge to:</p><ul><li><p>Build MCP servers in any language or environment</p></li><li><p>Debug protocol issues at the message level</p></li><li><p>Optimize performance by understanding the actual costs</p></li><li><p>Extend the protocol while maintaining compatibility</p></li></ul><p>As AI continues to evolve, the ability to create tools that AI can understand and use becomes increasingly valuable. This implementation shows that such integration doesn&#8217;t require magic&#8212;just careful attention to protocol details and disciplined STDIO handling.</p><p>The Model Context Protocol&#8217;s choice of STDIO as its primary transport isn&#8217;t just a technical decision&#8212;it&#8217;s a philosophical one. It says that AI-tool integration should be simple, debuggable, and accessible to everyone. By building without frameworks, we see this philosophy in action: powerful capabilities emerging from simple, well-designed primitives.</p><p>Whether you&#8217;re building the next generation of AI tools or simply understanding how AI systems communicate, the lessons from this STDIO-based implementation provide a solid foundation for creating robust, interoperable systems that bridge the gap between human intentions and machine capabilities.</p><div><hr></div><h3><strong>Learn By Building: The Agent MCP Workshop</strong></h3><p>If you found this deep dive valuable and want to build your own MCP server from the ground up, check out the <strong><a href="https://github.com/David-Parry/agent-mcp-workshop">Agent MCP Workshop</a></strong> on GitHub. This instructor-led workshop takes you through five progressive lessons:</p><ol><li><p><strong>Building the Transport Layer</strong> - Create a robust STDIO communication foundation</p></li><li><p><strong>Understanding the Protocol</strong> - Implement JSON-RPC message handling</p></li><li><p><strong>Protocol Handshake &amp; Routing</strong> - Build initialization and message dispatch</p></li><li><p><strong>Implementing Capabilities</strong> - Add Resources, Tools, and Prompts</p></li><li><p><strong>Agent Integration</strong> - Connect your MCP server with AI agents</p></li></ol><p>The workshop provides hands-on experience with the exact code examined in this article, along with exercises, debugging techniques, and best practices for production deployment. Whether you&#8217;re learning solo or in a group setting, the workshop materials offer a structured path to MCP mastery.</p><p>Start building your own AI-integrated tools today: <strong><a href="http://github.com/David-Parry/agent-mcp-workshop">github.com/David-Parry/agent-mcp-workshop</a></strong></p><div><hr></div><p><em>Originally published at <strong><a href="http://foojay.io/">Foojay.io</a></strong> on July 2025.</em></p><div><hr></div><p>And now, let&#8217;s review some of the other cool things that appeared on <strong><a href="http://foojay.io/">Foojay.io</a></strong> last month&#8230;</p><h2><strong>Foojay Podcast #89: Quarkus and Agentic Commerce</strong></h2><p>The latest Foojay Podcast episode features <strong><a href="https://www.linkedin.com/preload/#">Frank Delporte</a></strong> discussing Quarkus with <strong><a href="https://www.linkedin.com/in/ACoAABOkgE8BuIPimp0fXEt5FOnFbORY0hCYCdc?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAABOkgE8BuIPimp0fXEt5FOnFbORY0hCYCdc">Michal Mal&#233;&#345;</a></strong> and <strong><a href="https://www.linkedin.com/preload/#">Holly Cummins</a></strong>, and the conversation goes in some unexpected directions.</p><p>Sure, they cover the expected ground - how Quarkus compares to other frameworks, the build-time optimization vs AOT vs JIT debate, and the impact on cloud costs (both financial and ecological). But things get really interesting when they dive into &#8220;chain transactions&#8221; and how nano businesses could serve as a model for paying content creators through standards like x402 and ERC-8004.</p><p>The discussion on whether MCP could serve as a content distribution mechanism (with Quarkus, naturally) at the 46-minute mark is worth the listen alone, especially in early 2026 where world visibly got crazy. It&#8217;s one of those podcasts that starts technical and ends up philosophical - in the best possible way.</p><div><hr></div><h3><strong>The Ultimate 10 Years Java Garbage Collection Guide (2016&#8211;2026)</strong></h3><p><strong><a href="https://www.linkedin.com/preload/#">Alexius Dionysius Diakogiannis</a></strong> in <strong><a href="https://foojay.io/today/the-ultimate-10-years-java-garbage-collection-guide-2016-2026-choosing-the-right-gc-for-every-workload/">The Ultimate 10 Years Java Garbage Collection Guide (2016&#8211;2026)</a></strong> has put together what might be the definitive guide to choosing the right garbage collector for your workload.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sWY_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb843ed-a040-4f9e-bdbf-630abf614ddf_1166x1418.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sWY_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb843ed-a040-4f9e-bdbf-630abf614ddf_1166x1418.png 424w, https://substackcdn.com/image/fetch/$s_!sWY_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb843ed-a040-4f9e-bdbf-630abf614ddf_1166x1418.png 848w, https://substackcdn.com/image/fetch/$s_!sWY_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb843ed-a040-4f9e-bdbf-630abf614ddf_1166x1418.png 1272w, https://substackcdn.com/image/fetch/$s_!sWY_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb843ed-a040-4f9e-bdbf-630abf614ddf_1166x1418.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sWY_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb843ed-a040-4f9e-bdbf-630abf614ddf_1166x1418.png" width="1166" height="1418" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0fb843ed-a040-4f9e-bdbf-630abf614ddf_1166x1418.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1418,&quot;width&quot;:1166,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!sWY_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb843ed-a040-4f9e-bdbf-630abf614ddf_1166x1418.png 424w, https://substackcdn.com/image/fetch/$s_!sWY_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb843ed-a040-4f9e-bdbf-630abf614ddf_1166x1418.png 848w, https://substackcdn.com/image/fetch/$s_!sWY_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb843ed-a040-4f9e-bdbf-630abf614ddf_1166x1418.png 1272w, https://substackcdn.com/image/fetch/$s_!sWY_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb843ed-a040-4f9e-bdbf-630abf614ddf_1166x1418.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>And yes, the title is ambitious, but the content delivers.</p><p>For years, the standard advice was &#8220;G1 is always best.&#8221; With Generational ZGC arriving in JDK 21-25, that&#8217;s no longer true. Generational ZGC achieves roughly 10% better throughput than its single-generation predecessor and prevents the allocation stalls that plagued earlier versions. The guide provides specific recommendations for different workload types - microservices, legacy JEE, stateful UI applications, and data-intensive batch processing.</p><p>If you&#8217;re still running with default GC settings in production (don&#8217;t worry, no judgment here &#128521;), this is your weekend reading.</p><h3><strong>Java on Single Board Computers: x86 vs ARM vs RISC-V</strong></h3><p>Frank Delporte is not only a Java Champion and Foojay Podcast host, but also an author of <strong><a href="https://www.amazon.se/-/en/Frank-Delporte/dp/1907920919">Getting Started with Java on the Raspberry Pi</a></strong> is expanding beyond his Raspberry Pi comfort zone in 2026. <strong><a href="https://foojay.io/today/java-on-single-board-computers-x86-vs-arm-vs-risc-v/">Java on Single Board Computers: x86 vs ARM vs RISC-V</a></strong>, his comparison of x86, ARM, and RISC-V architectures for Java development is exactly what you&#8217;d expect from Frank - thorough, practical, and full of the kind of details only someone who actually uses these boards would know.</p><p>The RISC-V section is particularly interesting for those of us watching that ecosystem mature. The good news: Java officially supports RISC-V with the OpenJDK RISC-V Port. The less good news: early implementations like the Kylin X1 are still 2-7x slower than Raspberry Pi 5 in benchmarks. But hey, RISC-V is open source and licensing-fee-free, so expect rapid improvement in the tooling.</p><p>Especially as it&#8217;s important part of the recent trade conflict.</p><div><hr></div><h3><strong>Command Completion: IntelliJ IDEA with Less Shortcuts</strong></h3><p>How many shortcuts can you remember? Three? Five? <strong><a href="https://www.linkedin.com/preload/#">&#128105;&#127995;&#128187; Marit van Dijk</a></strong> , Java Champion and Developer Advocate at <strong><a href="https://www.linkedin.com/preload/#">JetBrains</a></strong> , asks the question we&#8217;ve all been afraid to answer - even before ourselves.</p><p>The new <strong><a href="https://www.jetbrains.com/help/idea/command-completion.html">command completion feature</a></strong> in <strong><a href="https://www.linkedin.com/preload/#">IntelliJ IDEA</a></strong> (..) lets you discover and execute IDE actions right from your editor - no shortcut memorization required. Type two dots after any symbol, and you&#8217;ll see all relevant commands for your current context. Want to rename a class but forgot Shift+F6? Just type .. and filter for <em>rename</em>. Need to add JavaDoc? you know the drill - <em>..add javadoc</em>. Some commands even have aliases, so <em>..change name</em> works just as well.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hq5D!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14bcb657-6a66-4af8-9bd9-b7f3af98f83f_1488x849.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hq5D!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14bcb657-6a66-4af8-9bd9-b7f3af98f83f_1488x849.png 424w, https://substackcdn.com/image/fetch/$s_!hq5D!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14bcb657-6a66-4af8-9bd9-b7f3af98f83f_1488x849.png 848w, https://substackcdn.com/image/fetch/$s_!hq5D!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14bcb657-6a66-4af8-9bd9-b7f3af98f83f_1488x849.png 1272w, https://substackcdn.com/image/fetch/$s_!hq5D!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14bcb657-6a66-4af8-9bd9-b7f3af98f83f_1488x849.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hq5D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14bcb657-6a66-4af8-9bd9-b7f3af98f83f_1488x849.png" width="1456" height="831" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/14bcb657-6a66-4af8-9bd9-b7f3af98f83f_1488x849.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:831,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!hq5D!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14bcb657-6a66-4af8-9bd9-b7f3af98f83f_1488x849.png 424w, https://substackcdn.com/image/fetch/$s_!hq5D!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14bcb657-6a66-4af8-9bd9-b7f3af98f83f_1488x849.png 848w, https://substackcdn.com/image/fetch/$s_!hq5D!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14bcb657-6a66-4af8-9bd9-b7f3af98f83f_1488x849.png 1272w, https://substackcdn.com/image/fetch/$s_!hq5D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14bcb657-6a66-4af8-9bd9-b7f3af98f83f_1488x849.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>It&#8217;s one of those features that sounds minor but actually changes how you interact with the IDE. The article walks through fixing errors, performing file-level actions, refactoring, and navigation - all without leaving the flow of coding.</p><div><hr></div><h3><strong>Why is My Talk Selected? Reflections from a Program Committee Reviewer</strong></h3><p>And finally, something for those of you eyeing the CFP deadlines on your calendar. <strong><a href="https://www.linkedin.com/preload/#">Soham Dasgupta</a></strong>, drawing on his experience as a reviewer for Voxxed Days Amsterdam and organizer of internal meetups, shares the criteria that guide talk selection. If you&#8217;ve ever wondered why some submissions get accepted while others don&#8217;t (and you&#8217;ve definitely wondered), this explains the decision-making process.</p><p>The article breaks down selection criteria into two categories: speaker/talk-related reasons (clarity, originality, relevance, speaker credibility) and organization/program-related reasons (diversity, schedule balance, avoiding duplication). The most valuable part: understanding that rejection isn&#8217;t personal - it&#8217;s often about schedule fit, topic balance, or simply too many good submissions.</p><p>The honest admission that &#8220;as reviewers, we actively welcome a percentage of new speakers&#8221; is refreshing. The advice to share your story - not just technology features - resonates with what I&#8217;ve seen work at conferences. And the practical tip about including a recording link with your submission? Worth the read for that alone.</p><div><hr></div><p><strong>BTW:</strong> Big thanks to <strong><a href="https://www.linkedin.com/preload/#">David Parry</a></strong> for the guest feature this month. It was great to see you on <strong><a href="https://www.linkedin.com/preload/#">Jfokus</a></strong> man!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jV_2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44ef8441-618d-4968-b3c8-c5f6c85df2f9_2594x1636.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jV_2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44ef8441-618d-4968-b3c8-c5f6c85df2f9_2594x1636.png 424w, https://substackcdn.com/image/fetch/$s_!jV_2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44ef8441-618d-4968-b3c8-c5f6c85df2f9_2594x1636.png 848w, https://substackcdn.com/image/fetch/$s_!jV_2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44ef8441-618d-4968-b3c8-c5f6c85df2f9_2594x1636.png 1272w, https://substackcdn.com/image/fetch/$s_!jV_2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44ef8441-618d-4968-b3c8-c5f6c85df2f9_2594x1636.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jV_2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44ef8441-618d-4968-b3c8-c5f6c85df2f9_2594x1636.png" width="1456" height="918" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/44ef8441-618d-4968-b3c8-c5f6c85df2f9_2594x1636.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:918,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!jV_2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44ef8441-618d-4968-b3c8-c5f6c85df2f9_2594x1636.png 424w, https://substackcdn.com/image/fetch/$s_!jV_2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44ef8441-618d-4968-b3c8-c5f6c85df2f9_2594x1636.png 848w, https://substackcdn.com/image/fetch/$s_!jV_2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44ef8441-618d-4968-b3c8-c5f6c85df2f9_2594x1636.png 1272w, https://substackcdn.com/image/fetch/$s_!jV_2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44ef8441-618d-4968-b3c8-c5f6c85df2f9_2594x1636.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><div><hr></div><p><strong>BTW2:</strong> <strong><a href="https://lp.jetbrains.com/intellij-idea-conf-2026/">IntelliJ IDEA Conf 2026</a></strong> is coming! March 26-27, free virtual event - speakers are already published, schedule drops the week of Feb 9th.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5_Ef!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d9d4d97-5bb0-4c97-b719-86c272cf917b_2118x794.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5_Ef!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d9d4d97-5bb0-4c97-b719-86c272cf917b_2118x794.png 424w, https://substackcdn.com/image/fetch/$s_!5_Ef!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d9d4d97-5bb0-4c97-b719-86c272cf917b_2118x794.png 848w, https://substackcdn.com/image/fetch/$s_!5_Ef!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d9d4d97-5bb0-4c97-b719-86c272cf917b_2118x794.png 1272w, https://substackcdn.com/image/fetch/$s_!5_Ef!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d9d4d97-5bb0-4c97-b719-86c272cf917b_2118x794.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5_Ef!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d9d4d97-5bb0-4c97-b719-86c272cf917b_2118x794.png" width="1456" height="546" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5d9d4d97-5bb0-4c97-b719-86c272cf917b_2118x794.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:546,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!5_Ef!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d9d4d97-5bb0-4c97-b719-86c272cf917b_2118x794.png 424w, https://substackcdn.com/image/fetch/$s_!5_Ef!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d9d4d97-5bb0-4c97-b719-86c272cf917b_2118x794.png 848w, https://substackcdn.com/image/fetch/$s_!5_Ef!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d9d4d97-5bb0-4c97-b719-86c272cf917b_2118x794.png 1272w, https://substackcdn.com/image/fetch/$s_!5_Ef!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d9d4d97-5bb0-4c97-b719-86c272cf917b_2118x794.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>List is enormous, just to mention <strong><a href="https://www.linkedin.com/in/joshlong?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAACXdIABb8VbfXttpb7WA9oliQsXOS5rEgw">Josh Long</a></strong> <strong><a href="https://www.linkedin.com/in/ana-maria-mihalceanu-1508?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAABXqw0QBu2HI61OOQ3EjBx7-8UgU2qjR0GU">Ana-Maria Mihalceanu</a></strong> <strong><a href="https://www.linkedin.com/in/ivargrimstad?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAAAkn5EBL-LMSCU0hlflPKA68GHpiC5_L9E">Ivar Grimstad</a></strong> <strong><a href="https://www.linkedin.com/in/thomaswue?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAALgD8UBEd7ToDMexb-VFcsUqWw0ex98GNk">Thomas Wuerthinger</a></strong>, <strong><a href="https://www.linkedin.com/in/vikgamov?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAALuUOcBVVCNeRoCrzD9swNF5o-4dP-HCtw">Viktor Gamov</a></strong> <strong><a href="https://www.linkedin.com/in/marklpollack?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAAFFPQsB0AA8ANLBR5-NZHSZ49btNAuLrN0">Mark Pollack</a></strong>... the list is just to long, and that&#8217;s not including the team from JetBrains as a hosts and speakers: <strong><a href="https://www.linkedin.com/in/maritvandijk?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAABTrrUBkEpJHcE7DhISqzTYvp3chPybB30">&#128105;&#127995;&#8205;&#128187; Marit van Dijk</a></strong> <strong><a href="https://www.linkedin.com/in/arunpgupta?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAAAGKPcB5pgoCL5O5bA9JQAJ88G1QAbnlDA">Arun Gupta</a></strong> <strong><a href="https://www.linkedin.com/in/antonarhipov?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAAAIqV0BMWOVjz1k3Zvfz8Wp6Hzr4kjPwjA">&#128083; Anton Arhipov</a></strong> <strong><a href="https://www.linkedin.com/in/evborisov?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAADO7LkBQu8ObB4b5X49vrlFwgrjzGK6tRI">Evgeny Borisov</a></strong> and <strong><a href="https://x.com/sivalabs">Siva Katamreddy.</a></strong></p><div><hr></div><p><strong>BTW3:</strong> KotlinConf 2026 is also on the horizon - more information soon! &#128073; <strong><a href="http://kotlinconf.com/">kotlinconf.com</a></strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ErgC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faafdc9ca-0a68-489c-8681-37363fc680e0_1832x578.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ErgC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faafdc9ca-0a68-489c-8681-37363fc680e0_1832x578.png 424w, https://substackcdn.com/image/fetch/$s_!ErgC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faafdc9ca-0a68-489c-8681-37363fc680e0_1832x578.png 848w, https://substackcdn.com/image/fetch/$s_!ErgC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faafdc9ca-0a68-489c-8681-37363fc680e0_1832x578.png 1272w, https://substackcdn.com/image/fetch/$s_!ErgC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faafdc9ca-0a68-489c-8681-37363fc680e0_1832x578.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ErgC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faafdc9ca-0a68-489c-8681-37363fc680e0_1832x578.png" width="1456" height="459" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aafdc9ca-0a68-489c-8681-37363fc680e0_1832x578.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:459,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!ErgC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faafdc9ca-0a68-489c-8681-37363fc680e0_1832x578.png 424w, https://substackcdn.com/image/fetch/$s_!ErgC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faafdc9ca-0a68-489c-8681-37363fc680e0_1832x578.png 848w, https://substackcdn.com/image/fetch/$s_!ErgC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faafdc9ca-0a68-489c-8681-37363fc680e0_1832x578.png 1272w, https://substackcdn.com/image/fetch/$s_!ErgC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faafdc9ca-0a68-489c-8681-37363fc680e0_1832x578.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong>BTW4:</strong> A bit of selfplug at the end:</p><p>&#11088;&#11088;&#11088;&#11088; New chapters of <strong><a href="https://www.manning.com/books/vibe-engineering">Vibe Engineering: Best Practices, Mistakes and Tradeoffs</a></strong> just dropped on <strong><a href="https://www.linkedin.com/preload/#">Manning Publications Co.</a></strong> MEAP &#11088;&#11088;&#11088;&#11088;</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9M1Z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F876912ac-377a-4123-ac4d-190048f021bf_1400x350.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9M1Z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F876912ac-377a-4123-ac4d-190048f021bf_1400x350.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9M1Z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F876912ac-377a-4123-ac4d-190048f021bf_1400x350.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9M1Z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F876912ac-377a-4123-ac4d-190048f021bf_1400x350.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9M1Z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F876912ac-377a-4123-ac4d-190048f021bf_1400x350.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9M1Z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F876912ac-377a-4123-ac4d-190048f021bf_1400x350.jpeg" width="1400" height="350" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/876912ac-377a-4123-ac4d-190048f021bf_1400x350.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:350,&quot;width&quot;:1400,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!9M1Z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F876912ac-377a-4123-ac4d-190048f021bf_1400x350.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9M1Z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F876912ac-377a-4123-ac4d-190048f021bf_1400x350.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9M1Z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F876912ac-377a-4123-ac4d-190048f021bf_1400x350.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9M1Z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F876912ac-377a-4123-ac4d-190048f021bf_1400x350.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p></p><p>What&#8217;s in the new content? The things nobody seems to talk about - methodological approach and performance engineering techniques. No &#8220;10 magical prompts&#8221;, but also no &#8220;I let &#129438; rewrite my entire codebase in the weekend&#8221; - just methodology you can actually use regardless of which model is trending this week.</p><p>The core idea: engineering discipline comes from process, not from the model. Every technique comes from a year of daily testing with our team at VirtusLab - we stress-test every new trend (and eat the failures) so you don&#8217;t have to.</p><p>&#128073; <strong><a href="http://hubs.la/Q03XhKmG0">hubs.la/Q03XhKmG0</a></strong> &#127903;&#65039; Save 40% with code: <strong>WATCHLELEK240</strong></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[December / January Wrap Up and Release Radar  - JVM Weekly vol. 160]]></title><description><![CDATA[I&#8217;ve gathered many interesting links that didn&#8217;t make it into previous issues. Many aren&#8217;t extensive enough for a full section, but they still seem compelling enough to share.]]></description><link>https://www.jvm-weekly.com/p/december-and-january-the-rest-of</link><guid isPermaLink="false">https://www.jvm-weekly.com/p/december-and-january-the-rest-of</guid><dc:creator><![CDATA[Artur Skowronski]]></dc:creator><pubDate>Thu, 22 Jan 2026 14:00:46 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!fndQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36316c6c-b6fc-44ca-836a-4649188149ed_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fndQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36316c6c-b6fc-44ca-836a-4649188149ed_1456x1048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fndQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36316c6c-b6fc-44ca-836a-4649188149ed_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!fndQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36316c6c-b6fc-44ca-836a-4649188149ed_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!fndQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36316c6c-b6fc-44ca-836a-4649188149ed_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!fndQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36316c6c-b6fc-44ca-836a-4649188149ed_1456x1048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fndQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36316c6c-b6fc-44ca-836a-4649188149ed_1456x1048.png" width="1456" height="1048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/36316c6c-b6fc-44ca-836a-4649188149ed_1456x1048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1048,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1852675,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/185292223?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36316c6c-b6fc-44ca-836a-4649188149ed_1456x1048.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fndQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36316c6c-b6fc-44ca-836a-4649188149ed_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!fndQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36316c6c-b6fc-44ca-836a-4649188149ed_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!fndQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36316c6c-b6fc-44ca-836a-4649188149ed_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!fndQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36316c6c-b6fc-44ca-836a-4649188149ed_1456x1048.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Also: we&#8217;re publishing this issue a week earlier than usual, because I&#8217;m on vacation next one &#128521;. To make up for it, this edition is a combined one (December + January). December edition didn&#8217;t happened due to holidays - so we&#8217;ll catch up with one solid package.</p><h2><strong>1. Missed in December / January</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WKk9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d307fe9-a70c-4f79-8a41-af14e1d5b35e_1170x772.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WKk9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d307fe9-a70c-4f79-8a41-af14e1d5b35e_1170x772.png 424w, https://substackcdn.com/image/fetch/$s_!WKk9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d307fe9-a70c-4f79-8a41-af14e1d5b35e_1170x772.png 848w, https://substackcdn.com/image/fetch/$s_!WKk9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d307fe9-a70c-4f79-8a41-af14e1d5b35e_1170x772.png 1272w, https://substackcdn.com/image/fetch/$s_!WKk9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d307fe9-a70c-4f79-8a41-af14e1d5b35e_1170x772.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WKk9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d307fe9-a70c-4f79-8a41-af14e1d5b35e_1170x772.png" width="1170" height="772" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9d307fe9-a70c-4f79-8a41-af14e1d5b35e_1170x772.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:772,&quot;width&quot;:1170,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!WKk9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d307fe9-a70c-4f79-8a41-af14e1d5b35e_1170x772.png 424w, https://substackcdn.com/image/fetch/$s_!WKk9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d307fe9-a70c-4f79-8a41-af14e1d5b35e_1170x772.png 848w, https://substackcdn.com/image/fetch/$s_!WKk9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d307fe9-a70c-4f79-8a41-af14e1d5b35e_1170x772.png 1272w, https://substackcdn.com/image/fetch/$s_!WKk9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d307fe9-a70c-4f79-8a41-af14e1d5b35e_1170x772.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Let&#8217;s start with a small celebration - JetBrains is marking an extraordinary milestone: <strong>IntelliJ IDEA turns 25 this year!</strong> &#127881; The first release of the IDE appeared in January 2001 and was one of the very first Java development environments to offer advanced code navigation and built-in refactoring capabilities. I have to admit, it never occurred to me that it&#8217;s only five years younger than Java itself &#128515;.</p><p>To celebrate the anniversary, JetBrains prepared a <strong>special page</strong> with a game in which Runzo - the mascot of the Run button - breaks free from the IDE and travels across the IntelliJ IDEA universe.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!htC4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48678567-102d-421a-a256-b0a78a4b50fa_1252x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!htC4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48678567-102d-421a-a256-b0a78a4b50fa_1252x1000.png 424w, https://substackcdn.com/image/fetch/$s_!htC4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48678567-102d-421a-a256-b0a78a4b50fa_1252x1000.png 848w, https://substackcdn.com/image/fetch/$s_!htC4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48678567-102d-421a-a256-b0a78a4b50fa_1252x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!htC4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48678567-102d-421a-a256-b0a78a4b50fa_1252x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!htC4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48678567-102d-421a-a256-b0a78a4b50fa_1252x1000.png" width="1252" height="1000" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/48678567-102d-421a-a256-b0a78a4b50fa_1252x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1000,&quot;width&quot;:1252,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!htC4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48678567-102d-421a-a256-b0a78a4b50fa_1252x1000.png 424w, https://substackcdn.com/image/fetch/$s_!htC4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48678567-102d-421a-a256-b0a78a4b50fa_1252x1000.png 848w, https://substackcdn.com/image/fetch/$s_!htC4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48678567-102d-421a-a256-b0a78a4b50fa_1252x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!htC4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48678567-102d-421a-a256-b0a78a4b50fa_1252x1000.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>PS:</strong> The game was created by <strong><a href="https://www.linkedin.com/preload/#">Alexander Chatzizacharias</a></strong> - if you&#8217;ve never seen his talks, make sure to catch up. Pure joy and true hacker energy.</p><div id="youtube2-TSlYrs4ywc8" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;TSlYrs4ywc8&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/TSlYrs4ywc8?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><p>InfoQ has released the Java Trends Report 2025, and it&#8217;s packed with insights.</p><p>In the 2024 edition, you could still feel the post&#8211;AI-carnival sobriety (&#8220;wild west&#8221;, less of a hammer-for-everything mindset, more common sense).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5QYP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F882ad7cf-742a-412f-86b5-9faf588fe914_744x371.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5QYP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F882ad7cf-742a-412f-86b5-9faf588fe914_744x371.png 424w, https://substackcdn.com/image/fetch/$s_!5QYP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F882ad7cf-742a-412f-86b5-9faf588fe914_744x371.png 848w, https://substackcdn.com/image/fetch/$s_!5QYP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F882ad7cf-742a-412f-86b5-9faf588fe914_744x371.png 1272w, https://substackcdn.com/image/fetch/$s_!5QYP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F882ad7cf-742a-412f-86b5-9faf588fe914_744x371.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5QYP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F882ad7cf-742a-412f-86b5-9faf588fe914_744x371.png" width="744" height="371" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/882ad7cf-742a-412f-86b5-9faf588fe914_744x371.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:371,&quot;width&quot;:744,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!5QYP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F882ad7cf-742a-412f-86b5-9faf588fe914_744x371.png 424w, https://substackcdn.com/image/fetch/$s_!5QYP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F882ad7cf-742a-412f-86b5-9faf588fe914_744x371.png 848w, https://substackcdn.com/image/fetch/$s_!5QYP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F882ad7cf-742a-412f-86b5-9faf588fe914_744x371.png 1272w, https://substackcdn.com/image/fetch/$s_!5QYP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F882ad7cf-742a-412f-86b5-9faf588fe914_744x371.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>In 2025, AI on the JVM looks less like an exotic animal in a zoo and more like a new neighbor in the apartment block: it has its own frameworks and libraries (the report mentions, among others, Spring AI, LangChain4j, and friends), so the conversation shifts from &#8220;<em>should we?</em>&#8221; to &#8220;<em>how do we deliver this sensibly?</em>&#8221;.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!15J3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d72a4b6-8eba-4741-a29b-691a60add442_1488x863.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!15J3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d72a4b6-8eba-4741-a29b-691a60add442_1488x863.png 424w, https://substackcdn.com/image/fetch/$s_!15J3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d72a4b6-8eba-4741-a29b-691a60add442_1488x863.png 848w, https://substackcdn.com/image/fetch/$s_!15J3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d72a4b6-8eba-4741-a29b-691a60add442_1488x863.png 1272w, https://substackcdn.com/image/fetch/$s_!15J3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d72a4b6-8eba-4741-a29b-691a60add442_1488x863.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!15J3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d72a4b6-8eba-4741-a29b-691a60add442_1488x863.png" width="1456" height="844" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9d72a4b6-8eba-4741-a29b-691a60add442_1488x863.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:844,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!15J3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d72a4b6-8eba-4741-a29b-691a60add442_1488x863.png 424w, https://substackcdn.com/image/fetch/$s_!15J3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d72a4b6-8eba-4741-a29b-691a60add442_1488x863.png 848w, https://substackcdn.com/image/fetch/$s_!15J3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d72a4b6-8eba-4741-a29b-691a60add442_1488x863.png 1272w, https://substackcdn.com/image/fetch/$s_!15J3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d72a4b6-8eba-4741-a29b-691a60add442_1488x863.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>The second big change is modernization - in 2025 it&#8217;s no longer a side note but a full-fledged program, with automation front and center. The report explicitly points to OpenRewrite is there as the dominant tool for industrial-scale upgrades and refactoring, which sounds like another step toward a world where we stop doing &#8220;heroic migrations&#8221; and start simply&#8230; running them in the pipeline. And when it comes to Java versions: 2024 liked to count adoption (17, 11, 8&#8230; and a cautious approach to 21), while 2025 leans harder into the &#8220;baseline&#8221; narrative - Java 17+ as the new normal, with Java 25 as a symbolic anchor: &#8220;modernity isn&#8217;t a hobby, it&#8217;s the standard.&#8221;</p><p>As you see, there is far more different changes - personally, I&#8217;m still eager to see Java on Arm and CRaC moved to Early Majority, but we probably need to wait till the 2026.</p><div><hr></div><p>Here we go again - not a repeat of Log4Shell, but still serious. On December 19, 2025, a new vulnerability (<strong><a href="https://nvd.nist.gov/vuln/detail/CVE-2025-68161">CVE-2025-68161</a></strong>) was disclosed in Apache Log4j Core, affecting versions from 2.0-beta9 up to 2.25.2. December once again reminded us that security-related technical debt never truly disappears, even four years after the original Log4Shell incident.</p><p>The issue resides in the SocketAppender component, which sends logs over the network to a remote log server. Affected versions did not properly enforce TLS hostname verification, meaning the client could accept any certificate issued by a trusted CA - even for the wrong domain. This opens the door to Man-in-the-Middle attacks and potential leakage of sensitive data often found in logs (tokens, personal data, SQL fragments).</p><p>The fix is straightforward: upgrade to Log4j 2.25.3, which restores strict hostname verification. As always, teams should urgently scan not only direct but also transitive dependencies - Log4j has a habit of hiding where you least expect it.</p><div><hr></div><p><strong><a href="https://www.linkedin.com/in/adam-bien?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAFD6XUABU_hBuyEQ7HbNtKEZHvTaDYgdSII">Adam Bien</a></strong> AirHacks delivers as always, but this episode is a real gem. In the latest <strong><a href="http://airhacks.fm/">AirHacks.fm</a></strong> conversation, <strong><a href="https://www.linkedin.com/in/thomaswue?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAALgD8UBEd7ToDMexb-VFcsUqWw0ex98GNk">Thomas Wuerthinger</a></strong> walks through the current direction and future of <strong>GraalVM</strong> - from changes in release cadence and a focus on Java LTS versions only, through the growing importance of Python and AI, to the increasingly tight integration with Oracle Database.</p><p>The discussion spans Oracle Multilingual Engine, running Python and JavaScript directly inside the database, native images as stored procedures, database-native serverless and scale-to-zero, CRaC-like application snapshotting in user space, WebAssembly as a deployment target for edge functions, and very concrete insights into why native image matters beyond startup time...</p><p>Together, it paints a picture of GraalVM evolving from a startup-time optimization tool into a foundational platform for running business logic closer to the data. And taking into account recent lack of insight into project, such a peek into the belly of the beast is always interesting.</p><div><hr></div><p>An important update for the unit testing community: <strong><a href="https://www.linkedin.com/in/timvanderlippe?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAABR4flsBiJD6gCBMriobrVJ1Ik7DVeFq5uM">Tim van der Lippe</a></strong> has <strong><a href="https://github.com/mockito/mockito/issues/3777">announced that he is stepping down as a maintainer of Mockito</a></strong> after a decade of work. His departure is a loud warning signal about the relationship between platform developers and library maintainers in the Java ecosystem.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MSLj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa040d3a4-2329-4dd5-8e26-af68122acfac_744x259.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MSLj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa040d3a4-2329-4dd5-8e26-af68122acfac_744x259.png 424w, https://substackcdn.com/image/fetch/$s_!MSLj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa040d3a4-2329-4dd5-8e26-af68122acfac_744x259.png 848w, https://substackcdn.com/image/fetch/$s_!MSLj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa040d3a4-2329-4dd5-8e26-af68122acfac_744x259.png 1272w, https://substackcdn.com/image/fetch/$s_!MSLj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa040d3a4-2329-4dd5-8e26-af68122acfac_744x259.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MSLj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa040d3a4-2329-4dd5-8e26-af68122acfac_744x259.png" width="744" height="259" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a040d3a4-2329-4dd5-8e26-af68122acfac_744x259.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:259,&quot;width&quot;:744,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!MSLj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa040d3a4-2329-4dd5-8e26-af68122acfac_744x259.png 424w, https://substackcdn.com/image/fetch/$s_!MSLj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa040d3a4-2329-4dd5-8e26-af68122acfac_744x259.png 848w, https://substackcdn.com/image/fetch/$s_!MSLj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa040d3a4-2329-4dd5-8e26-af68122acfac_744x259.png 1272w, https://substackcdn.com/image/fetch/$s_!MSLj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa040d3a4-2329-4dd5-8e26-af68122acfac_744x259.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>At the technical core of the issue are changes introduced in <strong>OpenJDK</strong> starting with Java 22, related to dynamic JVM agent attachment. Mockito relies on deep bytecode manipulation at runtime to mock final classes, static methods, or private methods - historically achieved via dynamically attaching a Java agent. In the name of security (&#8220;Integrity by Default&#8221;), the JVM now requires explicit user opt-in for such behavior. While the goal is reasonable from a platform security perspective, Tim argues that the changes were effectively a &#8220;done deal,&#8221; introduced without providing alternative APIs that would allow library authors to achieve the same goals in a supported, safe way.</p><p>Tim&#8217;s exit - and his move to the <strong>Servo</strong> project written in Rust - highlights a deeper, systemic problem. Libraries like <strong>Mockito</strong> are critical infrastructure for millions of Java tests. When platform-level decisions force hundreds of hours of unpaid work onto volunteer maintainers, the model starts to break down. The ecosystem doesn&#8217;t just lose code - it loses hard-won expertise. The fact that a maintainer of Tim&#8217;s caliber is seeking &#8220;joy in programming&#8221; outside the JVM should be a moment of reflection for Java&#8217;s architects - even if it&#8217;s very hard to argue with their argumentation about cleaning up the platform.</p><div><hr></div><p>And last but not least in that section... we started with the celebration, we will end with a celebration: We have another Polish Java Champion - <strong><a href="https://www.linkedin.com/in/gpiwowarek?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAAzYVX0BKtRwsFLUJI4wI_HdMI2A3qSiA28">Grzegorz Piwowarek</a>!</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9Ldb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe115cfb5-fe91-4d66-a479-f506d00ceeb2_1488x918.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9Ldb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe115cfb5-fe91-4d66-a479-f506d00ceeb2_1488x918.png 424w, https://substackcdn.com/image/fetch/$s_!9Ldb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe115cfb5-fe91-4d66-a479-f506d00ceeb2_1488x918.png 848w, https://substackcdn.com/image/fetch/$s_!9Ldb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe115cfb5-fe91-4d66-a479-f506d00ceeb2_1488x918.png 1272w, https://substackcdn.com/image/fetch/$s_!9Ldb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe115cfb5-fe91-4d66-a479-f506d00ceeb2_1488x918.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9Ldb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe115cfb5-fe91-4d66-a479-f506d00ceeb2_1488x918.png" width="1456" height="898" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e115cfb5-fe91-4d66-a479-f506d00ceeb2_1488x918.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:898,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!9Ldb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe115cfb5-fe91-4d66-a479-f506d00ceeb2_1488x918.png 424w, https://substackcdn.com/image/fetch/$s_!9Ldb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe115cfb5-fe91-4d66-a479-f506d00ceeb2_1488x918.png 848w, https://substackcdn.com/image/fetch/$s_!9Ldb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe115cfb5-fe91-4d66-a479-f506d00ceeb2_1488x918.png 1272w, https://substackcdn.com/image/fetch/$s_!9Ldb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe115cfb5-fe91-4d66-a479-f506d00ceeb2_1488x918.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Grzegorz is the leader of <strong><a href="https://www.linkedin.com/company/wjug/">Warsaw Java User Group</a></strong>, a program committee member of JDD and <strong><a href="https://www.linkedin.com/company/4developers/">4Developers</a></strong>, author of <strong><a href="http://4comprehension.com/">4comprehension.com</a></strong> - and also the current maintainer of<strong> Vavr</strong>. Over the years, he has delivered 150+ conference talks and 85+ hands-on workshops, shaping both the Polish and international Java communities.</p><p>A well-deserved recognition - and a perfect segue into the next section.</p><p>We are starting Release Radar.</p><h2><strong>2. Release Radar</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KiEH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3917818c-fa83-4236-a0a0-57ca1f4468e3_1156x764.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KiEH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3917818c-fa83-4236-a0a0-57ca1f4468e3_1156x764.png 424w, https://substackcdn.com/image/fetch/$s_!KiEH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3917818c-fa83-4236-a0a0-57ca1f4468e3_1156x764.png 848w, https://substackcdn.com/image/fetch/$s_!KiEH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3917818c-fa83-4236-a0a0-57ca1f4468e3_1156x764.png 1272w, https://substackcdn.com/image/fetch/$s_!KiEH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3917818c-fa83-4236-a0a0-57ca1f4468e3_1156x764.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KiEH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3917818c-fa83-4236-a0a0-57ca1f4468e3_1156x764.png" width="1156" height="764" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3917818c-fa83-4236-a0a0-57ca1f4468e3_1156x764.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:764,&quot;width&quot;:1156,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!KiEH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3917818c-fa83-4236-a0a0-57ca1f4468e3_1156x764.png 424w, https://substackcdn.com/image/fetch/$s_!KiEH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3917818c-fa83-4236-a0a0-57ca1f4468e3_1156x764.png 848w, https://substackcdn.com/image/fetch/$s_!KiEH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3917818c-fa83-4236-a0a0-57ca1f4468e3_1156x764.png 1272w, https://substackcdn.com/image/fetch/$s_!KiEH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3917818c-fa83-4236-a0a0-57ca1f4468e3_1156x764.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3><strong>Vavr 0.11.0</strong></h3><p>The segue was a natural one: the library now maintained by Grzegorz, <strong>Vavr</strong>, has just released <strong>Vavr 0.11.0</strong> - its first minor release in several years.</p><p>For these who do not remember - Vavr is a non-commercial functional library for Java 8+, designed to reduce boilerplate through immutable collections, pattern matching, and monadic types such as Option, Try, and Either.</p><p>The most notable addition is a <strong>lazy for-comprehension API</strong> that accepts functions instead of eagerly evaluated values, enabling more efficient operation chaining. Vavr now also integrates <strong>JSpecify annotations</strong>, improving null-safety support in IDEs and static analysis tools. Future cancellation has been refined as well: tasks that have not yet started can now be cancelled. The release also introduces several new APIs, including Either/Validation.cond(), Value.mapTo(U), Value.mapToVoid(), and Try.toEither(Throwable -&gt; L).</p><p>From here, project is shifting focus toward <strong>Vavr 1.0.0</strong>, which is expected to bring a significant increase in the required Java version.</p><p>More details are available in the <strong><a href="https://github.com/vavr-io/vavr/releases/tag/v0.11.0">Release Notes</a></strong>.</p><div><hr></div><h3><strong>Kotlin 2.3.0</strong></h3><p>JetBrains has released Kotlin 2.3.0 with a rich set of improvements across the language and its ecosystems. At the language level, more features are now stable and enabled by default, a checker for unused return values has been added, and explicit backing fields provide finer control over properties. Kotlin/JVM now adds support for Java 25.</p><p>Meanwhile, Kotlin/Native improves interoperability through Swift export and delivers faster release build times. Kotlin/Wasm gains fully qualified names and a new exception-handling proposal enabled by default, along with compact Latin-1 string storage.</p><p>Kotlin/JS introduces experimental export of suspend functions, a new representation for LongArray, and unified access to companion objects. Gradle 9.0 is now fully supported, together with a new API for registering generated sources. The standard library brings a stable time-measurement API and improved UUID generation and parsing, while the Compose compiler adds stack traces for minified Android applications.</p><p>More details are available in the <strong><a href="https://blog.jetbrains.com/kotlin/2025/12/kotlin-2-3-0-released/">Release Notes</a></strong> and video with new features demoed:</p><div id="youtube2-_6PSSkqwbp8" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;_6PSSkqwbp8&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/_6PSSkqwbp8?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><h3><strong>IntelliJ IDEA 2025.3</strong></h3><p>And now it&#8217;s time for the birthday star!</p><p>As I already mentioned in my year-in-review (this is what happens when there&#8217;s no <em>Rest of the Story</em> edition in December), <strong>JetBrains</strong> has introduced a fundamental change to its distribution model: <strong>IntelliJ IDEA 2025.3</strong> is now a unified product, with no separate Community and Ultimate editions. This is a real shift for developers who previously had to choose between a free but limited version and a paid, full-featured one. All features from the former Community edition remain free, and JetBrains has additionally made basic support for Spring, Jakarta EE, and template engines like Thymeleaf available at no cost.</p><p>This change means that even small teams and individual developers can now use professional tools for working with popular enterprise frameworks without extra expense. JetBrains is clearly betting on a model where advanced AI features and additional integrations remain paid, while a solid, high-quality foundation for everyday development is accessible to everyone.</p><p>Two feature highlights worth calling out in IntelliJ IDEA 2025.3 are the open, integrated AI experience and the new multi-agent workflow. JetBrains AI is no longer a black box: you can now see and track your AI credits directly inside the IDE, use multiple agents from a single chat interface, and work with both JetBrains&#8217; own Junie and the natively integrated Claude Agent. On top of that, <em>Bring Your Own Key</em> (BYOK) lets you connect your own OpenAI, Anthropic, or OpenAI-compatible local models, giving teams far more control over providers, costs, and data flows.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DCvq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1bbb431-605b-46aa-8954-296d59d02f21_1488x842.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DCvq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1bbb431-605b-46aa-8954-296d59d02f21_1488x842.png 424w, https://substackcdn.com/image/fetch/$s_!DCvq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1bbb431-605b-46aa-8954-296d59d02f21_1488x842.png 848w, https://substackcdn.com/image/fetch/$s_!DCvq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1bbb431-605b-46aa-8954-296d59d02f21_1488x842.png 1272w, https://substackcdn.com/image/fetch/$s_!DCvq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1bbb431-605b-46aa-8954-296d59d02f21_1488x842.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DCvq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1bbb431-605b-46aa-8954-296d59d02f21_1488x842.png" width="1456" height="824" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d1bbb431-605b-46aa-8954-296d59d02f21_1488x842.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:824,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!DCvq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1bbb431-605b-46aa-8954-296d59d02f21_1488x842.png 424w, https://substackcdn.com/image/fetch/$s_!DCvq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1bbb431-605b-46aa-8954-296d59d02f21_1488x842.png 848w, https://substackcdn.com/image/fetch/$s_!DCvq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1bbb431-605b-46aa-8954-296d59d02f21_1488x842.png 1272w, https://substackcdn.com/image/fetch/$s_!DCvq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1bbb431-605b-46aa-8954-296d59d02f21_1488x842.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Another notable feature is command completion, which brings IDE actions directly into code completion. Typing . now shows not only code and postfix completions, but also relevant actions, while .. filters the list to actions only. You can preview exactly what an action will do before applying it, reducing context switches and shortcut hunting. It&#8217;s a small change with a big impact on flow - making powerful IDE features feel like a natural extension of typing code rather than something hidden behind menus or keymaps.</p><p>More details are available on the <strong><a href="https://www.jetbrains.com/idea/whatsnew/">What&#8217;s New page</a></strong>. And here you can find video where <strong><a href="https://www.linkedin.com/preload/#">&#128105;&#127995;&#128187; Marit van Dijk</a></strong>, <strong><a href="https://www.linkedin.com/preload/#">Marco Behler</a></strong>, <strong><a href="https://www.linkedin.com/preload/#">&#128083; Anton Arhipov</a></strong> and <strong><a href="https://www.linkedin.com/preload/#">Siva Prasad Reddy K</a></strong> present new editor capabilities.</p><div id="youtube2-YdAgkSNljTk" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;YdAgkSNljTk&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/YdAgkSNljTk?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>WildFly 39</strong></h3><p><strong>WildFly 39</strong> brings improvements in clustering, an area that matters whenever you run applications on more than one node. A key part of this is better TLS support for <strong>JGroups</strong> - a Java library used by WildFly (and many other systems) to handle node discovery, group membership, and reliable message exchange between servers in a cluster. With this release, TLS can now be configured directly for TCP-based JGroups transports, making it easier to secure inter-node communication and potentially replace older encryption setups such as ASYM_ENCRYPT with the simpler AUTH mechanism.</p><p>WildFly 39 also adds time-based HTTP session eviction, giving administrators more flexible control over memory usage when session data sizes vary widely. Alongside these features, the release updates core components and fixes multiple security issues, enforces stricter HTTP compliance by always requiring the Host header for HTTP/1.1+ requests, and introduces a 1GB limit for deployments uploaded over HTTP.</p><p>Full details are available in the <strong><a href="https://www.wildfly.org/news/2026/01/16/WildFly-39-is-released/">Release Notes</a></strong>.</p><h3><strong>JobRunr 8.4</strong></h3><p>JobRunr 8.4 continues its Kotlin-first push with improved Bazel compatibility, auto-configured serialization, and full support for Micronaut 4.10.</p><p>JobRunr is a background job processing library for Java and Kotlin that lets you define and run reliable, persistent background tasks (such as emails, data processing, or scheduled work) using plain Java or Kotlin code, without requiring a separate queue system. In this release, Kotlin lambdas compiled with Bazel&#8217;s rules_kotlin now work seamlessly, fixing long-standing NullPointerException issues when enqueueing Kotlin lambdas. Serialization gets smarter as well: KotlinxSerializationJsonMapper is automatically detected and configured when kotlinx-serialization-json is present on the classpath, while Jackson3JsonMapper now supports custom polymorphic type validators for improved security.</p><p>JobRunr Pro adds flexible license key loading, configurable graceful shutdown when the storage layer becomes unavailable, and dashboard improvements like logout and exception-type filtering.</p><p>More details are available in the <strong><a href="https://www.jobrunr.io/en/blog/jobrunr-v8.4/">Release Notes</a></strong>.</p><h3><strong>Gradle 9.3.0</strong></h3><p><strong>Gradle 9.3.0</strong> is a release that significantly improves the <strong>developer experience</strong>, especially around testing.</p><p>The headline feature is a completely redesigned HTML test report: instead of a flat list of tests, it now presents a hierarchical structure that mirrors your actual code organization.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!r2Rm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccd08ce5-4acc-4fa2-b45b-bd7d44593feb_720x269.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!r2Rm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccd08ce5-4acc-4fa2-b45b-bd7d44593feb_720x269.png 424w, https://substackcdn.com/image/fetch/$s_!r2Rm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccd08ce5-4acc-4fa2-b45b-bd7d44593feb_720x269.png 848w, https://substackcdn.com/image/fetch/$s_!r2Rm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccd08ce5-4acc-4fa2-b45b-bd7d44593feb_720x269.png 1272w, https://substackcdn.com/image/fetch/$s_!r2Rm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccd08ce5-4acc-4fa2-b45b-bd7d44593feb_720x269.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!r2Rm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccd08ce5-4acc-4fa2-b45b-bd7d44593feb_720x269.png" width="720" height="269" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ccd08ce5-4acc-4fa2-b45b-bd7d44593feb_720x269.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:269,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!r2Rm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccd08ce5-4acc-4fa2-b45b-bd7d44593feb_720x269.png 424w, https://substackcdn.com/image/fetch/$s_!r2Rm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccd08ce5-4acc-4fa2-b45b-bd7d44593feb_720x269.png 848w, https://substackcdn.com/image/fetch/$s_!r2Rm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccd08ce5-4acc-4fa2-b45b-bd7d44593feb_720x269.png 1272w, https://substackcdn.com/image/fetch/$s_!r2Rm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fccd08ce5-4acc-4fa2-b45b-bd7d44593feb_720x269.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Nested tests appear nested, parameterized tests are grouped under their defining method, and test suites clearly contain the classes they execute. Even more importantly, test output (stdout/stderr) is no longer merged at the class level - you can now see exactly which test produced which log line. This may sound minor, but in practice it means no more digging through hundreds of lines of output asking &#8220;which test actually failed?&#8221;. For builds aggregating tests from multiple subprojects, the report now also handles overlapping names correctly and shows each source as a separate tab.</p><p>For <strong>build and plugin authors</strong>, there are several practical improvements as well. The new AttributeContainer.named() API allows for more concise configuration of dependency resolution attributes, while TestKit gains getOutputReader(), enabling streaming of test output instead of loading massive logs into memory during integration tests. The release also fixes <strong>two security vulnerabilities</strong> related to dependency repositories: previously, repositories were not reliably disabled after hostname or timeout errors, potentially exposing builds to malicious artifacts. Repository disabling is now stricter, and all Gradle distributions are shipped with PGP signatures (.asc), aligning with broader efforts to improve supply chain integrity.</p><p>More details are available in the <strong><a href="https://github.com/gradle/gradle/releases/tag/v9.3.0">Release Notes</a></strong>.</p><h3><strong>Spock 2.4</strong></h3><p><strong>Spock Framework 2.4</strong> - one of the most popular mock tests frameworks - is a long-awaited version which arrives more than three years after 2.3 (September 2022) and its most important change is <strong>support for Groovy 5.0</strong>, which is a major milestone for the ecosystem. Groovy 5 requires Java 11+ and introduces its own breaking changes, forcing substantial internal refactoring in Spock (the _ identifier becoming a reserved keyword in Java 9+ was a particularly painful example). At the same time, Spock continues to support Groovy 2.5, 3.0, 4.0, and now 5.0, allowing teams to upgrade at their own pace.</p><p>More details are available in the <strong><a href="https://spockframework.org/spock/docs/2.4/release_notes.html">Release Notes</a></strong>.</p><h3><strong>Spring gRPC 1.0.0 GA</strong></h3><p><strong>Spring gRPC 1.0.0</strong> is the first official, fully supported integration of <strong>gRPC</strong> into the Spring ecosystem, with full compatibility for <strong>Spring Boot 4</strong> and Spring Framework 7. One important architectural decision stands out: the autoconfiguration and starter dependencies are deprecated right at the 1.0 release. This is intentional - Spring gRPC 1.1 (targeting Spring Boot 4.1) will move all autoconfiguration directly into Spring Boot itself. In practice, Spring gRPC 1.0 acts as a transitional release, giving teams time to upgrade while signaling that gRPC support will soon be a first-class, built-in Spring Boot feature. The framework requires Java 17 as a baseline and already supports Java 25 as the latest LTS, with JSpecify annotations aligning it with Spring Framework 7&#8217;s stronger focus on null-safety and Kotlin-friendly APIs.</p><p>From a developer experience perspective, the key theme is <strong>simplicity</strong>. To get started, you add the spring-grpc-spring-boot-starter, define your .proto file, and implement a Spring @Service that extends the generated ImplBase (or implements BindableService). The gRPC server starts automatically on port 9090 - no manual wiring required. This is a major improvement over older community solutions (such as the now-abandoned LogNet starter), which required extensive configuration. Out of the box, you get integration with Spring Security (OAuth2, TLS/mTLS), Micrometer for observability, and Spring Boot DevTools for hot reload.</p><h3><strong>Spring Tools 5.0.0</strong></h3><p><strong>Spring Tools 5.0.0</strong> is also an important update. The headline feature is <strong>Logical Structure View</strong> - a conceptual project view that organizes code by Spring stereotypes (controllers, services, repositories, entities) instead of folders and packages. This reflects how developers actually reason about Spring architectures and was designed in collaboration with <strong>Spring Modulith</strong> and <strong>jMolecules</strong>. The view supports custom stereotypes via META-INF/jmolecules-stereotypes.json or @Stereotype annotations and automatically aligns with Spring Modulith when present. On top of that, Spring Tools 5 delivers deep support for Spring Boot 4 and Spring Framework 7: API versioning with CodeLens summaries and validation, functional bean definitions via the new BeanRegistrar API, AOT repositories in Spring Data with SQL visualization, and automatic JSpecify-based null-safety analysis.</p><p>The second major pillar of this release is <strong>AI-native tooling</strong>. Spring Tools 5 integrates with Cursor and Copilot, but the most interesting addition is an embedded <strong>Model Context Protocol (MCP) server</strong>. This experimental feature allows AI coding assistants - including CLI-based tools like Claude Code - to access rich, Spring-specific context such as resolved classpaths, Spring Boot versions, bean definitions, dependencies, and architectural stereotypes. The MCP server runs inside Spring Tools and works only with an open project, but in return enables far more precise and architecture-aware AI assistance. The release also introduces AI-powered code actions for explaining SQL queries, SpEL expressions, pointcuts, and converting functional web routes.</p><p>More details are available in the <strong><a href="https://spring.io/blog/2025/12/10/spring-tools-5-0-0-released">Release Notes</a></strong>.</p><h3><strong>Hibernate ORM 7.2.0</strong></h3><p><strong>Hibernate ORM 7.2.0</strong> is headlined by experimental support for reading data from read-only replicas of the primary database. The release adds the new @EmbeddedTable annotation, significantly simplifying the mapping of embedded values to separate tables and reducing the need for verbose @AttributeOverride and @AssociationOverride configurations.</p><p>It also introduces FindMultipleOption, filling a long-standing gap in Session#findMultiple configuration, enables creation of child StatelessSession instances that share transactional context with a parent, expands the hibernate-vector module with SQL Server support, and adds regular expression support in HQL along with further enhancements to the SchemaManager.</p><p>More details are available in the <strong><a href="https://hibernate.org/orm/releases/7.2/">Release Notes</a></strong>.</p><h3><strong>TornadoVM 2.x - GPU acceleration for Java, now more practical</strong></h3><p><strong><a href="https://www.tornadovm.org/post/getting-started-with-tornadovm-2-0-for-accelerating-java-applications">TornadoVM 2.x</a></strong> represents a major step toward making GPU and accelerator offloading practical for JVM applications. Whereas earlier versions of TornadoVM were primarily research-oriented, 2.0 and subsequent 2.1+ releases usher in a more production-ready SDK with prebuilt binaries and easier integration into Java projects (available via standard dependencies and soon also via SDKMAN!) instead of requiring building from source.</p><p>The core idea remains the same: TornadoVM acts as a plugin for OpenJDK/GraalVM that compiles and offloads parts of your Java code to heterogeneous hardware like dedicated GPUs, integrated GPUs, FPGAs, and multi-core CPUs - targeting backends such as OpenCL, NVIDIA PTX, and SPIR-V - without rewriting in CUDA or native languages. It accomplishes this by generating accelerator-friendly kernels from annotated Java code, managing data movement between the JVM and device memory, and handling execution on the target hardware.</p><p>The 2.x series introduces important performance-oriented features: native support for INT8 data types on PTX/OpenCL (critical for quantized machine-learning workloads), FP32&#8596;FP16 conversion across all backends for efficient half-precision computation, zero-copy native arrays that eliminate host&#8596;device transfer overhead, and support for half-float operations such as Q8_0 matrices that boost throughput in ML kernels like those used in LLM inference.</p><p>Subsequent releases (e.g., 2.1.0) include enhancements such as improved FP16 handling and expanded array support. TornadoVM keeps two complementary APIs: a high-level Loop Parallel API using annotations like @Parallel and @Reduce for data parallelism, and a lower-level Kernel API with explicit control over threads, local memory, and barriers for experienced accelerator programmers - all while preserving multi-vendor portability.</p><h3><strong>TornadoInsight</strong></h3><p>Tooling around the SDK is improving too, with IDE support. <strong><a href="https://github.com/beehive-lab/tornado-insight">TornadoInsight</a></strong> is an <strong>IntelliJ IDEA</strong> plugin developed alongside <strong>TornadoVM 2.x</strong> that fundamentally improves the developer experience of GPU acceleration in Java by making what used to be opaque and log-driven fully visible inside the IDE. Instead of manually inspecting kernel dumps and thread logs, developers get a graphical <strong>TaskGraph visualization</strong> showing how Java code is compiled into GPU kernels, how tasks depend on each other, where host &lt;-&gt; device memory transfers occur, and which phases are the real performance bottlenecks.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NNKp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f7a3f90-fbf1-45a1-9190-1ecafe67f852_1488x987.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NNKp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f7a3f90-fbf1-45a1-9190-1ecafe67f852_1488x987.png 424w, https://substackcdn.com/image/fetch/$s_!NNKp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f7a3f90-fbf1-45a1-9190-1ecafe67f852_1488x987.png 848w, https://substackcdn.com/image/fetch/$s_!NNKp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f7a3f90-fbf1-45a1-9190-1ecafe67f852_1488x987.png 1272w, https://substackcdn.com/image/fetch/$s_!NNKp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f7a3f90-fbf1-45a1-9190-1ecafe67f852_1488x987.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NNKp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f7a3f90-fbf1-45a1-9190-1ecafe67f852_1488x987.png" width="1456" height="966" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4f7a3f90-fbf1-45a1-9190-1ecafe67f852_1488x987.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:966,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!NNKp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f7a3f90-fbf1-45a1-9190-1ecafe67f852_1488x987.png 424w, https://substackcdn.com/image/fetch/$s_!NNKp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f7a3f90-fbf1-45a1-9190-1ecafe67f852_1488x987.png 848w, https://substackcdn.com/image/fetch/$s_!NNKp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f7a3f90-fbf1-45a1-9190-1ecafe67f852_1488x987.png 1272w, https://substackcdn.com/image/fetch/$s_!NNKp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f7a3f90-fbf1-45a1-9190-1ecafe67f852_1488x987.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>The plugin integrates with the IntelliJ profiler to break execution down into compilation time, memory transfer overhead, and actual kernel runtime, and adds navigation between Java source and generated GPU code, syntax highlighting for TornadoVM&#8217;s intermediate bytecode, and side-by-side device comparison across different GPUs or backends.</p><p>For teams optimizing compute-heavy workloads or porting CUDA/OpenCL code to TornadoVM, TornadoInsight goal is to turn GPU acceleration from trial-and-error into an inspectable, iterative workflow.</p><h3><strong>LangChain4j 1.10.0</strong></h3><p>The headline feature of <strong>LangChain4j 1.10.0</strong> is the <strong>Model Catalog</strong>, a unified discovery and configuration layer for providers like Anthropic, Gemini, OpenAI, and Mistral, allowing developers to reference models by semantic names instead of hard-coding specific model IDs - and enabling automatic upgrades or graceful fallbacks to cheaper models without redeploying applications. The Anthropic integration received a significant upgrade with structured outputs (direct JSON-to-POJO deserialization via JSON Schema), strictTools mode to reduce tool-calling hallucinations, access to raw HTTP/SSE events for advanced observability, and native PDF input via URL.</p><p>On the production side, new <strong>AgentListener</strong> and <strong>AgentMonitor</strong> APIs provide fine-grained visibility into agent reasoning steps, tool usage, latency, and token consumption, which is critical for debugging and cost control. AI Services now support per-call tuning via ChatRequestParameters, MCP support has been hardened for real-world networking scenarios, OpenAI integration adds native transcription support, Gemini improves schema handling and batch processing, and the deprecated GitHub Models module signals a pragmatic focus on mainstream providers.</p><p>Full details are available in the <strong><a href="https://github.com/langchain4j/langchain4j/releases/tag/1.10.0">Release Notes</a></strong>.</p><h3><strong>OmniFaces 5.0</strong></h3><p>Anyone remember what <strong>OmniFaces</strong> actually is? &#128521; If you&#8217;ve ever built a serious Java Server Faces application (I&#8217;m so sorry), the answer comes back fast - and <strong>OmniFaces 5.0</strong> - set of JSF components - proves it&#8217;s very much alive. Released in December 2025, this major version cleans up years of legacy decisions and aligns the project with <strong>Jakarta EE 11</strong>, raising the baseline to <strong>Java 17 and Faces 4.1</strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3OAq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab1d010d-060f-4f83-be40-7572611d0a00_1488x898.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3OAq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab1d010d-060f-4f83-be40-7572611d0a00_1488x898.png 424w, https://substackcdn.com/image/fetch/$s_!3OAq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab1d010d-060f-4f83-be40-7572611d0a00_1488x898.png 848w, https://substackcdn.com/image/fetch/$s_!3OAq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab1d010d-060f-4f83-be40-7572611d0a00_1488x898.png 1272w, https://substackcdn.com/image/fetch/$s_!3OAq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab1d010d-060f-4f83-be40-7572611d0a00_1488x898.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3OAq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab1d010d-060f-4f83-be40-7572611d0a00_1488x898.png" width="1456" height="879" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ab1d010d-060f-4f83-be40-7572611d0a00_1488x898.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:879,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!3OAq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab1d010d-060f-4f83-be40-7572611d0a00_1488x898.png 424w, https://substackcdn.com/image/fetch/$s_!3OAq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab1d010d-060f-4f83-be40-7572611d0a00_1488x898.png 848w, https://substackcdn.com/image/fetch/$s_!3OAq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab1d010d-060f-4f83-be40-7572611d0a00_1488x898.png 1272w, https://substackcdn.com/image/fetch/$s_!3OAq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab1d010d-060f-4f83-be40-7572611d0a00_1488x898.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>The most visible change is the switch to a <strong>URN-based XML namespace</strong> (xmlns:o=&#8221;omnifaces&#8221;), merging the old UI and functions namespaces into one (with full backward compatibility across the 5.x line). All APIs deprecated in 4.x were physically removed, several components were renamed for consistency with Jakarta Faces, resource handling was modernized, and bundled JavaScript was migrated to TypeScript.</p><p>At the same time, OmniFaces adds small but practical new APIs (like HTML5 doctype detection and safe HTTP response resets) and continues to support cloud-native deployments via a Quarkus extension - a reminder that despite its &#8220;legacy&#8221; reputation, the JSF ecosystem still has an active community solving real enterprise problems (so sorry, once again).</p><p>More details are available in the <strong><a href="https://balusc.omnifaces.org/2025/12/omnifaces-50-has-been-released.html">Release Notes</a></strong>.</p><h2><strong>3. GitHub All-Stars</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kqhb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ef0d71c-bc22-4f02-8334-5bf65b074f43_1488x985.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kqhb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ef0d71c-bc22-4f02-8334-5bf65b074f43_1488x985.png 424w, https://substackcdn.com/image/fetch/$s_!kqhb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ef0d71c-bc22-4f02-8334-5bf65b074f43_1488x985.png 848w, https://substackcdn.com/image/fetch/$s_!kqhb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ef0d71c-bc22-4f02-8334-5bf65b074f43_1488x985.png 1272w, https://substackcdn.com/image/fetch/$s_!kqhb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ef0d71c-bc22-4f02-8334-5bf65b074f43_1488x985.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kqhb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ef0d71c-bc22-4f02-8334-5bf65b074f43_1488x985.png" width="1456" height="964" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4ef0d71c-bc22-4f02-8334-5bf65b074f43_1488x985.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:964,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!kqhb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ef0d71c-bc22-4f02-8334-5bf65b074f43_1488x985.png 424w, https://substackcdn.com/image/fetch/$s_!kqhb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ef0d71c-bc22-4f02-8334-5bf65b074f43_1488x985.png 848w, https://substackcdn.com/image/fetch/$s_!kqhb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ef0d71c-bc22-4f02-8334-5bf65b074f43_1488x985.png 1272w, https://substackcdn.com/image/fetch/$s_!kqhb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ef0d71c-bc22-4f02-8334-5bf65b074f43_1488x985.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3><strong>Juicemacs</strong></h3><p><strong><a href="https://github.com/gudzpoz/Juicemacs">Juicemacs</a></strong> is a project by Kana (<strong><a href="https://github.com/gudzpoz">gudzpoz</a></strong>) that&#8217;s both crazy and brilliant at the same time - a reimplementation of the legendary Emacs editor in Java, built on top of the Graal Truffle framework. Thanks to Truffle, Emacs Lisp (ELisp) code can be JIT-compiled to native machine code, potentially delivering performance that classic C-based Emacs can&#8217;t reach (due to Lisp evaluator, not C).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AlXV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02316c03-f02f-45a7-abf4-b1c84fbec346_744x340.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AlXV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02316c03-f02f-45a7-abf4-b1c84fbec346_744x340.png 424w, https://substackcdn.com/image/fetch/$s_!AlXV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02316c03-f02f-45a7-abf4-b1c84fbec346_744x340.png 848w, https://substackcdn.com/image/fetch/$s_!AlXV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02316c03-f02f-45a7-abf4-b1c84fbec346_744x340.png 1272w, https://substackcdn.com/image/fetch/$s_!AlXV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02316c03-f02f-45a7-abf4-b1c84fbec346_744x340.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AlXV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02316c03-f02f-45a7-abf4-b1c84fbec346_744x340.png" width="744" height="340" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/02316c03-f02f-45a7-abf4-b1c84fbec346_744x340.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:340,&quot;width&quot;:744,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!AlXV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02316c03-f02f-45a7-abf4-b1c84fbec346_744x340.png 424w, https://substackcdn.com/image/fetch/$s_!AlXV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02316c03-f02f-45a7-abf4-b1c84fbec346_744x340.png 848w, https://substackcdn.com/image/fetch/$s_!AlXV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02316c03-f02f-45a7-abf4-b1c84fbec346_744x340.png 1272w, https://substackcdn.com/image/fetch/$s_!AlXV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02316c03-f02f-45a7-abf4-b1c84fbec346_744x340.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Juicemacs currently ships with two working interpreters (one AST-based and one bytecode-based) and enough built-in functionality to support pdump. It&#8217;s a fascinating demonstration of GraalVM&#8217;s polyglot power - running languages like ELisp on a shared runtime with full interoperability. The author presented the project at EmacsConf 2025, showcasing experimental optimizations such as constant folding for stable global variables.</p><p>BTW: There are two fantastic <strong><a href="https://kyo.iroiro.party/en/posts/why-rewriting-emacs-is-hard/">blog[1]</a></strong> <strong><a href="https://kyo.iroiro.party/en/posts/emacs-lisp-interpreter-with-graalvm-truffle/">posts[2]</a></strong> about creating the projects. I will play a bit with this and probably return to the topic in one of the future editions.</p><div><hr></div><h3><strong>Annote</strong></h3><p>Staying in the Lisp regions - <strong><a href="https://github.com/kusoroadeolu/annote">Annote</a></strong> is&#8230; an experiment you have to see to believe.</p><p>Annote is an interpreter that executes Java annotations as a programming language - variables, conditionals, loops, I/O, arithmetic, and method calls, all expressed via @Var, @If, @Loop, @Print, and similar annotations. Just... take a look.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3Dvw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4821d55d-bf62-4693-82bf-52f1e04713bc_744x241.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3Dvw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4821d55d-bf62-4693-82bf-52f1e04713bc_744x241.png 424w, https://substackcdn.com/image/fetch/$s_!3Dvw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4821d55d-bf62-4693-82bf-52f1e04713bc_744x241.png 848w, https://substackcdn.com/image/fetch/$s_!3Dvw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4821d55d-bf62-4693-82bf-52f1e04713bc_744x241.png 1272w, https://substackcdn.com/image/fetch/$s_!3Dvw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4821d55d-bf62-4693-82bf-52f1e04713bc_744x241.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3Dvw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4821d55d-bf62-4693-82bf-52f1e04713bc_744x241.png" width="744" height="241" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4821d55d-bf62-4693-82bf-52f1e04713bc_744x241.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:241,&quot;width&quot;:744,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!3Dvw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4821d55d-bf62-4693-82bf-52f1e04713bc_744x241.png 424w, https://substackcdn.com/image/fetch/$s_!3Dvw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4821d55d-bf62-4693-82bf-52f1e04713bc_744x241.png 848w, https://substackcdn.com/image/fetch/$s_!3Dvw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4821d55d-bf62-4693-82bf-52f1e04713bc_744x241.png 1272w, https://substackcdn.com/image/fetch/$s_!3Dvw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4821d55d-bf62-4693-82bf-52f1e04713bc_744x241.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Java annotations were designed for metadata. Spring uses them for dependency injection. Lombok for code generation. JPA for ORM mapping. Annote uses them to write entire programs. Is it practical? Absolutely not. Is it a fascinating experiment that exposes the limits of Java&#8217;s annotation system? Definitely.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!llS-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b9c8c95-04fd-4e33-9d41-ca13fe59e95f_498x247.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!llS-!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b9c8c95-04fd-4e33-9d41-ca13fe59e95f_498x247.gif 424w, https://substackcdn.com/image/fetch/$s_!llS-!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b9c8c95-04fd-4e33-9d41-ca13fe59e95f_498x247.gif 848w, https://substackcdn.com/image/fetch/$s_!llS-!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b9c8c95-04fd-4e33-9d41-ca13fe59e95f_498x247.gif 1272w, https://substackcdn.com/image/fetch/$s_!llS-!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b9c8c95-04fd-4e33-9d41-ca13fe59e95f_498x247.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!llS-!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b9c8c95-04fd-4e33-9d41-ca13fe59e95f_498x247.gif" width="498" height="247" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6b9c8c95-04fd-4e33-9d41-ca13fe59e95f_498x247.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:247,&quot;width&quot;:498,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!llS-!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b9c8c95-04fd-4e33-9d41-ca13fe59e95f_498x247.gif 424w, https://substackcdn.com/image/fetch/$s_!llS-!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b9c8c95-04fd-4e33-9d41-ca13fe59e95f_498x247.gif 848w, https://substackcdn.com/image/fetch/$s_!llS-!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b9c8c95-04fd-4e33-9d41-ca13fe59e95f_498x247.gif 1272w, https://substackcdn.com/image/fetch/$s_!llS-!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b9c8c95-04fd-4e33-9d41-ca13fe59e95f_498x247.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>But in positive sense! I think we just found 2026&#8217;s edition of Annotatomania.</p><p>MIT licensed - because even cursed code deserves freedom.</p><p>BTW: I love how this repository was weaponized in ongoing war with Skynet &#128512;</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tyr6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24e0d93e-f5c7-4cff-a718-1c0f7c1316ad_744x148.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tyr6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24e0d93e-f5c7-4cff-a718-1c0f7c1316ad_744x148.png 424w, https://substackcdn.com/image/fetch/$s_!tyr6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24e0d93e-f5c7-4cff-a718-1c0f7c1316ad_744x148.png 848w, https://substackcdn.com/image/fetch/$s_!tyr6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24e0d93e-f5c7-4cff-a718-1c0f7c1316ad_744x148.png 1272w, https://substackcdn.com/image/fetch/$s_!tyr6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24e0d93e-f5c7-4cff-a718-1c0f7c1316ad_744x148.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tyr6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24e0d93e-f5c7-4cff-a718-1c0f7c1316ad_744x148.png" width="744" height="148" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/24e0d93e-f5c7-4cff-a718-1c0f7c1316ad_744x148.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:148,&quot;width&quot;:744,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!tyr6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24e0d93e-f5c7-4cff-a718-1c0f7c1316ad_744x148.png 424w, https://substackcdn.com/image/fetch/$s_!tyr6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24e0d93e-f5c7-4cff-a718-1c0f7c1316ad_744x148.png 848w, https://substackcdn.com/image/fetch/$s_!tyr6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24e0d93e-f5c7-4cff-a718-1c0f7c1316ad_744x148.png 1272w, https://substackcdn.com/image/fetch/$s_!tyr6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24e0d93e-f5c7-4cff-a718-1c0f7c1316ad_744x148.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p></p><div><hr></div><h3><strong>Hardwood</strong></h3><p><strong><a href="https://github.com/hardwood-hq/hardwood">Hardwood</a></strong> is a minimalist implementation of Apache Parquet for Java, created by <strong><a href="https://www.linkedin.com/preload/#">Gunnar Morling</a></strong> (yeah, the one behind 1BRC). It provides an API compatible with parquet-java, enabling migration with minimal code changes.</p><blockquote><p>Parquet is a columnar file format for tabular data, optimized for analytics by enabling efficient storage, compression, and fast reads of only the needed columns (e.g. in Spark or BigQuery).</p></blockquote><p>In benchmark tests on 44 million rows, Hardwood processes data in about 19 seconds, compared to 84 seconds for parquet-java. It achieves this by parallelizing column processing across CPU cores. For projects dealing with large Parquet datasets, this is a very compelling alternative.</p><div><hr></div><h3><strong>jMigrate</strong></h3><p><strong><a href="https://github.com/tanin47/jmigrate">jMigrate</a></strong> is a small, lightweight database schema migration library positioned as an alternative to Flyway and Liquibase for projects that need less overhead. A single call to JMigrate.migrate() at application startup is enough to apply all pending migrations.</p><p>jMigrate compares the current set of migration scripts with the state recorded in database tables. If the state is &#8220;dirty,&#8221; it automatically rolls back to the last clean point and reapplies subsequent migrations. Production safety is handled via the allowExecutingDownScripts flag - recommended to be set to false in production to prevent accidental data loss.</p><div><hr></div><h3><strong>zone-scope</strong></h3><p><strong>zone-scope</strong> is a real-time audio visualization tool written in Java/Swing. It supports live audio capture (via JACK or JavaSound), loading audio files with precomputed FFT, and a spectrometer with adjustable frequency response (20 Hz&#8211;14 kHz) and a logarithmic frequency scale.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uN-u!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02bf35a6-a24c-4f2f-83f6-4e811a123ea6_1488x956.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uN-u!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02bf35a6-a24c-4f2f-83f6-4e811a123ea6_1488x956.png 424w, https://substackcdn.com/image/fetch/$s_!uN-u!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02bf35a6-a24c-4f2f-83f6-4e811a123ea6_1488x956.png 848w, https://substackcdn.com/image/fetch/$s_!uN-u!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02bf35a6-a24c-4f2f-83f6-4e811a123ea6_1488x956.png 1272w, https://substackcdn.com/image/fetch/$s_!uN-u!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02bf35a6-a24c-4f2f-83f6-4e811a123ea6_1488x956.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uN-u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02bf35a6-a24c-4f2f-83f6-4e811a123ea6_1488x956.png" width="1456" height="935" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/02bf35a6-a24c-4f2f-83f6-4e811a123ea6_1488x956.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:935,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!uN-u!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02bf35a6-a24c-4f2f-83f6-4e811a123ea6_1488x956.png 424w, https://substackcdn.com/image/fetch/$s_!uN-u!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02bf35a6-a24c-4f2f-83f6-4e811a123ea6_1488x956.png 848w, https://substackcdn.com/image/fetch/$s_!uN-u!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02bf35a6-a24c-4f2f-83f6-4e811a123ea6_1488x956.png 1272w, https://substackcdn.com/image/fetch/$s_!uN-u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02bf35a6-a24c-4f2f-83f6-4e811a123ea6_1488x956.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Its standout feature is a zero-copy real-time processing path &#8212; allocation-free audio callbacks suitable for continuous visualization. The project requires Java 21+ and is part of the larger JudahZone ecosystem for live looping. It&#8217;s a strong example that modern Java is perfectly capable of low-latency, multimedia-heavy workloads as well.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jvm-weekly.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading JVM Weekly! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>