<?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>Mon, 27 Apr 2026 21:51: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[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><item><title><![CDATA[Java’s Plans for 2026 and new curiosities from JDK Mailing Lists  - JVM Weekly vol. 159]]></title><description><![CDATA[Let's have a sneak peak into what will happen 2026!]]></description><link>https://www.jvm-weekly.com/p/while-the-ink-is-still-wet-jdk-mailing</link><guid isPermaLink="false">https://www.jvm-weekly.com/p/while-the-ink-is-still-wet-jdk-mailing</guid><dc:creator><![CDATA[Artur Skowronski]]></dc:creator><pubDate>Thu, 15 Jan 2026 14:02:58 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!rwR1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1adb57de-5500-404f-9963-8f9c73922a0a_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_!rwR1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1adb57de-5500-404f-9963-8f9c73922a0a_1456x1048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rwR1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1adb57de-5500-404f-9963-8f9c73922a0a_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!rwR1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1adb57de-5500-404f-9963-8f9c73922a0a_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!rwR1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1adb57de-5500-404f-9963-8f9c73922a0a_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!rwR1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1adb57de-5500-404f-9963-8f9c73922a0a_1456x1048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rwR1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1adb57de-5500-404f-9963-8f9c73922a0a_1456x1048.png" width="1456" height="1048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1adb57de-5500-404f-9963-8f9c73922a0a_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;:1911701,&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/184528767?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1adb57de-5500-404f-9963-8f9c73922a0a_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_!rwR1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1adb57de-5500-404f-9963-8f9c73922a0a_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!rwR1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1adb57de-5500-404f-9963-8f9c73922a0a_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!rwR1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1adb57de-5500-404f-9963-8f9c73922a0a_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!rwR1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1adb57de-5500-404f-9963-8f9c73922a0a_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>New year, new plans, new promises we&#8217;ll look back on in twelve months with a mixture of nostalgia and disappointment. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!U_Jw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b54d05c-0676-4ddb-b7de-1e99c74a9f6a_780x498.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!U_Jw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b54d05c-0676-4ddb-b7de-1e99c74a9f6a_780x498.png 424w, https://substackcdn.com/image/fetch/$s_!U_Jw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b54d05c-0676-4ddb-b7de-1e99c74a9f6a_780x498.png 848w, https://substackcdn.com/image/fetch/$s_!U_Jw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b54d05c-0676-4ddb-b7de-1e99c74a9f6a_780x498.png 1272w, https://substackcdn.com/image/fetch/$s_!U_Jw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b54d05c-0676-4ddb-b7de-1e99c74a9f6a_780x498.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!U_Jw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b54d05c-0676-4ddb-b7de-1e99c74a9f6a_780x498.png" width="780" height="498" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0b54d05c-0676-4ddb-b7de-1e99c74a9f6a_780x498.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:498,&quot;width&quot;:780,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:496333,&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;:false,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/184528767?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b54d05c-0676-4ddb-b7de-1e99c74a9f6a_780x498.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_!U_Jw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b54d05c-0676-4ddb-b7de-1e99c74a9f6a_780x498.png 424w, https://substackcdn.com/image/fetch/$s_!U_Jw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b54d05c-0676-4ddb-b7de-1e99c74a9f6a_780x498.png 848w, https://substackcdn.com/image/fetch/$s_!U_Jw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b54d05c-0676-4ddb-b7de-1e99c74a9f6a_780x498.png 1272w, https://substackcdn.com/image/fetch/$s_!U_Jw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b54d05c-0676-4ddb-b7de-1e99c74a9f6a_780x498.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>But rather than dwelling too much on those New Year&#8217;s resolutions - there&#8217;ll be plenty of opportunity for that - let&#8217;s take a look at what OpenJDK teams themselves are saying about their plans for 2026.</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>OpenJDK Plans for 2026 - Valhalla Getting Closer, Amber Not Slowing Down, Loom Nearly Complete</h2><div id="youtube2-1lYsDMOc7hM" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;1lYsDMOc7hM&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/1lYsDMOc7hM?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>I have to admit: <strong><a href="https://github.com/nipafx">Nicolai Parlog</a></strong> from Oracle gave me a pleasant surprise. His New Year&#8217;s episode of Inside Java Newscast extracted concrete details from people working on individual projects. An &#8220;anonymous source&#8221; (whose identity anyone who&#8217;s ever heard Brian Goetz will immediately guess) dropped some bombs worth discussing.</p><p><strong>Valhalla is targeting JDK 28.</strong> This is probably the most important piece of news. Our Anonymous Source revealed that value types won&#8217;t make it into JDK 27 - but not because they aren&#8217;t ready. </p><div class="pullquote"><p>&#8220;We&#8217;re bringing an elephant onto a train and want to make sure we get into an empty car.&#8221; </p></div><p>JDK 27 forks in June, so mainline will switch to 28 then - with room for <a href="https://openjdk.org/jeps/401">JEP 401</a>. After value types, nullness markers, array improvements, and primitive-wrapper unification are queued up - but that&#8217;s a perspective for later releases.</p><p><strong>Vector API is waiting for Valhalla.</strong> JDK 26 will see its eleventh (!) incubation - and it&#8217;ll stay that way until value types land in mainline. When that happens, the implementation will be rewritten and the API moved from <code>jdk.incubator.vector</code> to the proper <code>java</code> package.</p><p><strong>Leyden - AOT code compilation.</strong> The AOT cache will contain not just loaded classes and method profiles, but compiled machine code as well. The runtime will be able to pull optimized code straight from the cache, dramatically reducing warmup time.</p><p><strong>Structured Concurrency nearing finalization.</strong> After the revamp in JDK 25, the API will go through preview with minimal changes - Nikolai rates the chances of finalization this year as good. This is the last piece of the big Project Loom picture (though some would like to see a bit of &#8220;scope creep&#8221; here - in the positive way - which we&#8217;ll get to shortly).</p><p><strong>Amber - constant patterns and pattern assignment.</strong> The team is &#8220;knee-deep in the second phase of pattern matching.&#8221; Two features are mature enough that JEPs may appear this year. We&#8217;ll examine all of this ourselves in a moment since the details from the mailing lists are very interesting, but apparently ideas for generalizing records and pattern matching to classes and interfaces are popping up on amber-spec-experts. So &#8220;things are happening.&#8221;</p><p><strong>Babylon preparing code reflection incubation.</strong> The technology allowing frameworks to reflect over code in methods and lambdas is developing well&#8212;we should hear more this year. I&#8217;m personally eager for any announcements related to GPU support.</p><div><hr></div><p>That&#8217;s the official plans. But as usual, the most interesting things happen at the margins&#8212;in experimental branches and mailing list discussions. And that&#8217;s exactly where Valhalla is showing that value types are just the beginning of a much more ambitious story.</p><h2>Type Classes - Valhalla experiments with the next step</h2><div id="youtube2-Gz7Or9C0TpM" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;Gz7Or9C0TpM&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/Gz7Or9C0TpM?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 href="https://www.linkedin.com/in/mcimadamore/">Maurizio Cimadamore</a> announced on the valhalla-dev list the publication of an experimental type classes prototype - a mechanism Brian Goetz presented at JVMLS 2025 in his talk <a href="https://www.youtube.com/watch?v=Gz7Or9C0TpM">Growing the Java Language</a>. The code landed in <a href="https://github.com/openjdk/valhalla/pull/1886">a new </a><em><a href="https://github.com/openjdk/valhalla/pull/1886">type-classes</a></em><a href="https://github.com/openjdk/valhalla/pull/1886"> branch in the Valhalla repository</a>.</p><p>What problem do type classes solve? Today in Java, you can&#8217;t write generic mathematical code that works on int, BigDecimal, and a hypothetical Float16 alike. Interfaces require types to explicitly implement them - you can&#8217;t say <em>Integer implements Addable</em> without modifying the Integer class. Type classes (known from Haskell, appearing as traits in Rust) invert this relationship: instead of requiring implementation in the class, you provide an external &#8220;witness&#8221; that says &#8220;here&#8217;s how to add values of type X.&#8221; Witnesses can be defined for any type, even someone else&#8217;s.</p><pre><code><code>record MyInt(int x) { }

interface Sum&lt;X&gt; {
    X zero();
    X add(X a, X b);
}

__witness Sum&lt;MyInt&gt; SUM_MYINT = new Sum&lt;&gt;() {
    MyInt zero() { return new MyInt(0); }
    MyInt add(MyInt a, MyInt b) { return new MyInt(a.x + b.x); }
};

// Usage:
Sum&lt;MyInt&gt; sum = Sum&lt;MyInt&gt;.__witness;
MyInt zero = sum.zero();
MyInt one = new MyInt(1);
assert sum.add(zero, one).equals(one);
</code></code></pre><p>In this prototype, you can <em>define a type class and a witness</em> for a specific type. For example, here&#8217;s how <strong>an addition type class (</strong><code>Sum</code><strong>)</strong> and its witness for a value class <code>MyInt</code> are defined.</p><ul><li><p><code>Sum&lt;X&gt;</code> is a generic interface representing a type class for addition.</p></li><li><p><code>__witness</code> defines a witness for how <code>MyInt</code> implements that type class externally.</p></li><li><p>The witness can then be looked up and used at runtime.</p></li></ul><p>This prototype enables external definitions of operations for types without modifying those types themselves, addressing a long-standing limitation in Java: today it&#8217;s impossible to write truly generic mathematical code that works uniformly across primitives like <code>int</code>, boxed types such as <code>BigDecimal</code>, and custom numeric or value types, because interfaces require the types to explicitly implement them. Type classes invert this relationship by allowing behavior to be attached externally via so-called &#8220;witnesses,&#8221; making it possible to state &#8220;here&#8217;s how type X does addition&#8221; without editing X at all.</p><p>Goetz explained the broader vision at JVMLS: type classes are meant to enable operator overloading for value types, collection literals, or new numeric types with full support for +, -, * - but without the <a href="https://www.reddit.com/r/cpp/comments/139c2v1/whats_the_most_hilarious_use_of_operator/">operator hell</a> known from C++, since they&#8217;d be limited to value classes only. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Wi_M!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1244664f-f368-485d-8d53-2b6080276cbe_805x307.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Wi_M!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1244664f-f368-485d-8d53-2b6080276cbe_805x307.png 424w, https://substackcdn.com/image/fetch/$s_!Wi_M!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1244664f-f368-485d-8d53-2b6080276cbe_805x307.png 848w, https://substackcdn.com/image/fetch/$s_!Wi_M!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1244664f-f368-485d-8d53-2b6080276cbe_805x307.png 1272w, https://substackcdn.com/image/fetch/$s_!Wi_M!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1244664f-f368-485d-8d53-2b6080276cbe_805x307.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Wi_M!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1244664f-f368-485d-8d53-2b6080276cbe_805x307.png" width="805" height="307" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1244664f-f368-485d-8d53-2b6080276cbe_805x307.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:307,&quot;width&quot;:805,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;r/ProgrammerHumor - The one true evil&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="r/ProgrammerHumor - The one true evil" title="r/ProgrammerHumor - The one true evil" srcset="https://substackcdn.com/image/fetch/$s_!Wi_M!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1244664f-f368-485d-8d53-2b6080276cbe_805x307.png 424w, https://substackcdn.com/image/fetch/$s_!Wi_M!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1244664f-f368-485d-8d53-2b6080276cbe_805x307.png 848w, https://substackcdn.com/image/fetch/$s_!Wi_M!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1244664f-f368-485d-8d53-2b6080276cbe_805x307.png 1272w, https://substackcdn.com/image/fetch/$s_!Wi_M!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1244664f-f368-485d-8d53-2b6080276cbe_805x307.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">C++ macros are even more&#8230; interesting.</figcaption></figure></div><p>Maurizio is very clear on one point, though: this is purely a space for experimentation, not a proposal for inclusion in the Java platform, and any JEP is still a long way off. <br></p><p>With Valhalla, as ever, patience is part of the lesson. However, they have even more under they sleeve now!</p><div><hr></div><h3><strong>Null Checks get concrete - The &#8220;Bang World&#8221; Prototype</strong></h3><p><strong><a href="https://www.linkedin.com/in/dansmithjava?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAAlu8AcBhbsLVHqtNtVBl-fvG00JsppBwfw">Daniel Smith</a></strong> announced on <strong><a href="https://mail.openjdk.org/pipermail/valhalla-spec-experts/2026-January/002554.html">valhalla-spec-experts</a></strong> another prototype branch worth watching: <strong><a href="https://github.com/openjdk/valhalla/tree/bworld">bworld</a></strong> (short for &#8220;bang world&#8221;). This one tackles the long-awaited <strong>nullness markers</strong> - specifically, the runtime enforcement side of making <code>!</code> actually mean something.</p><p>The idea is straightforward: mark types with <code>!</code> to indicate a non-null barrier, and have the JVM enforce it. You&#8217;ll be able to use <code>!</code> on field types, local variables, method parameters, return types, casts, instanceof, and array element types. And crucially - this isn&#8217;t limited to value classes. Any reference type can be marked.</p><p>What happens at runtime? The compiler generates calls to a new <code>java.lang.runtime.Checks</code> API (deliberately not <code>Objects.requireNonNull</code> - they want the JVM to have freedom to treat these checks specially). What those it mean in practice?</p><ul><li><p>A cast to <code>String!</code> will throw if you pass null</p></li><li><p>A field declared as <code>String! name</code> must be initialized before the <code>super()</code> call.</p></li><li><p>Arrays created with <code>new Foo![]{a, b, c}</code> will reject null writes dynamically.</p></li></ul><p><strong><a href="https://mail.openjdk.org/pipermail/valhalla-spec-experts/2026-January/002554.html">Daniel notes</a></strong> that current implementation only fully supports runtime checks for value-class-typed fields and arrays - other reference types will get the metadata in the class file, but enforcement is coming later.</p><p>The prototype also includes optional lint warnings for suspicious patterns - like assigning null literals to <code>!</code> targets or removing <code>!</code> markers when overriding methods. But the most interesting bit is &#8220;use-site checks&#8221;: the compiler can insert null checks when calling methods from untrusted binaries! This neatly exposes the real problem: not greenfield code, but millions of libraries that were written when null markers weren&#8217;t even imaginable.</p><p>That&#8217;s the real challenge: how to introduce null-safety into a 30-year-old ecosystem gradually, without breaking the world? But as <strong><a href="https://mail.openjdk.org/pipermail/valhalla-spec-experts/2026-January/002554.html">Daniel puts it</a></strong>:</p><blockquote><p>This is not the final version of the feature... it&#8217;s a snapshot. But we&#8217;ve been wanting something concrete that we could play with.</p></blockquote><p>The Kotlin crowd will feel right at home, except for one crucial difference: Kotlin&#8217;s null-safety is purely a compiler-land, erased at runtime. Java is building actual JVM enforcement. Slower to arrive, but when a <code>String!</code> field says &#8220;never null,&#8221; the runtime will back that promise up.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TvPG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcee5b739-d5ad-47b0-8871-7d0bb785f1ed_579x431.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TvPG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcee5b739-d5ad-47b0-8871-7d0bb785f1ed_579x431.jpeg 424w, https://substackcdn.com/image/fetch/$s_!TvPG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcee5b739-d5ad-47b0-8871-7d0bb785f1ed_579x431.jpeg 848w, https://substackcdn.com/image/fetch/$s_!TvPG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcee5b739-d5ad-47b0-8871-7d0bb785f1ed_579x431.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!TvPG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcee5b739-d5ad-47b0-8871-7d0bb785f1ed_579x431.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TvPG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcee5b739-d5ad-47b0-8871-7d0bb785f1ed_579x431.jpeg" width="579" height="431" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cee5b739-d5ad-47b0-8871-7d0bb785f1ed_579x431.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:431,&quot;width&quot;:579,&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_!TvPG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcee5b739-d5ad-47b0-8871-7d0bb785f1ed_579x431.jpeg 424w, https://substackcdn.com/image/fetch/$s_!TvPG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcee5b739-d5ad-47b0-8871-7d0bb785f1ed_579x431.jpeg 848w, https://substackcdn.com/image/fetch/$s_!TvPG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcee5b739-d5ad-47b0-8871-7d0bb785f1ed_579x431.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!TvPG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcee5b739-d5ad-47b0-8871-7d0bb785f1ed_579x431.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><hr></div><h2>Ephemeral Threads - Clojure knocks on Project Loom&#8217;s Door &#8220;With a Request&#8221;</h2><blockquote><p>Mama, take this badge off of me<br>I can&#8217;t use it anymore<br>It&#8217;s gettin&#8217; dark, too dark for me to see<br>I feel like I&#8217;m knockin&#8217; on heaven&#8217;s door</p></blockquote><p>Since Structured Concurrency is approaching finalization, can Project Loom be considered &#8220;finished&#8221;? The community has a different opinion. A heated discussion (30+ emails in a week) <a href="https://mail.openjdk.org/pipermail/loom-dev/2026-January/008172.html">erupted on the loom-dev list</a>, initiated by <a href="https://www.linkedin.com/in/alexmiller/">Alex Miller</a> from the Clojure team. </p><p>The topic? So-called &#8220;ephemeral threads&#8221;- threads that can be garbage collected before they finish their work. Sounds like heresy in the Java world, where for 30 years an iron rule has applied: threads are GC roots and live until they complete their work. But for the Clojure community, this has been daily bread for over a decade.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TTl2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e2d65ec-c8bf-45d0-ab52-5e7e511e9f9e_2624x1464.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TTl2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e2d65ec-c8bf-45d0-ab52-5e7e511e9f9e_2624x1464.png 424w, https://substackcdn.com/image/fetch/$s_!TTl2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e2d65ec-c8bf-45d0-ab52-5e7e511e9f9e_2624x1464.png 848w, https://substackcdn.com/image/fetch/$s_!TTl2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e2d65ec-c8bf-45d0-ab52-5e7e511e9f9e_2624x1464.png 1272w, https://substackcdn.com/image/fetch/$s_!TTl2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e2d65ec-c8bf-45d0-ab52-5e7e511e9f9e_2624x1464.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TTl2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e2d65ec-c8bf-45d0-ab52-5e7e511e9f9e_2624x1464.png" width="1456" height="812" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0e2d65ec-c8bf-45d0-ab52-5e7e511e9f9e_2624x1464.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;:3158693,&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/184528767?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e2d65ec-c8bf-45d0-ab52-5e7e511e9f9e_2624x1464.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_!TTl2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e2d65ec-c8bf-45d0-ab52-5e7e511e9f9e_2624x1464.png 424w, https://substackcdn.com/image/fetch/$s_!TTl2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e2d65ec-c8bf-45d0-ab52-5e7e511e9f9e_2624x1464.png 848w, https://substackcdn.com/image/fetch/$s_!TTl2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e2d65ec-c8bf-45d0-ab52-5e7e511e9f9e_2624x1464.png 1272w, https://substackcdn.com/image/fetch/$s_!TTl2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e2d65ec-c8bf-45d0-ab52-5e7e511e9f9e_2624x1464.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>What&#8217;s the deal? The <code>core.async</code> library lets you create lightweight &#8220;go blocks&#8221; that wait for data from channels. If all channels become unreachable, the block can also be collected by GC - since it would never wake up anyway. Elegant and practical when building pub/sub or pipelines. </p><p>The problem: after migrating to virtual threads, the pattern stopped working. Alan Bateman,  Tech Lead of Loom, is however <a href="https://mail.openjdk.org/pipermail/loom-dev/2026-January/008174.html">skeptical about the ephemeral thread concept</a>, pointing to deeper complications: interactions with finalizers and cleaners can lead to scenarios <em>from mildly creepy to truly terrifying</em>.:</p><blockquote><p>The possibility of GC&#8217;ing a started thread before it terminates is a scary topic. It interacts with many areas and gets really scary once you bring phantom refs, cleaners, and finalizers into the discussion.</p><p>For these so-called &#8220;forgotten sender&#8221; and &#8220;abandoned receiver&#8221; cases then it might be more interesting to see how they could be work with structured concurrency. Right now, the first API is focused on fan-out scenarios but in time we would like to have it work with channel like constructs too. I suspect this will be closer to what you are interested in.</p></blockquote><p>Since JDK 21, VTs are tracked by default for diagnostic tools, so &#8220;abandoned&#8221; threads hang in memory indefinitely. The flag <code>- Djdk.trackAllThreads=false</code> helps, but Miller rightly asks about its future, and <a href="https://mail.openjdk.org/pipermail/loom-dev/2026-January/008214.html">hears from Alan Bateman</a>: </p><blockquote><p>It's clearly an attractive nuisance right now and setting it to<br>false is specific to the root "thread grouping". There is some<br>performance work required in that area but otherwise I think it needs to<br>be removed.</p></blockquote><p>The argument for ephemeral threads is simple: virtual threads open the door to Erlang-style architectures where lightweight processes can be abandoned when they become redundant. Miller writes directly: </p><blockquote><p>Most of these constructs work as infinite loops without persistent references. You simply can&#8217;t build such libraries with the traditional approach to thread termination.</p></blockquote><p>Similar voices came from other users experimenting with their own schedulers - they want to use VTs as an invisible implementation detail where the end programmer doesn&#8217;t think about threads at all.</p><p>Oracle has serious concerns, however. The main one: debugging. Viktor Klang illustrates with an example - code acquires a file descriptor, parks the thread, then releases it. If the thread gets collected while parked, the descriptor leaks without a trace. </p><blockquote><p>This easily leads to problems where resources leak without any trace of who lost the - which can be nightmarish in production, </p></blockquote><p><a href="https://mail.openjdk.org/pipermail/loom-dev/2026-January/008175.html">argues Klang. </a></p><p><a href="https://mail.openjdk.org/pipermail/loom-dev/2026-January/008181.html">Andrew Haley from Red Hat</a> offered an interesting counterargument: if a thread is waiting on an unreachable semaphore, it will never release resources anyway - whether it takes up memory or not, the problem is the same.</p><p>There is a light at the end of the tunnel, however. <a href="https://mail.openjdk.org/pipermail/loom-dev/2026-January/008187.html">Bateman suggests</a> that cases of &#8220;abandoned&#8221; threads might play better with structured concurrency, which over time is meant to handle channel constructs as well. For Clojure, though, this means waiting - an official API for ephemeral threads probably won&#8217;t materialize, and the unofficial flag will likely disappear. </p><p>The discussion shows a broader trend: virtual threads opened Pandora&#8217;s box of new patterns that the JVM ecosystem is only beginning to explore.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rcqB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F056d3edc-a781-41f1-8d09-6024192a3899_506x558.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rcqB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F056d3edc-a781-41f1-8d09-6024192a3899_506x558.png 424w, https://substackcdn.com/image/fetch/$s_!rcqB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F056d3edc-a781-41f1-8d09-6024192a3899_506x558.png 848w, https://substackcdn.com/image/fetch/$s_!rcqB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F056d3edc-a781-41f1-8d09-6024192a3899_506x558.png 1272w, https://substackcdn.com/image/fetch/$s_!rcqB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F056d3edc-a781-41f1-8d09-6024192a3899_506x558.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rcqB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F056d3edc-a781-41f1-8d09-6024192a3899_506x558.png" width="506" height="558" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/056d3edc-a781-41f1-8d09-6024192a3899_506x558.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:558,&quot;width&quot;:506,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:399187,&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/184528767?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F056d3edc-a781-41f1-8d09-6024192a3899_506x558.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_!rcqB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F056d3edc-a781-41f1-8d09-6024192a3899_506x558.png 424w, https://substackcdn.com/image/fetch/$s_!rcqB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F056d3edc-a781-41f1-8d09-6024192a3899_506x558.png 848w, https://substackcdn.com/image/fetch/$s_!rcqB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F056d3edc-a781-41f1-8d09-6024192a3899_506x558.png 1272w, https://substackcdn.com/image/fetch/$s_!rcqB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F056d3edc-a781-41f1-8d09-6024192a3899_506x558.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>Project Amber in 2026 - Pattern Assignment and Constant Patterns on the Horizon</h2><p>And finally, <a href="https://www.linkedin.com/in/gavin-bierman-a0173075/">Gavin Bierman</a> from the Amber team shared details of plans for 2026 on the amber-spec-experts list. Beyond continuing work on Primitive Patterns (currently in preview), two new features are in the pipeline - draft JEPs should appear soon.</p><p><strong>Pattern Assignment</strong> solves an irritating problem: sometimes we use pattern matching not because something <em>might</em> match, but because we want to conveniently decompose a value into parts. Today we have to write:</p><pre><code><code>void process(ColorPoint cp) {
    if (cp instanceof ColorPoint(var x, var y, var c)) {
        // actual code, unnecessarily nested
    }
}
</code></code></pre><p>The compiler and programmer both know the pattern will always work&#8212;but the syntax forces us to pretend it&#8217;s a conditional operation. The new proposal will let you simply write:</p><pre><code><code>void process(ColorPoint cp) {
    ColorPoint(var x, var y, var c) = cp;  // Pattern Assignment!
    // actual code, no nesting
}</code></code></pre><p><strong>Constant Patterns</strong> is the second proposal, simplifying a common case&#8212;matching against a specific value. Instead of:</p><pre><code><code>case Point(var x, var y) when x == 0 &amp;&amp; y == 0 -&gt; { /* origin */ }</code></code></pre><p>You&#8217;ll be able to write:</p><pre><code><code>case Point(0, 0) -&gt; { /* origin */ }</code></code></pre><p>Constants (including <code>null</code>) will be able to appear directly as nested patterns - which will somewhat unify the awkward division between &#8220;case constants&#8221; and &#8220;case patterns.&#8221;</p><div><hr></div><p>Finally, a small observation from my functional heart (<a href="https://virtuslab.com/">working at the company behind Scala</a> obliges &#128521;).</p><p>Looking at all these discussions, it&#8217;s hard not to notice a common denominator: functional languages and their concepts remain a key reference point for JVM evolution. Type classes are a mechanism straight from Haskell. Pattern assignment is essentially the equivalent of <code>let</code> with deconstruction known from ML-family languages. And ephemeral threads? It&#8217;s a request for semantics that Erlang and its descendants have treated as obvious for years.</p><p>But here&#8217;s where it gets interesting: Java isn&#8217;t so much &#8220;adopting&#8221; these concepts as conducting a sort of dialogue with them - and often says &#8220;no&#8221; or &#8220;yes, but.&#8221; Type classes will be limited to value classes to avoid &#8220;operator overloading hell.&#8221; Ephemeral threads? Bateman politely suggests that maybe structured concurrency will someday handle these cases - which in practice means &#8220;we&#8217;ll do it our way or not at all.&#8221; Pattern matching is evolving so cautiously that Scala had time to have it, stop having it (in the sense of: stop being fashionable), and have it again before Java got to constant patterns.</p><p>And this is precisely the paradox that fascinates me: paradoxically, Java has probably become the most important testing ground for functional ideas in the mainstream&#8212;not <em>despite</em> its conservatism, but <em>because of</em> it. Every feature goes through such brutal mills of backward compatibility, edge case analysis, and years of preview that what comes out the other side is... surprisingly solid. Haskell&#8217;s type classes are elegant but also notoriously difficult for the average programmer to understand. Java will probably produce something less elegant, more &#8220;corporate&#8221;- and paradoxically more useful for most 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_!In1-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e886875-2867-48d0-85b4-2ff7482683f9_600x625.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!In1-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e886875-2867-48d0-85b4-2ff7482683f9_600x625.jpeg 424w, https://substackcdn.com/image/fetch/$s_!In1-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e886875-2867-48d0-85b4-2ff7482683f9_600x625.jpeg 848w, https://substackcdn.com/image/fetch/$s_!In1-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e886875-2867-48d0-85b4-2ff7482683f9_600x625.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!In1-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e886875-2867-48d0-85b4-2ff7482683f9_600x625.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!In1-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e886875-2867-48d0-85b4-2ff7482683f9_600x625.jpeg" width="600" height="625" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2e886875-2867-48d0-85b4-2ff7482683f9_600x625.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:625,&quot;width&quot;:600,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The memeification of Monads was a disaster to the FP world. :  r/ProgrammerHumor&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="The memeification of Monads was a disaster to the FP world. :  r/ProgrammerHumor" title="The memeification of Monads was a disaster to the FP world. :  r/ProgrammerHumor" srcset="https://substackcdn.com/image/fetch/$s_!In1-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e886875-2867-48d0-85b4-2ff7482683f9_600x625.jpeg 424w, https://substackcdn.com/image/fetch/$s_!In1-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e886875-2867-48d0-85b4-2ff7482683f9_600x625.jpeg 848w, https://substackcdn.com/image/fetch/$s_!In1-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e886875-2867-48d0-85b4-2ff7482683f9_600x625.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!In1-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e886875-2867-48d0-85b4-2ff7482683f9_600x625.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">Because there are some genuinely good ideas there beyond the memes and cheap laughs.</figcaption></figure></div><p>There&#8217;s a certain irony in all of this: Clojure, the language that since 2007 has been proving that functional programming on the JVM is possible and practical, is now asking for functionality it implemented itself for a decade&#8212;but can&#8217;t port to virtual threads without platform support. Alex Miller knocks on the door with a proposal inspired by Erlang, and Java responds in the style of: &#8220;interesting, but have you thought about interaction with finalizers? Because we have, and we have nightmares.&#8221;</p><p>Maybe that&#8217;s exactly why this relationship works. Functional languages explore, Java stabilizes. Erlang shows that ephemeral processes are possible, Clojure proves they work in practice on the JVM, and ten years from now Java will introduce something called &#8220;Scoped Ephemeral Task Contexts&#8221; that will work with every version back to JDK 8. And mass-market enterprise will finally get a feature that functional programmers were talking about at conferences in 2015. That&#8217;s the deal&#8212;and honestly, I&#8217;m not sure there&#8217;s a better model for evolving a programming language that has to support billions of lines of production code.</p><h3>PS: If you want to go deeper - see you in person &#128075;</h3><p>If this edition resonated and you&#8217;d like to continue the conversation <strong>offline</strong>, I&#8217;ll be talking about <em>JVM in the Age of AI</em> at a few upcoming events:</p><h4>&#127480;&#127466; JVM in the Age of AI: 2026 Edition @ <strong>JFokus 2026</strong></h4><p>I&#8217;ll be <a href="https://www.jfokus.se/talks.html">running a </a><strong><a href="https://www.jfokus.se/talks.html">90-minute Deep Dive</a></strong> session focused on what really needs to happen <em>inside</em> the JVM for it to remain a serious platform for AI and ML - hardware, Valhalla, Babylon, GPU offloading, TornadoVM, Llama3.java, and the 2026 perspective.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Tf6A!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F700b434f-2b5f-422e-9d3d-97a09dd67db8_1282x495.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Tf6A!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F700b434f-2b5f-422e-9d3d-97a09dd67db8_1282x495.png 424w, https://substackcdn.com/image/fetch/$s_!Tf6A!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F700b434f-2b5f-422e-9d3d-97a09dd67db8_1282x495.png 848w, https://substackcdn.com/image/fetch/$s_!Tf6A!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F700b434f-2b5f-422e-9d3d-97a09dd67db8_1282x495.png 1272w, https://substackcdn.com/image/fetch/$s_!Tf6A!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F700b434f-2b5f-422e-9d3d-97a09dd67db8_1282x495.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Tf6A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F700b434f-2b5f-422e-9d3d-97a09dd67db8_1282x495.png" width="1282" height="495" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/700b434f-2b5f-422e-9d3d-97a09dd67db8_1282x495.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:495,&quot;width&quot;:1282,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:124975,&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/184528767?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F700b434f-2b5f-422e-9d3d-97a09dd67db8_1282x495.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_!Tf6A!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F700b434f-2b5f-422e-9d3d-97a09dd67db8_1282x495.png 424w, https://substackcdn.com/image/fetch/$s_!Tf6A!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F700b434f-2b5f-422e-9d3d-97a09dd67db8_1282x495.png 848w, https://substackcdn.com/image/fetch/$s_!Tf6A!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F700b434f-2b5f-422e-9d3d-97a09dd67db8_1282x495.png 1272w, https://substackcdn.com/image/fetch/$s_!Tf6A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F700b434f-2b5f-422e-9d3d-97a09dd67db8_1282x495.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><hr></div><p>I&#8217;ll also be doing <strong>two</strong> <strong>polish JUGs during one week</strong>, talking about<strong> &#8220;Agentic Systems beyond localhost&#8221;</strong> with more room for questions (and for me to fill &#128513;) </p><ul><li><p>21.01 - <a href="https://www.meetup.com/wroclawjug/events/312871159/">Wroc&#322;aw Java User Group</a> (With One-and-Only Jarek Pa&#322;ka)</p></li><li><p>22.01 - <a href="https://www.meetup.com/pl-pl/kielce-java-user-group/events/312861115/?eventOrigin=group_upcoming_events">Kielce Java User Group</a></p></li></ul><p>Love the meetup, as they give a bit more freedom to speaker - and I always like to adapt to what <em>you</em> want to dig into.</p><p>If you&#8217;re around: come say hi, argue, disagree, or just nerd out about the JVM.</p><div><hr></div><p>Before we close this edition, one sad piece of news.</p><p><strong>Scott Adams has passed away.</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_!lCAX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21889bd2-91a2-4883-ae0c-06b370d97c5b_812x436.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lCAX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21889bd2-91a2-4883-ae0c-06b370d97c5b_812x436.png 424w, https://substackcdn.com/image/fetch/$s_!lCAX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21889bd2-91a2-4883-ae0c-06b370d97c5b_812x436.png 848w, https://substackcdn.com/image/fetch/$s_!lCAX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21889bd2-91a2-4883-ae0c-06b370d97c5b_812x436.png 1272w, https://substackcdn.com/image/fetch/$s_!lCAX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21889bd2-91a2-4883-ae0c-06b370d97c5b_812x436.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lCAX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21889bd2-91a2-4883-ae0c-06b370d97c5b_812x436.png" width="812" height="436" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/21889bd2-91a2-4883-ae0c-06b370d97c5b_812x436.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:436,&quot;width&quot;:812,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:262167,&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/184528767?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21889bd2-91a2-4883-ae0c-06b370d97c5b_812x436.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_!lCAX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21889bd2-91a2-4883-ae0c-06b370d97c5b_812x436.png 424w, https://substackcdn.com/image/fetch/$s_!lCAX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21889bd2-91a2-4883-ae0c-06b370d97c5b_812x436.png 848w, https://substackcdn.com/image/fetch/$s_!lCAX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21889bd2-91a2-4883-ae0c-06b370d97c5b_812x436.png 1272w, https://substackcdn.com/image/fetch/$s_!lCAX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21889bd2-91a2-4883-ae0c-06b370d97c5b_812x436.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 know - he was a controversial figure, especially in his later years, and not everyone agreed with his views. But there&#8217;s no denying one thing: <strong>his humor was singular</strong>, sharp in a way that only engineers and office survivors truly appreciate.</p><p>For years, <em>Dilbert</em> perfectly captured the absurdities of corporate life, technical organizations, and management theater &#8212; and it did so with a precision that made it a recurring guest in this newsletter. Many of us laughed because it was funny; many of us winced because it was accurate.</p><p>Whatever one thinks about Scott Adams the person, <strong>Scott Adams the cartoonist shaped a generation of engineers</strong> and gave us a shared language to talk about dysfunction, nonsense, and the quiet heroism of surviving another meeting that should have been an email.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2can!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7477bc3-22f4-4499-8ea2-cd5ca0bff8d3_720x246.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2can!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7477bc3-22f4-4499-8ea2-cd5ca0bff8d3_720x246.png 424w, https://substackcdn.com/image/fetch/$s_!2can!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7477bc3-22f4-4499-8ea2-cd5ca0bff8d3_720x246.png 848w, https://substackcdn.com/image/fetch/$s_!2can!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7477bc3-22f4-4499-8ea2-cd5ca0bff8d3_720x246.png 1272w, https://substackcdn.com/image/fetch/$s_!2can!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7477bc3-22f4-4499-8ea2-cd5ca0bff8d3_720x246.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2can!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7477bc3-22f4-4499-8ea2-cd5ca0bff8d3_720x246.png" width="720" height="246" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c7477bc3-22f4-4499-8ea2-cd5ca0bff8d3_720x246.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:246,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;All time favorite Dilbert cartoon : r/dilbert&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="All time favorite Dilbert cartoon : r/dilbert" title="All time favorite Dilbert cartoon : r/dilbert" srcset="https://substackcdn.com/image/fetch/$s_!2can!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7477bc3-22f4-4499-8ea2-cd5ca0bff8d3_720x246.png 424w, https://substackcdn.com/image/fetch/$s_!2can!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7477bc3-22f4-4499-8ea2-cd5ca0bff8d3_720x246.png 848w, https://substackcdn.com/image/fetch/$s_!2can!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7477bc3-22f4-4499-8ea2-cd5ca0bff8d3_720x246.png 1272w, https://substackcdn.com/image/fetch/$s_!2can!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7477bc3-22f4-4499-8ea2-cd5ca0bff8d3_720x246.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>Rest in peace, Scott.</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[Everything you might have missed in Java in 2025 - JVM Weekly vol. 158]]></title><description><![CDATA[As they say - new year, new us. But before we jump full-speed into 2026, it&#8217;s time to clear our heads and go through a (slightly overdue) recap of 2025]]></description><link>https://www.jvm-weekly.com/p/everything-you-might-have-missed-886</link><guid isPermaLink="false">https://www.jvm-weekly.com/p/everything-you-might-have-missed-886</guid><dc:creator><![CDATA[Artur Skowronski]]></dc:creator><pubDate>Thu, 08 Jan 2026 14:00:43 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Ne8X!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd8e9ab9-385a-4f5d-bdd2-f203634f8828_1444x1028.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_!Ne8X!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd8e9ab9-385a-4f5d-bdd2-f203634f8828_1444x1028.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ne8X!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd8e9ab9-385a-4f5d-bdd2-f203634f8828_1444x1028.png 424w, https://substackcdn.com/image/fetch/$s_!Ne8X!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd8e9ab9-385a-4f5d-bdd2-f203634f8828_1444x1028.png 848w, https://substackcdn.com/image/fetch/$s_!Ne8X!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd8e9ab9-385a-4f5d-bdd2-f203634f8828_1444x1028.png 1272w, https://substackcdn.com/image/fetch/$s_!Ne8X!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd8e9ab9-385a-4f5d-bdd2-f203634f8828_1444x1028.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ne8X!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd8e9ab9-385a-4f5d-bdd2-f203634f8828_1444x1028.png" width="1444" height="1028" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cd8e9ab9-385a-4f5d-bdd2-f203634f8828_1444x1028.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1028,&quot;width&quot;:1444,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1989786,&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/183660944?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd8e9ab9-385a-4f5d-bdd2-f203634f8828_1444x1028.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_!Ne8X!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd8e9ab9-385a-4f5d-bdd2-f203634f8828_1444x1028.png 424w, https://substackcdn.com/image/fetch/$s_!Ne8X!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd8e9ab9-385a-4f5d-bdd2-f203634f8828_1444x1028.png 848w, https://substackcdn.com/image/fetch/$s_!Ne8X!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd8e9ab9-385a-4f5d-bdd2-f203634f8828_1444x1028.png 1272w, https://substackcdn.com/image/fetch/$s_!Ne8X!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd8e9ab9-385a-4f5d-bdd2-f203634f8828_1444x1028.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 truth is - like year ago - I thought it would be a bit shorter... but quite a lot happened.</p><p>It took a bit since last JVM Weekly issue, so I had a lot of time&#8230; and may have overdone it a bit as original draft had 43 pages (and that&#8217;s before all the memes &#128549;). Not to worry, it was cut down, but still you should expect a monstrum of edition.</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_!YBTS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F518a93af-55b7-4bab-a142-adb82cedd129_1193x1218.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YBTS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F518a93af-55b7-4bab-a142-adb82cedd129_1193x1218.png 424w, https://substackcdn.com/image/fetch/$s_!YBTS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F518a93af-55b7-4bab-a142-adb82cedd129_1193x1218.png 848w, https://substackcdn.com/image/fetch/$s_!YBTS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F518a93af-55b7-4bab-a142-adb82cedd129_1193x1218.png 1272w, https://substackcdn.com/image/fetch/$s_!YBTS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F518a93af-55b7-4bab-a142-adb82cedd129_1193x1218.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YBTS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F518a93af-55b7-4bab-a142-adb82cedd129_1193x1218.png" width="1193" height="1218" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/518a93af-55b7-4bab-a142-adb82cedd129_1193x1218.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1218,&quot;width&quot;:1193,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:335700,&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;:false,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/183660944?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F518a93af-55b7-4bab-a142-adb82cedd129_1193x1218.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_!YBTS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F518a93af-55b7-4bab-a142-adb82cedd129_1193x1218.png 424w, https://substackcdn.com/image/fetch/$s_!YBTS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F518a93af-55b7-4bab-a142-adb82cedd129_1193x1218.png 848w, https://substackcdn.com/image/fetch/$s_!YBTS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F518a93af-55b7-4bab-a142-adb82cedd129_1193x1218.png 1272w, https://substackcdn.com/image/fetch/$s_!YBTS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F518a93af-55b7-4bab-a142-adb82cedd129_1193x1218.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">Yes, I feel fully recharged after the holiday, thank you for asking.</figcaption></figure></div><p>Sooo&#8230; without further ado - let&#8217;s start!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hVJB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a673d7c-4214-45a0-8064-3e685906b2b8_573x583.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hVJB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a673d7c-4214-45a0-8064-3e685906b2b8_573x583.png 424w, https://substackcdn.com/image/fetch/$s_!hVJB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a673d7c-4214-45a0-8064-3e685906b2b8_573x583.png 848w, https://substackcdn.com/image/fetch/$s_!hVJB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a673d7c-4214-45a0-8064-3e685906b2b8_573x583.png 1272w, https://substackcdn.com/image/fetch/$s_!hVJB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a673d7c-4214-45a0-8064-3e685906b2b8_573x583.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hVJB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a673d7c-4214-45a0-8064-3e685906b2b8_573x583.png" width="573" height="583" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0a673d7c-4214-45a0-8064-3e685906b2b8_573x583.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:583,&quot;width&quot;:573,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:438251,&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;:false,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/183660944?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a673d7c-4214-45a0-8064-3e685906b2b8_573x583.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_!hVJB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a673d7c-4214-45a0-8064-3e685906b2b8_573x583.png 424w, https://substackcdn.com/image/fetch/$s_!hVJB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a673d7c-4214-45a0-8064-3e685906b2b8_573x583.png 848w, https://substackcdn.com/image/fetch/$s_!hVJB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a673d7c-4214-45a0-8064-3e685906b2b8_573x583.png 1272w, https://substackcdn.com/image/fetch/$s_!hVJB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a673d7c-4214-45a0-8064-3e685906b2b8_573x583.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><h1>1. Language and Platform</h1><p>We&#8217;ll start our &#8220;small&#8221; overview with JVM languages and all the changes happening within the JVM itself. I&#8217;ve selected only the most important new developments&#8230; although even those are plentiful. The order is random (more along the lines of &#8220;whatever came to mind first,&#8221; so there&#8217;s a certain chaotic prioritization to it). Enjoy!</p><h2>Java turns 30!</h2><p>Let&#8217;s start with the birthday wishes: Java this year turned 30 and has entered its fourth decade with style, under Oracle&#8217;s banner. Already back in March, JavaOne 2025 adopted an anniversary theme, adding retrospective keynotes and a special &#8220;Java at 30&#8221; track. The Inside Java newsletter also covered the behind-the-scenes details and celebration plans in its May issue, encouraging the community to join in. On top of that, May 22nd saw a six-hour livestream featuring <strong><a href="https://www.linkedin.com/in/jamesgosling/">James Gosling</a></strong> , <strong><a href="https://www.linkedin.com/in/briangoetz/">Brian Goetz</a></strong> , <strong><a href="https://www.linkedin.com/in/markreinhold/">Mark Reinhold</a></strong> , and <strong><a href="https://www.linkedin.com/in/georgessaab/">Georges Saab</a></strong> , hosted by <strong><a href="https://www.linkedin.com/in/ana-maria-mihalceanu-1508/">Ana-Maria Mihalceanu</a></strong> , <strong><a href="https://www.linkedin.com/in/billy-korando-129b8197/">Billy Korando</a></strong> , and <strong><a href="https://nipafx.dev/">Nicolai Parlog</a></strong>.</p><p>Partners and vendors joined the toast: JetBrains launched the <strong><a href="https://www.jetbrains.com/lp/java-30/">#Java30</a></strong> campaign with a <strong><a href="https://www.jetbrains.com/lp/java-30/">What&#8217;s your inner Duke?</a></strong> quiz and limited-edition T-shirts up for grabs.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9Q4O!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3550fa6b-8572-4d83-bc62-460b1e055920_590x503.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9Q4O!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3550fa6b-8572-4d83-bc62-460b1e055920_590x503.png 424w, https://substackcdn.com/image/fetch/$s_!9Q4O!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3550fa6b-8572-4d83-bc62-460b1e055920_590x503.png 848w, https://substackcdn.com/image/fetch/$s_!9Q4O!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3550fa6b-8572-4d83-bc62-460b1e055920_590x503.png 1272w, https://substackcdn.com/image/fetch/$s_!9Q4O!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3550fa6b-8572-4d83-bc62-460b1e055920_590x503.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9Q4O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3550fa6b-8572-4d83-bc62-460b1e055920_590x503.png" width="590" height="503" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3550fa6b-8572-4d83-bc62-460b1e055920_590x503.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:503,&quot;width&quot;:590,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:&quot;Article content&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="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!9Q4O!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3550fa6b-8572-4d83-bc62-460b1e055920_590x503.png 424w, https://substackcdn.com/image/fetch/$s_!9Q4O!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3550fa6b-8572-4d83-bc62-460b1e055920_590x503.png 848w, https://substackcdn.com/image/fetch/$s_!9Q4O!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3550fa6b-8572-4d83-bc62-460b1e055920_590x503.png 1272w, https://substackcdn.com/image/fetch/$s_!9Q4O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3550fa6b-8572-4d83-bc62-460b1e055920_590x503.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>JetBrains also published a &#8220;Java Good Reads&#8221; list, released a plugin that changes the IDE splash screen, and even dropped a &#8220;Java 30&#8221; TikTok duet track. And before anyone tries to be cool asking, &#8220;What even is TikTok?&#8221;, just go play that song.</p><div class="native-audio-embed" data-component-name="AudioPlaceholder" data-attrs="{&quot;label&quot;:null,&quot;mediaUploadId&quot;:&quot;8378cb39-a3e8-4815-946d-9e958b2357c7&quot;,&quot;duration&quot;:24.894693,&quot;downloadable&quot;:false,&quot;isEditorNode&quot;:true}"></div><p>But that&#8217;s not all! Here are a few more highlights:</p><ul><li><p>Azul hosted its virtual event, <strong><a href="https://www.azul.com/webinars/duke-turns-30-celebrating-java/gate/">Duke Turns 30</a></strong>, as early as March, gathering Java Champions for panels on the future of JVM performance.</p></li><li><p>Also in March (because who says you have to celebrate only on your actual birthday?), Payara looked back at Java&#8217;s journey, highlighting the evolution <strong><a href="https://blog.payara.fish/javas-30th-anniversary-a-celebration-of-legacy-evolution-and-community">from set-top boxes to microservices in the cloud</a></strong>.</p></li><li><p>The community joined in too: Cyprus JUG <strong><a href="https://www.meetup.com/jug-cy/events/307780265/">hosted an evening of lightning talks and a Duke cake on May 23rd</a></strong>, and similar events popped up in the calendars of many JUGs and conferences, adding special anniversary sessions.</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_!DStm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e1b1e38-b9c9-4aa1-84c8-de0e6e6c54c6_1354x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DStm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e1b1e38-b9c9-4aa1-84c8-de0e6e6c54c6_1354x1000.png 424w, https://substackcdn.com/image/fetch/$s_!DStm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e1b1e38-b9c9-4aa1-84c8-de0e6e6c54c6_1354x1000.png 848w, https://substackcdn.com/image/fetch/$s_!DStm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e1b1e38-b9c9-4aa1-84c8-de0e6e6c54c6_1354x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!DStm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e1b1e38-b9c9-4aa1-84c8-de0e6e6c54c6_1354x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DStm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e1b1e38-b9c9-4aa1-84c8-de0e6e6c54c6_1354x1000.png" width="1354" height="1000" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5e1b1e38-b9c9-4aa1-84c8-de0e6e6c54c6_1354x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1000,&quot;width&quot;:1354,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:&quot;Article content&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="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!DStm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e1b1e38-b9c9-4aa1-84c8-de0e6e6c54c6_1354x1000.png 424w, https://substackcdn.com/image/fetch/$s_!DStm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e1b1e38-b9c9-4aa1-84c8-de0e6e6c54c6_1354x1000.png 848w, https://substackcdn.com/image/fetch/$s_!DStm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e1b1e38-b9c9-4aa1-84c8-de0e6e6c54c6_1354x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!DStm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e1b1e38-b9c9-4aa1-84c8-de0e6e6c54c6_1354x1000.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">Geecon also had one on their badges :)</figcaption></figure></div><p>The upshot of all these distributed but coordinated initiatives is more than just a nostalgic tribute: joint events, open-access content, and new IDE plugins are strengthening the network of relationships that has kept the Java ecosystem vibrant for 30 years - and is preparing it for another decade of innovation.</p><p>And hey, in just ten years we&#8217;ll be celebrating Java&#8217;s 40th. Because, let&#8217;s face it, Java is forever.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uY3-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19c2ce09-dac9-46dd-b3fb-4c064db2ea12_816x678.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uY3-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19c2ce09-dac9-46dd-b3fb-4c064db2ea12_816x678.png 424w, https://substackcdn.com/image/fetch/$s_!uY3-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19c2ce09-dac9-46dd-b3fb-4c064db2ea12_816x678.png 848w, https://substackcdn.com/image/fetch/$s_!uY3-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19c2ce09-dac9-46dd-b3fb-4c064db2ea12_816x678.png 1272w, https://substackcdn.com/image/fetch/$s_!uY3-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19c2ce09-dac9-46dd-b3fb-4c064db2ea12_816x678.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uY3-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19c2ce09-dac9-46dd-b3fb-4c064db2ea12_816x678.png" width="816" height="678" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/19c2ce09-dac9-46dd-b3fb-4c064db2ea12_816x678.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:678,&quot;width&quot;:816,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Article content&quot;,&quot;title&quot;:&quot;Article content&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="Article content" title="Article content" srcset="https://substackcdn.com/image/fetch/$s_!uY3-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19c2ce09-dac9-46dd-b3fb-4c064db2ea12_816x678.png 424w, https://substackcdn.com/image/fetch/$s_!uY3-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19c2ce09-dac9-46dd-b3fb-4c064db2ea12_816x678.png 848w, https://substackcdn.com/image/fetch/$s_!uY3-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19c2ce09-dac9-46dd-b3fb-4c064db2ea12_816x678.png 1272w, https://substackcdn.com/image/fetch/$s_!uY3-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19c2ce09-dac9-46dd-b3fb-4c064db2ea12_816x678.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><hr></div><h2>Virtual Threads finally without Pinning</h2><p>For nearly two years since their debut in JDK 21 (yes, JDK 21 was published 2 years ago), the results of Project Loom had one major &#8220;but&#8221; that effectively cooled enthusiasm in large codebases: pinning virtual threads on <code>synchronized</code> monitors. In theory, virtual threads were meant to be a lightweight and massively scalable at the same time, but in practice every <code>synchronized</code> block could pin them to a platform thread - destroying scalability where Java has the most legacy code&#8230; so in places where failures tend to surface at the least expected moment. Yes, the documentation warned about it, conference talks advised migrating to <code>ReentrantLock</code>, but in reality teams looked at millions of lines of existing Java and postponed Loom &#8220;until later.&#8221; I personally had that discussion more than once.</p><p>JDK 24 closes this chapter. Thanks to changes in the JVM monitor implementation (<a href="https://openjdk.org/jeps/491">JEP 491</a>), virtual threads are no longer automatically pinned when entering a <code>synchronized</code> block. As long as they do not perform operations that genuinely require binding to an OS thread, <code>synchronized</code> blocks can be unmounted and remounted just like any other virtual thread.</p><p>The importance of this change is hard to overstate, because - contrary to what might seem to a generation raised on <code>java.util.concurrent</code>, those summer children - <code>synchronized</code> is not an exotic detail but a core Java idiom that has been present from the very beginning in standard libraries, frameworks, application servers, and business code that has been running in production for decades&#8230; and will likely remain there for decades to come (<a href="https://en.wikipedia.org/wiki/Lindy_effect">Lindy effect</a>, anyone?). Previously, Loom required teams to undertake conscious, often costly refactoring to avoid pinning. Now virtual threads become compatible with idiomatic Java of the past, so migration stops being an architectural project and becomes a purely runtime decision.</p><p>It is the moment when the narrative around Loom can finally change. Until JDK 24, it was irresponsible to approach the topic in any way other than &#8220;virtual threads are great, but&#8230;&#8221;, and as we all know, the &#8220;but&#8221; negates everything that comes before it.</p><p>Visualization:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8tGm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc511f7ff-d12f-4d43-845f-3ca270cf9273_781x617.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8tGm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc511f7ff-d12f-4d43-845f-3ca270cf9273_781x617.png 424w, https://substackcdn.com/image/fetch/$s_!8tGm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc511f7ff-d12f-4d43-845f-3ca270cf9273_781x617.png 848w, https://substackcdn.com/image/fetch/$s_!8tGm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc511f7ff-d12f-4d43-845f-3ca270cf9273_781x617.png 1272w, https://substackcdn.com/image/fetch/$s_!8tGm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc511f7ff-d12f-4d43-845f-3ca270cf9273_781x617.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8tGm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc511f7ff-d12f-4d43-845f-3ca270cf9273_781x617.png" width="781" height="617" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c511f7ff-d12f-4d43-845f-3ca270cf9273_781x617.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:617,&quot;width&quot;:781,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:295380,&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/183660944?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc511f7ff-d12f-4d43-845f-3ca270cf9273_781x617.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_!8tGm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc511f7ff-d12f-4d43-845f-3ca270cf9273_781x617.png 424w, https://substackcdn.com/image/fetch/$s_!8tGm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc511f7ff-d12f-4d43-845f-3ca270cf9273_781x617.png 848w, https://substackcdn.com/image/fetch/$s_!8tGm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc511f7ff-d12f-4d43-845f-3ca270cf9273_781x617.png 1272w, https://substackcdn.com/image/fetch/$s_!8tGm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc511f7ff-d12f-4d43-845f-3ca270cf9273_781x617.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"><a href="https://www.instagram.com/_yes_but/">Love this series.</a></figcaption></figure></div><h2>Stream Gatherers finally open up the Stream API</h2><p>From the very beginning, the Stream API contained a certain contradiction. On the one hand, it offered an elegant, functional way to describe data processing - it is probably the widest used &#8220;new&#8221; Java feature. However, it was surprisingly closed to extension, which clashes strongly with what one would expect from this kind of functionality&#8230; especially people coming from more functional background were rolling eyes. For years, JVM developers kept coming back to the same problem: as long as <code>map</code>, <code>filter</code>, and <code>reduce</code> are enough, everything is fine. But as soon as you need windowing, stateful scanning, rolling aggregates, or more complex transformations, all that elegance disappears into the depths of <code>collect()</code> and custom, hard-to-read <code>Collectors</code>.</p><p><a href="https://openjdk.org/jeps/485">JEP 485</a> and Stream Gatherers are a direct response to this long-standing tension. Instead of stuffing all the logic into a terminal collector, you can now define your own intermediate operations that behave like native elements of the pipeline. <code>windowFixed</code>, <code>scan</code>, <code>fold</code>, and other stream-processing patterns stop being hacks and, crucially, they preserve lazy evaluation and compose naturally with the rest of the stream. In practice, this means less imperative code, fewer external libraries, and much better readability in places where streams previously lost out to classic loops (which are surprisingly flexible pattern in the end).</p><p>Also, it&#8217;s good to see Java is increasingly choosing the path of &#8220;opening up existing abstractions&#8221; rather than creating entirely new APIs from scratch. </p><h2>Class-File API and the end of the &#8220;ASM Dependency Era&#8221;</h2><p>If Stream Gatherers change the day-to-day style of writing code - and I suspect most of you will use them at some point, even indirectly through a third-party library - then Class-File API (<a href="https://openjdk.org/jeps/484">JEP 484</a>), while remaining largely invisible, changes the very foundations on which the JVM ecosystem has stood for years. For two decades, bytecode manipulation was in practice synonymous with a single library: <a href="https://asm.ow2.io/">ASM</a>. Every framework that generated or modified classes - Spring, Hibernate, Mockito, Byte Buddy, testing tools, profilers - had to rely on an external project that was constantly racing ahead of Java&#8217;s evolution. Even Java itself used it internally.</p><p>This was a quiet but very real structural problem. Every new JDK release meant a race: does ASM already support the new classfile format? Have the frameworks caught up? Will a preview feature break builds? The ecosystem lived in a state of permanent synchronization with a library that was formally &#8220;external&#8221; but, in practice, absolutely critical.</p><p>JEP 484 puts an end to this arrangement. Manipulating <code>.class</code> files becomes part of the JDK, with an official API and compatibility guarantees for future versions of the format. Responsibility for the evolution of the classfile returns to where it always should have been: the platform itself. Frameworks no longer have to guess how to read a new version of bytecode and can instead rely on a contract provided directly by Java.</p><p>Even though most of you will never touch classfiles directly, this is a change with enormous significance for the long-term maintainability of the platform. Fewer dependencies, fewer risky upgrades, less &#8220;waiting for someone to release a new version of ASM.&#8221; But it&#8217;s also something more: the internalization of critical infrastructure as certain parts of the ecosystem are too fundamental to live outside the standard library.</p><p>Class-File API won&#8217;t suddenly make the average developer start writing bytecode-level code (thanks God). But for framework authors, tool builders, and platform engineers, it&#8217;s one of the most important JEPs in years - one that reduces friction across the entire ecosystem.</p><h2>Java enters the Post-Quantum Era before it becomes necessary</h2><p>Post-quantum cryptography is a topic that&#8217;s easy to dismiss with a shrug: &#8220;quantum computers aren&#8217;t breaking RSA yet, so we still have time.&#8221; <a href="https://openjdk.org/jeps/496">JEP 496</a> and <a href="https://openjdk.org/jeps/497">JEP 497</a> introduce the first native implementations of the ML-KEM and ML-DSA algorithms into Java&#8212;used for key exchange and digital signatures respectively - aligned with the newly finalized <a href="https://www.wolfssl.com/what-are-fips-203-204-and-205/">NIST FIPS 203 and 204 standards</a>.</p><p>Behind this lies the very pragmatic &#8220;harvest now, decrypt later&#8221; concept. Data encrypted today with classical asymmetric algorithms can be intercepted and decrypted in the future, once quantum hardware matures. For sectors such as public administration, banking, defense, healthcare, or data archives, the implication is straightforward: if information needs to remain confidential for 20&#8211;30 years, migration has to start now - not on the day the first &#8220;breakthrough&#8221; quantum computer appear</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Wtmx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cec41c8-3871-459f-8065-b8d9a12e10ff_1093x1284.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Wtmx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cec41c8-3871-459f-8065-b8d9a12e10ff_1093x1284.png 424w, https://substackcdn.com/image/fetch/$s_!Wtmx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cec41c8-3871-459f-8065-b8d9a12e10ff_1093x1284.png 848w, https://substackcdn.com/image/fetch/$s_!Wtmx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cec41c8-3871-459f-8065-b8d9a12e10ff_1093x1284.png 1272w, https://substackcdn.com/image/fetch/$s_!Wtmx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cec41c8-3871-459f-8065-b8d9a12e10ff_1093x1284.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Wtmx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cec41c8-3871-459f-8065-b8d9a12e10ff_1093x1284.png" width="1093" height="1284" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8cec41c8-3871-459f-8065-b8d9a12e10ff_1093x1284.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1284,&quot;width&quot;:1093,&quot;resizeWidth&quot;:0,&quot;bytes&quot;:1501749,&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/183660944?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cec41c8-3871-459f-8065-b8d9a12e10ff_1093x1284.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_!Wtmx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cec41c8-3871-459f-8065-b8d9a12e10ff_1093x1284.png 424w, https://substackcdn.com/image/fetch/$s_!Wtmx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cec41c8-3871-459f-8065-b8d9a12e10ff_1093x1284.png 848w, https://substackcdn.com/image/fetch/$s_!Wtmx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cec41c8-3871-459f-8065-b8d9a12e10ff_1093x1284.png 1272w, https://substackcdn.com/image/fetch/$s_!Wtmx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cec41c8-3871-459f-8065-b8d9a12e10ff_1093x1284.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>Compact Object Headers Graduate from Experimental Status</h2><p>This is one of those JVM changes that doesn&#8217;t alter a single line of code, yet can completely change the economics of an application. <a href="https://openjdk.org/jeps/519">JEP 519</a> moves Compact Object Headers from the experimental phase into full production, closing out years of work on slimming down one of the most fundamental structures in Java: the object header.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7Rr0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F654b85d8-1dc5-4f2c-9e67-fa5d0dc74720_800x217.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7Rr0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F654b85d8-1dc5-4f2c-9e67-fa5d0dc74720_800x217.png 424w, https://substackcdn.com/image/fetch/$s_!7Rr0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F654b85d8-1dc5-4f2c-9e67-fa5d0dc74720_800x217.png 848w, https://substackcdn.com/image/fetch/$s_!7Rr0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F654b85d8-1dc5-4f2c-9e67-fa5d0dc74720_800x217.png 1272w, https://substackcdn.com/image/fetch/$s_!7Rr0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F654b85d8-1dc5-4f2c-9e67-fa5d0dc74720_800x217.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7Rr0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F654b85d8-1dc5-4f2c-9e67-fa5d0dc74720_800x217.png" width="800" height="217" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/654b85d8-1dc5-4f2c-9e67-fa5d0dc74720_800x217.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:217,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Java Compact Object Headers (JEP 519)&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="Java Compact Object Headers (JEP 519)" title="Java Compact Object Headers (JEP 519)" srcset="https://substackcdn.com/image/fetch/$s_!7Rr0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F654b85d8-1dc5-4f2c-9e67-fa5d0dc74720_800x217.png 424w, https://substackcdn.com/image/fetch/$s_!7Rr0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F654b85d8-1dc5-4f2c-9e67-fa5d0dc74720_800x217.png 848w, https://substackcdn.com/image/fetch/$s_!7Rr0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F654b85d8-1dc5-4f2c-9e67-fa5d0dc74720_800x217.png 1272w, https://substackcdn.com/image/fetch/$s_!7Rr0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F654b85d8-1dc5-4f2c-9e67-fa5d0dc74720_800x217.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>For decades, the object header in HotSpot was relatively &#8220;fat&#8221; - 96 or even 128 bits, depending on configuration and architecture. It carried everything: synchronization data, GC information, the class pointer, the hash code. JEP 519 reduces this overhead to 64 bits without sacrificing functionality. The result? In applications with a large number of small objects - which in practice means almost every modern JVM service - heap usage drops by an average of ~22%. And that&#8217;s no small thing. In the world of microservices, containers, and cloud-native deployments, memory is one of the primary operational costs. A smaller heap also means smaller pods, smaller VMs, faster cold starts, shorter GC pauses, and very real reductions in infrastructure bills.</p><p>Compact Headers have been tested, measured, and benchmarked extensively on real workloads. Promoting them to stable version means that OpenJDK considers them safe not only from a performance perspective, but also expects no surprises in synchronization, hash codes, or interactions with the garbage collector.</p><p>Pinky swear.</p><h2>Scoped Values &#8212; the Quiet Successor to <code>ThreadLocal</code></h2><p>Scoped Values are one of those Project Loom features that don&#8217;t make much noise (at least not as much as Stream Gatherers), yet they significantly change how safe, concurrent code is written in Java.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aKeX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43918287-6ead-4955-84a6-9f76bd4e01f5_640x211.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aKeX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43918287-6ead-4955-84a6-9f76bd4e01f5_640x211.png 424w, https://substackcdn.com/image/fetch/$s_!aKeX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43918287-6ead-4955-84a6-9f76bd4e01f5_640x211.png 848w, https://substackcdn.com/image/fetch/$s_!aKeX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43918287-6ead-4955-84a6-9f76bd4e01f5_640x211.png 1272w, https://substackcdn.com/image/fetch/$s_!aKeX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43918287-6ead-4955-84a6-9f76bd4e01f5_640x211.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aKeX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43918287-6ead-4955-84a6-9f76bd4e01f5_640x211.png" width="640" height="211" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/43918287-6ead-4955-84a6-9f76bd4e01f5_640x211.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:211,&quot;width&quot;:640,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;xkcd: Lisp Cycles&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="xkcd: Lisp Cycles" title="xkcd: Lisp Cycles" srcset="https://substackcdn.com/image/fetch/$s_!aKeX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43918287-6ead-4955-84a6-9f76bd4e01f5_640x211.png 424w, https://substackcdn.com/image/fetch/$s_!aKeX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43918287-6ead-4955-84a6-9f76bd4e01f5_640x211.png 848w, https://substackcdn.com/image/fetch/$s_!aKeX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43918287-6ead-4955-84a6-9f76bd4e01f5_640x211.png 1272w, https://substackcdn.com/image/fetch/$s_!aKeX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43918287-6ead-4955-84a6-9f76bd4e01f5_640x211.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Inspired by our God-and-Saviour, Lisp.</figcaption></figure></div><p>The problem Scoped Values address is old and well known: <code>ThreadLocal</code>. For years, it was the only reasonable way to propagate context - request IDs, security context, transactions, locale - without threading it through every method parameter. But <code>ThreadLocal</code> has two fundamental flaws. First, it lives as long as the thread does, which in a world of thread pools led to leaks, subtle bugs, and &#8220;bleeding&#8221; context. Second, it doesn&#8217;t fit virtual threads, where a thread stops being a long-lived carrier of context and becomes a lightweight, ephemeral abstraction.</p><p>Scoped Values invert this model. Instead of binding data to a thread, they bind it to an execution scope. A value is visible only within a clearly defined block, automatically propagates down the call stack, and&#8212;crucially&#8212;disappears exactly when the scope ends. No cleanup, no leak risk, no magical hooks. Another advantage of Scoped Values is that they are easier for the JVM to optimize. Their immutable nature and bounded lifetime mean the runtime knows precisely when a value exists and when it is no longer needed.</p><p>In short: if <code>ThreadLocal</code> was a hack that allowed Java to survive the era of application servers, Scoped Values are the mechanism that lets it enter the Loom era without repeating the same mistakes.</p><p>But remember - there is nothing wrong in a good hack. Even Gods-and-Saviours are doing that from time to time </p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!65Gv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc42ee5c5-135c-4558-af03-58917eeabf54_740x220.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!65Gv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc42ee5c5-135c-4558-af03-58917eeabf54_740x220.jpeg 424w, https://substackcdn.com/image/fetch/$s_!65Gv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc42ee5c5-135c-4558-af03-58917eeabf54_740x220.jpeg 848w, https://substackcdn.com/image/fetch/$s_!65Gv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc42ee5c5-135c-4558-af03-58917eeabf54_740x220.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!65Gv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc42ee5c5-135c-4558-af03-58917eeabf54_740x220.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!65Gv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc42ee5c5-135c-4558-af03-58917eeabf54_740x220.jpeg" width="740" height="220" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c42ee5c5-135c-4558-af03-58917eeabf54_740x220.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:220,&quot;width&quot;:740,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;xkcd: Lisp&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="xkcd: Lisp" title="xkcd: Lisp" srcset="https://substackcdn.com/image/fetch/$s_!65Gv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc42ee5c5-135c-4558-af03-58917eeabf54_740x220.jpeg 424w, https://substackcdn.com/image/fetch/$s_!65Gv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc42ee5c5-135c-4558-af03-58917eeabf54_740x220.jpeg 848w, https://substackcdn.com/image/fetch/$s_!65Gv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc42ee5c5-135c-4558-af03-58917eeabf54_740x220.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!65Gv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc42ee5c5-135c-4558-af03-58917eeabf54_740x220.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h2>JFR  enters everyday observability</h2><p>Java Flight Recorder has long been one of the most underrated components of the JVM. Powerful and low-overhead, yet often treated like a &#8220;black box&#8221; that you only look into after something goes wrong. JDK 25 clearly changes this role. The expansion of JFR in 2025 shows that Oracle increasingly sees it as a continuous source of data about application behavior, not just a post-mortem tool.</p><p>A key step here is <a href="https://openjdk.org/jeps/509">JEP 509</a>, which introduces CPU-time profiling on Linux. Until now, most profiles were based on wall-clock sampling, which in shared environments&#8212;containers, cgroups, noisy neighbors&#8212;often led to misleading conclusions. CPU-time profiling answers a much more practical question: where does the processor actually spend its time? This is especially important in the cloud, where every millisecond of CPU has a real cost at scale, and the difference between &#8220;waiting&#8221; and &#8220;computing&#8221; is crucial for optimization.</p><p>The second element, <a href="https://openjdk.org/jeps/520">JEP 520</a>, moves JFR toward analyses that previously required external tools or costly instrumentation. Method Timing &amp; Tracing with bytecode instrumentation makes it possible to measure method execution time with much greater precision, without manually attaching profilers or agents (the JVM ones&#8212;for AI agents, we&#8217;ll get to that later). For the first time, JFR starts looking inside application code, not just observing it from the runtime level.</p><p>All of this is tied together by cooperative sampling - a mechanism that improves measurement accuracy while maintaining very low overhead. Instead of aggressively interrupting threads, the JVM cooperates with the executing code, resulting in more stable and representative data. In practice, this means JFR can run continuously in production without fear of a noticeable performance impact. Java Flight Recorder therefore stops being a Plan B for when the world is already on fire, and starts becoming the default way of understanding a JVM application in motion.</p><p><em>From backstage: this is the moment Substack informed I&#8217;m approaching the email limit - What can I say, are you f*cking kiddin&#8217; me? I&#8217;m just getting up to speed.</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_!Auw2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8a8dba7-24f2-4294-96bb-77babd9f416c_1054x499.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Auw2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8a8dba7-24f2-4294-96bb-77babd9f416c_1054x499.png 424w, https://substackcdn.com/image/fetch/$s_!Auw2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8a8dba7-24f2-4294-96bb-77babd9f416c_1054x499.png 848w, https://substackcdn.com/image/fetch/$s_!Auw2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8a8dba7-24f2-4294-96bb-77babd9f416c_1054x499.png 1272w, https://substackcdn.com/image/fetch/$s_!Auw2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8a8dba7-24f2-4294-96bb-77babd9f416c_1054x499.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Auw2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8a8dba7-24f2-4294-96bb-77babd9f416c_1054x499.png" width="1054" height="499" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b8a8dba7-24f2-4294-96bb-77babd9f416c_1054x499.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:499,&quot;width&quot;:1054,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:233590,&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/183660944?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8a8dba7-24f2-4294-96bb-77babd9f416c_1054x499.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_!Auw2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8a8dba7-24f2-4294-96bb-77babd9f416c_1054x499.png 424w, https://substackcdn.com/image/fetch/$s_!Auw2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8a8dba7-24f2-4294-96bb-77babd9f416c_1054x499.png 848w, https://substackcdn.com/image/fetch/$s_!Auw2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8a8dba7-24f2-4294-96bb-77babd9f416c_1054x499.png 1272w, https://substackcdn.com/image/fetch/$s_!Auw2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8a8dba7-24f2-4294-96bb-77babd9f416c_1054x499.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>Project Valhalla - After a decade, Java finally touches the metal</h2><p>Project Valhalla is probably the most patiently developed project in the history of OpenJDK. When Brian Goetz announced it back in 2014, the Java world looked very different: there was no Loom, GraalVM was still an academic experiment, and &#8220;cloud-native&#8221; hadn&#8217;t yet become an overused buzzword. For many years, Valhalla existed more as an idea than a roadmap&#8212;names changed (inline types, value types, primitive classes), and assumptions were alternately tightened and relaxed.</p><p>In 2025, that changed. <a href="https://openjdk.org/jeps/401">JEP 401</a>: <em>Value Classes and Objects</em> reached Candidate status, and Oracle released the first early-access builds. This is the first moment when Valhalla stopped being just a Brian Goetz slide deck and became a concrete proposal for changes to the language and the VM.</p><p>What&#8217;s most striking is how little changes on the surface. One new keyword - <code>value</code> - placed before <code>class</code> or <code>record</code>&#8230; and that&#8217;s basically it. But beneath this modest syntax lies a fundamental shift in Java&#8217;s object model. Value classes give up object identity. Two objects with the same field values are indistinguishable - <code>==</code> ceases to be a reference comparison and becomes a value comparison. It&#8217;s a radical but consistent decision: if something has no identity, the JVM no longer has to pretend that every instance &#8220;lives its own life&#8221; on the heap.</p><p>Brian Goetz has summed up Valhalla in a single sentence for years: &#8220;code like a class, work like an int.&#8221; The core promise of Valhalla is <em>flattening</em>&#8212;the ability to place value object data inline in memory, without an extra layer of indirection. An <code>ArrayList&lt;Point&gt;</code> where <code>Point</code> is a value class is no longer an array of pointers to objects scattered across the heap, but a compact array of coordinates. Fewer dereferences, fewer cache misses, better data locality. This is exactly the kind of optimization that&#8217;s obvious in C or C++, but was historically out of reach in Java.</p><p>Why does this matter so much right now? Goetz often points out that the JVM memory model dates back to the early 1990s. In that world, the cost of memory access and the cost of arithmetic were comparable. In 2025, the difference is on the order of 200&#8211;1000&#215;. Java, with its pointer-centric object model, pays a real price for this&#8212;especially in numerical code, game engines, stream processing, ML, and HPC. Valhalla is an attempt to regain control over memory layout without abandoning the safety and abstractions that made Java popular in the first place.</p><p>Importantly, Valhalla&#8217;s design in 2025 is far more pragmatic than in its early iterations. Earlier proposals assumed almost &#8220;sterile&#8221; isolation of value types. <a href="https://openjdk.org/jeps/401">JEP 401</a> - still not yet targeted to a specific JDK release - allows abstract value classes and softens the boundaries between the reference world and the value world. This signals that the project aims not for academic purity, but for real-world adoptability, including in existing codebases.</p><p>At the same time, after years of &#8220;not yet,&#8221; we finally have a concrete JEP, concrete early-access builds, and a very clear trajectory. Java is beginning to repay its debt to the hardware it actually runs on - and has a chance to change the deepest foundation of all: the relationship between objects and memory.</p><p>Congratulation Valhalla team! However I have one thing in my mind</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!--K4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b263db2-b957-4e43-957e-f836f9b4045b_509x499.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!--K4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b263db2-b957-4e43-957e-f836f9b4045b_509x499.jpeg 424w, https://substackcdn.com/image/fetch/$s_!--K4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b263db2-b957-4e43-957e-f836f9b4045b_509x499.jpeg 848w, https://substackcdn.com/image/fetch/$s_!--K4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b263db2-b957-4e43-957e-f836f9b4045b_509x499.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!--K4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b263db2-b957-4e43-957e-f836f9b4045b_509x499.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!--K4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b263db2-b957-4e43-957e-f836f9b4045b_509x499.jpeg" width="509" height="499" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3b263db2-b957-4e43-957e-f836f9b4045b_509x499.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:499,&quot;width&quot;:509,&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_!--K4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b263db2-b957-4e43-957e-f836f9b4045b_509x499.jpeg 424w, https://substackcdn.com/image/fetch/$s_!--K4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b263db2-b957-4e43-957e-f836f9b4045b_509x499.jpeg 848w, https://substackcdn.com/image/fetch/$s_!--K4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b263db2-b957-4e43-957e-f836f9b4045b_509x499.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!--K4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b263db2-b957-4e43-957e-f836f9b4045b_509x499.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><h2>Project Panama and Project Babylon - Java steps beyond its own walled garden</h2><p>If Loom changed the way Java thinks about concurrency, and Valhalla about memory, then Panama and Babylon go one step further and evolve how the JVM cooperates with the world beyond itself. For decades, Java has been a safe, portable, and&#8230; hermetic platform. Integration with native code existed, but JNI was a tool from the &#8220;use only as a last resort&#8221; category. GPUs, SIMD, specialized hardware? That usually meant C++ wrappers with a thin layer of Java on top. Panama and Babylon are an attempt to break away from this model - without abandoning the JVM.</p><p>Project Panama, whose culmination was the introduction of the stable <code>Foreign Function &amp; Memory API</code>, tackles the most down-to-earth and painful problem: how to talk to native code safely and efficiently. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tY0P!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe543a1df-ea29-4007-a2ef-16b38fe240fe_397x397.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tY0P!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe543a1df-ea29-4007-a2ef-16b38fe240fe_397x397.png 424w, https://substackcdn.com/image/fetch/$s_!tY0P!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe543a1df-ea29-4007-a2ef-16b38fe240fe_397x397.png 848w, https://substackcdn.com/image/fetch/$s_!tY0P!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe543a1df-ea29-4007-a2ef-16b38fe240fe_397x397.png 1272w, https://substackcdn.com/image/fetch/$s_!tY0P!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe543a1df-ea29-4007-a2ef-16b38fe240fe_397x397.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tY0P!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe543a1df-ea29-4007-a2ef-16b38fe240fe_397x397.png" width="397" height="397" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e543a1df-ea29-4007-a2ef-16b38fe240fe_397x397.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:397,&quot;width&quot;:397,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:235927,&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/183660944?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe543a1df-ea29-4007-a2ef-16b38fe240fe_397x397.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_!tY0P!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe543a1df-ea29-4007-a2ef-16b38fe240fe_397x397.png 424w, https://substackcdn.com/image/fetch/$s_!tY0P!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe543a1df-ea29-4007-a2ef-16b38fe240fe_397x397.png 848w, https://substackcdn.com/image/fetch/$s_!tY0P!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe543a1df-ea29-4007-a2ef-16b38fe240fe_397x397.png 1272w, https://substackcdn.com/image/fetch/$s_!tY0P!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe543a1df-ea29-4007-a2ef-16b38fe240fe_397x397.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">Cause that the source of Python popularity nowadays.</figcaption></figure></div><p>But that&#8217;s only half the story. Panama solves how to get outside  JVM, but not why Java kept losing in areas such as HPC, GPUs, or intensive numerical computation. And that&#8217;s where Project Babylon comes in.</p><p>Babylon is one of the most ambitious projects in OpenJDK - and at the same time one of the least understood. Its goal is not to &#8220;speed up Java,&#8221; but to make Java a language capable of mapping itself onto modern hardware. In practice, this means enabling Java code - when properly described - to be compiled to different backends: CPUs with SIMD, GPUs, and AI accelerators. Not through magical runtimes, but through an explicit, analyzable computation model.</p><p>The key here is its connection to Valhalla and Panama. Valhalla&#8217;s value classes make it possible to describe data structures, while Panama provides safe access to memory and native ABIs. Babylon ties this all together by delivering a model in which the JVM can understand the semantics of computations, not just execute them on a CPU. Projects like TornadoVM already show today (which we&#8217;ll get to shortly) that Java can be a viable language for GPU programming - Babylon is meant to ensure this stops being a curiosity and becomes a feature available to the &#8220;common programmer.&#8221;</p><p>And that&#8217;s important - as Java is no longer just a language for backends and microservices. It is starting to become an infrastructural language that can handle everything: from classic services, through AI inference, to heterogeneous computing. And importantly - without copying the C++ or CUDA model. While preserving type safety, garbage collection, and the tooling that have been its advantages for years.</p><p>For now, Babylon is still a research project, but by the end of 2025 it remains one of the missing pieces of a puzzle that has been taking shape in OpenJDK for over a decade. If you want to learn more - this is the best material you can find nowadays.</p><div id="youtube2-qkr3E27XYbY" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;qkr3E27XYbY&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/qkr3E27XYbY?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>Project Leyden: AOT as an Answer to GraalVM Native Image</h2><p>For years, the discussion around JVM application startup time has been dominated by a single solution: GraalVM Native Image. Radically effective and impressive in benchmarks, but paid for with real costs - long compilation times, a &#8220;closed world,&#8221; and constant battles with reflection and libraries that assume JVM&#8217;s dynamic nature. Project Leyden was created as a conscious alternative to that philosophy. Not as yet another AOT mode, but as an attempt to achieve similar benefits without giving up what has defined Java for decades.</p><p>The key assumption behind Leyden is that most server applications are not chaotic. On the contrary - they are surprisingly predictable, boring even. The same classes are loaded on every startup. The same code paths warm up at the beginning. The same proxies, the same reflection metadata, the same execution profiles. JVM has long been able to see these patterns, but until now it discarded this knowledge on every restart - Leyden changes exactly 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_!vv8o!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc0d959a-6d81-4061-bd26-d7616c51c746_2156x1428.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vv8o!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc0d959a-6d81-4061-bd26-d7616c51c746_2156x1428.png 424w, https://substackcdn.com/image/fetch/$s_!vv8o!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc0d959a-6d81-4061-bd26-d7616c51c746_2156x1428.png 848w, https://substackcdn.com/image/fetch/$s_!vv8o!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc0d959a-6d81-4061-bd26-d7616c51c746_2156x1428.png 1272w, https://substackcdn.com/image/fetch/$s_!vv8o!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc0d959a-6d81-4061-bd26-d7616c51c746_2156x1428.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vv8o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc0d959a-6d81-4061-bd26-d7616c51c746_2156x1428.png" width="1456" height="964" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dc0d959a-6d81-4061-bd26-d7616c51c746_2156x1428.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;:3848690,&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/183660944?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc0d959a-6d81-4061-bd26-d7616c51c746_2156x1428.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_!vv8o!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc0d959a-6d81-4061-bd26-d7616c51c746_2156x1428.png 424w, https://substackcdn.com/image/fetch/$s_!vv8o!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc0d959a-6d81-4061-bd26-d7616c51c746_2156x1428.png 848w, https://substackcdn.com/image/fetch/$s_!vv8o!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc0d959a-6d81-4061-bd26-d7616c51c746_2156x1428.png 1272w, https://substackcdn.com/image/fetch/$s_!vv8o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc0d959a-6d81-4061-bd26-d7616c51c746_2156x1428.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>Leyden&#8217;s philosophy is speculative runtime optimization. The JVM observes the application during a so-called training run and assumes that future runs will be similar. Execution profiles are not random; they are a stable artifact of the application: classes that were needed will be needed again, and methods that were hot are worth preparing in advance. Instead of starting &#8220;from scratch&#8221; on every launch, the JVM begins to learn its own behavior.</p><p>In 2025, Leyden began to materialize in the mainline JDK. The foundation consists of three JEPs that together define a new JVM startup model. <a href="https://openjdk.org/jeps/483">JEP 483</a>, introduced in JDK 24, enables Ahead-of-Time Class Loading &amp; Linking - the most expensive part of JVM startup can be done in advance and stored in a cache. <a href="https://openjdk.org/jeps/514">JEP 514</a> simplifies the launch ergonomics, reducing the entire workflow to a single, sensible command instead of a set of experimental flags. <a href="https://openjdk.org/jeps/515">JEP 515</a> allows method execution profiles to be preserved across runs, opening the door to much more aggressive optimizations without sacrificing safety.</p><p>In August 2025, <a href="https://jdk.java.net/leyden/">Leyden Early Access 2</a> appeared, showing where the project is actually heading. For the first time, we saw the outline of AOT code compilation - methods can be compiled to native code during the training run and stored in a cache, so the work doesn&#8217;t have to be repeated on the next startup. On top of that comes AOT for dynamic proxies and reflection data - two areas that historically caused the biggest problems for both the classic JVM and Native Image. Crucially, all of this still works within HotSpot, without closing the world and without breaking the contract of dynamic behavior.</p><p>Leyden is not trying to beat GraalVM Native Image on its own turf. Instead, it redefines the reference point. If Native Image is an extreme - minimal startup at the cost of flexibility - then Leyden pushes the classic JVM as far toward &#8220;fast startup&#8221; as possible without abandoning dynamism. For the vast majority of enterprise applications, this is exactly the compromise that was missing. Project Leyden is, in practice, OpenJDK&#8217;s answer to the question: can the JVM be fast at startup without ceasing to be a JVM? In 2025, for the first time, the answer began to sound like: yes.</p><p>And since we&#8217;ve already invoked GraalVM&#8230;</p><h2>GraalVM in 2025 - From &#8220;Java&#8217;s Savior&#8221; to a specialized runtime (with AI Inside)</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YLXT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F042b3ae8-6dc4-46f0-ba48-25a8f2b6f3b6_500x247.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YLXT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F042b3ae8-6dc4-46f0-ba48-25a8f2b6f3b6_500x247.gif 424w, https://substackcdn.com/image/fetch/$s_!YLXT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F042b3ae8-6dc4-46f0-ba48-25a8f2b6f3b6_500x247.gif 848w, https://substackcdn.com/image/fetch/$s_!YLXT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F042b3ae8-6dc4-46f0-ba48-25a8f2b6f3b6_500x247.gif 1272w, https://substackcdn.com/image/fetch/$s_!YLXT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F042b3ae8-6dc4-46f0-ba48-25a8f2b6f3b6_500x247.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YLXT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F042b3ae8-6dc4-46f0-ba48-25a8f2b6f3b6_500x247.gif" width="500" height="247" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/042b3ae8-6dc4-46f0-ba48-25a8f2b6f3b6_500x247.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:247,&quot;width&quot;:500,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1003795,&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/183660944?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F042b3ae8-6dc4-46f0-ba48-25a8f2b6f3b6_500x247.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_!YLXT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F042b3ae8-6dc4-46f0-ba48-25a8f2b6f3b6_500x247.gif 424w, https://substackcdn.com/image/fetch/$s_!YLXT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F042b3ae8-6dc4-46f0-ba48-25a8f2b6f3b6_500x247.gif 848w, https://substackcdn.com/image/fetch/$s_!YLXT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F042b3ae8-6dc4-46f0-ba48-25a8f2b6f3b6_500x247.gif 1272w, https://substackcdn.com/image/fetch/$s_!YLXT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F042b3ae8-6dc4-46f0-ba48-25a8f2b6f3b6_500x247.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>Well&#8230; 2025 was one of the most turbulent years in GraalVM&#8217;s history. Not technologically - because on that front GraalVM made enormous progress - but strategically. Oracle very clearly shifted its priorities, effectively closing a certain era in thinking about GraalVM as &#8220;the future of Java.&#8221;</p><p>The most important signal came early: Gr<a href="https://blogs.oracle.com/java/detaching-graalvm-from-the-java-ecosystem-train">aalVM for JDK 24 is the last release licensed as part of Java SE</a>. The experimental Graal JIT, which in Oracle JDK 23 and 24 could replace C2 as an alternative compiler, has been withdrawn. Native Image is no longer part of the Java SE offering, and Oracle is explicitly steering customers toward Project Leyden as the default path for JVM startup and runtime optimization. For many observers, this was a &#8220;wake-up moment&#8221;: GraalVM is not disappearing, but it is no longer the universal answer to all of Java&#8217;s problems that it seemed to be over the past decade.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yZtt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd05f4db-fc49-4104-a429-834fde94b887_320x180.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yZtt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd05f4db-fc49-4104-a429-834fde94b887_320x180.gif 424w, https://substackcdn.com/image/fetch/$s_!yZtt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd05f4db-fc49-4104-a429-834fde94b887_320x180.gif 848w, https://substackcdn.com/image/fetch/$s_!yZtt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd05f4db-fc49-4104-a429-834fde94b887_320x180.gif 1272w, https://substackcdn.com/image/fetch/$s_!yZtt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd05f4db-fc49-4104-a429-834fde94b887_320x180.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yZtt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd05f4db-fc49-4104-a429-834fde94b887_320x180.gif" width="320" height="180" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cd05f4db-fc49-4104-a429-834fde94b887_320x180.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:180,&quot;width&quot;:320,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4237119,&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/183660944?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd05f4db-fc49-4104-a429-834fde94b887_320x180.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_!yZtt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd05f4db-fc49-4104-a429-834fde94b887_320x180.gif 424w, https://substackcdn.com/image/fetch/$s_!yZtt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd05f4db-fc49-4104-a429-834fde94b887_320x180.gif 848w, https://substackcdn.com/image/fetch/$s_!yZtt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd05f4db-fc49-4104-a429-834fde94b887_320x180.gif 1272w, https://substackcdn.com/image/fetch/$s_!yZtt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd05f4db-fc49-4104-a429-834fde94b887_320x180.gif 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">During Chrismas, I watched Star Wars The New Hope with my daughter. Can&#8217;t wait to expose her to the best blockbuster ever - Indiana Jones and The Last Crusade.</figcaption></figure></div><p>At the same time - and here lies the most interesting paradox - GraalVM has never been technologically stronger than it was in 2025. Instead of focusing on being a &#8220;better HotSpot,&#8221; the project fully embraced its unique identity: extremely aggressive AOT, a compiler as a research platform, and a proving ground for techniques that the classic JVM cannot adopt as quickly.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!e52R!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa6fd9d1-04f8-44c9-a643-f2bc1c70f9ae_1207x527.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!e52R!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa6fd9d1-04f8-44c9-a643-f2bc1c70f9ae_1207x527.png 424w, https://substackcdn.com/image/fetch/$s_!e52R!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa6fd9d1-04f8-44c9-a643-f2bc1c70f9ae_1207x527.png 848w, https://substackcdn.com/image/fetch/$s_!e52R!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa6fd9d1-04f8-44c9-a643-f2bc1c70f9ae_1207x527.png 1272w, https://substackcdn.com/image/fetch/$s_!e52R!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa6fd9d1-04f8-44c9-a643-f2bc1c70f9ae_1207x527.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!e52R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa6fd9d1-04f8-44c9-a643-f2bc1c70f9ae_1207x527.png" width="1207" height="527" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fa6fd9d1-04f8-44c9-a643-f2bc1c70f9ae_1207x527.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:527,&quot;width&quot;:1207,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:208726,&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/183660944?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa6fd9d1-04f8-44c9-a643-f2bc1c70f9ae_1207x527.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_!e52R!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa6fd9d1-04f8-44c9-a643-f2bc1c70f9ae_1207x527.png 424w, https://substackcdn.com/image/fetch/$s_!e52R!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa6fd9d1-04f8-44c9-a643-f2bc1c70f9ae_1207x527.png 848w, https://substackcdn.com/image/fetch/$s_!e52R!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa6fd9d1-04f8-44c9-a643-f2bc1c70f9ae_1207x527.png 1272w, https://substackcdn.com/image/fetch/$s_!e52R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa6fd9d1-04f8-44c9-a643-f2bc1c70f9ae_1207x527.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>The best example of this shift is <a href="https://2025.cgo.org/details/cgo-2025-papers/45/GraalNN-Context-Sensitive-Static-Profiling-with-Graph-Neural-Networks">GraalNN</a> - a neural-network-based static profiler. It is one of the most underrated yet most radical ideas in the compiler world in recent years, and it fits perfectly into the zeitgeist of 2025. Instead of relying solely on runtime profiles or simple heuristics, GraalVM uses a trained neural network that predicts branch probabilities based on the structure of the control flow graph - the compiler starts guessing how the code will behave before it ever runs. This is an evolution of the earlier GraalSP based on XGBoost, which has been enabled by default since version 23.0 - but GraalNN goes further. On top of that comes <a href="https://medium.com/graalvm/skipflow-producing-smaller-executables-with-graalvm-f18ca98279c2">SkipFlow</a>, an experimental optimization that tracks primitive values across the entire program and evaluates conditions already at the static analysis stage. In the world of Native Image, where every kilobyte and every method matters, this is a very concrete advantage.</p><p>In parallel, a new and interesting thread emerged: GraalVM and AI at the application level. Quarkus began exploring streamable HTTP and MCP in the context of LLMs, based on its fork of the project - Mandrel - while Oracle is <a href="https://github.com/oracle-samples/genai-langgraph-graalpy">positioning GraalPy as a runtime for building AI agents and workflows</a> (e.g., LangGraph) with very low overhead and good integration with JVM-based backends. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uRbd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fd0f4ea-5cbb-4875-9fee-fe880a2d4c42_720x405.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uRbd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fd0f4ea-5cbb-4875-9fee-fe880a2d4c42_720x405.jpeg 424w, https://substackcdn.com/image/fetch/$s_!uRbd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fd0f4ea-5cbb-4875-9fee-fe880a2d4c42_720x405.jpeg 848w, https://substackcdn.com/image/fetch/$s_!uRbd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fd0f4ea-5cbb-4875-9fee-fe880a2d4c42_720x405.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!uRbd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fd0f4ea-5cbb-4875-9fee-fe880a2d4c42_720x405.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uRbd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fd0f4ea-5cbb-4875-9fee-fe880a2d4c42_720x405.jpeg" width="720" height="405" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0fd0f4ea-5cbb-4875-9fee-fe880a2d4c42_720x405.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:405,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;High Level Design&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="High Level Design" title="High Level Design" srcset="https://substackcdn.com/image/fetch/$s_!uRbd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fd0f4ea-5cbb-4875-9fee-fe880a2d4c42_720x405.jpeg 424w, https://substackcdn.com/image/fetch/$s_!uRbd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fd0f4ea-5cbb-4875-9fee-fe880a2d4c42_720x405.jpeg 848w, https://substackcdn.com/image/fetch/$s_!uRbd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fd0f4ea-5cbb-4875-9fee-fe880a2d4c42_720x405.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!uRbd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fd0f4ea-5cbb-4875-9fee-fe880a2d4c42_720x405.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>At the same time, support for macOS x64 was dropped without sentimentality - GraalVM 25.0.1 is the last release for Intel; the future is exclusively Apple Silicon.</p><p>And this brings us to the key conclusion the community reached in 2025. GraalVM is no longer seen as a competitor to HotSpot and Leyden (rather, Leyden stopped being &#8220;GraalVM for the masses,&#8221; gradually pushing its older sibling out of its natural habitat). Instead, it has found its place as a specialized runtime and compiler: ideal where extreme trade-offs matter - serverless, CLI tools, edge computing, AI inference, native integration, minimal binaries. As Leyden takes over the mainstream JVM, GraalVM occupies the extreme end of the spectrum.</p><p>This was a difficult but healthy narrative correction. For years, GraalVM was the answer to criticisms from the Rust or Go communities, proudly pointing out that Java also had its own native format - though one that never broke into production to the extent the surrounding community had hoped. Now that it no longer has to &#8220;save Java,&#8221; it can focus on what it does best: experimenting faster than the mainline, bringing ML into compilation, and pushing the boundaries of AOT. And Java - paradoxically - comes out better for it, because instead of one tool for everything, it gains a coherent spectrum of solutions.</p><p>I think it&#8217;s fair to say that in 2025 it became clear: GraalVM is not the future of the entire JVM. But without GraalVM, that future would look significantly poorer.</p><h2>Jakarta EE - The Year that breathed life into a &#8220;Dead&#8221; Platform</h2><p>If anyone had written Jakarta EE off a year ago, 2025 must have felt like a cold shower. This was the year the platform stopped merely catching up and actually started building its future.</p><p><a href="https://jakarta.ee/release/11/">Jakarta EE 11</a> - after 34 months since the previous release - finally saw the light of day. First came the Core Profile (December 2024), then the Web Profile (March 2025), and the full platform on June 26. The delay, however, made sense: the Working Group spent that time thoroughly modernizing the TCK - migrating from Ant/TestHarness to Maven/JUnit 5/Arquillian. Boring? Yes. But it was precisely this &#8220;plumbing&#8221; that had blocked progress for years and scared off new vendors.</p><p>Version 11 itself brings two stars: <a href="https://jakarta.ee/specifications/data/1.0/">Jakarta Data 1.0</a> - an answer to Spring Data without Spring, with repositories defined via interfaces and implementations generated automatically&#8212;and Jakarta Concurrency 3.1 with full support for Virtual Threads. On top of that come Java Records in Persistence and Validation, the removal of the Security Manager, and the deprecation of Managed Beans. The platform is finally speaking the language of modern Java.</p><p>And that&#8217;s not all. In March, <a href="https://jakarta.ee/specifications/nosql/1.0/">Jakarta NoSQL 1.0</a> was approved - a specification standardizing access to document, graph, and key-value databases with an API modeled after JPA. It didn&#8217;t make it into EE 11, but it paves the way for future profiles.</p><p>And in the fall? <a href="https://jakarta.ee/specifications/agentic-ai/">Jakarta Agentic AI</a> - a project under the Eclipse Foundation umbrella (initiated by Payara and Reza Rahman) that aims to define a vendor-neutral API for AI agents: lifecycle, integration with CDI and REST, and standard guardrails. The first release is planned for Q1 2026. At the same time, MicroProfile AI is taking its own, more pragmatic path - trying to integrate LangChain4j into the ecosystem without waiting for full specifications.</p><p>Greetings to the rest of technical community from the more peaceful wotld.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Y7zV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45077fa2-ee6f-49f9-b78a-1579ee42e7c5_780x438.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Y7zV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45077fa2-ee6f-49f9-b78a-1579ee42e7c5_780x438.png 424w, https://substackcdn.com/image/fetch/$s_!Y7zV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45077fa2-ee6f-49f9-b78a-1579ee42e7c5_780x438.png 848w, https://substackcdn.com/image/fetch/$s_!Y7zV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45077fa2-ee6f-49f9-b78a-1579ee42e7c5_780x438.png 1272w, https://substackcdn.com/image/fetch/$s_!Y7zV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45077fa2-ee6f-49f9-b78a-1579ee42e7c5_780x438.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Y7zV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45077fa2-ee6f-49f9-b78a-1579ee42e7c5_780x438.png" width="780" height="438" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/45077fa2-ee6f-49f9-b78a-1579ee42e7c5_780x438.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:438,&quot;width&quot;:780,&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_!Y7zV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45077fa2-ee6f-49f9-b78a-1579ee42e7c5_780x438.png 424w, https://substackcdn.com/image/fetch/$s_!Y7zV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45077fa2-ee6f-49f9-b78a-1579ee42e7c5_780x438.png 848w, https://substackcdn.com/image/fetch/$s_!Y7zV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45077fa2-ee6f-49f9-b78a-1579ee42e7c5_780x438.png 1272w, https://substackcdn.com/image/fetch/$s_!Y7zV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45077fa2-ee6f-49f9-b78a-1579ee42e7c5_780x438.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>However, for those who crave emotions and enjoy the behind-the-scenes drama - over the summer, a governance conflict played out on the mailing lists. For years there have been discussions about merging MicroProfile into Jakarta EE (a logical step, since MicroProfile already depends on the Core Profile), but such a merge requires a so-called super-majority. David Blevins (Tomitribe) publicly announced that a coalition of several vendors has enough votes to block it&#8212;not because they oppose integration per se, but pending resolution of a conflict of interest. The crux of the dispute: within the Jakarta EE Working Group structure sits EE4J&#8212;a parent project that includes GlassFish. Blevins argues that the WG&#8217;s budget, marketing, and community programs effectively promote one implementation at the expense of competitors (Payara, Open Liberty, WildFly, TomEE). His proposal: split EE4J into a separate structure, and let the Jakarta EE WG focus solely on specifications. OmniFish (the GlassFish steward) agrees to the split but denies any intentional favoritism&#8212;calling it historical baggage that is gradually being removed. Current status: in November, a proposal passed to retain the <code>org.eclipse.microprofile.*</code> namespace in the event of a merge&#8212;a signal that the community is preparing for integration without repeating the pain of <code>javax.*</code> &#8594; <code>jakarta.*</code>. but the EE4J issue remains unresolved.</p><p>Additionally: the plan for Jakarta EE 12 (scheduled for July 2026) has already been approved - mandatory JDK 21, support for JDK 25, new specifications Jakarta Config and Jakarta Query, deprecation of the Application Client, and further consolidation of the data layer.</p><p>Not a bad year for a &#8220;dead&#8221; platform.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tgYz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a3ef142-75f1-483d-af9a-3427c0dfc3ef_640x270.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tgYz!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a3ef142-75f1-483d-af9a-3427c0dfc3ef_640x270.gif 424w, https://substackcdn.com/image/fetch/$s_!tgYz!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a3ef142-75f1-483d-af9a-3427c0dfc3ef_640x270.gif 848w, https://substackcdn.com/image/fetch/$s_!tgYz!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a3ef142-75f1-483d-af9a-3427c0dfc3ef_640x270.gif 1272w, https://substackcdn.com/image/fetch/$s_!tgYz!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a3ef142-75f1-483d-af9a-3427c0dfc3ef_640x270.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tgYz!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a3ef142-75f1-483d-af9a-3427c0dfc3ef_640x270.gif" width="640" height="270" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4a3ef142-75f1-483d-af9a-3427c0dfc3ef_640x270.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:270,&quot;width&quot;:640,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:10695864,&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/183660944?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a3ef142-75f1-483d-af9a-3427c0dfc3ef_640x270.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_!tgYz!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a3ef142-75f1-483d-af9a-3427c0dfc3ef_640x270.gif 424w, https://substackcdn.com/image/fetch/$s_!tgYz!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a3ef142-75f1-483d-af9a-3427c0dfc3ef_640x270.gif 848w, https://substackcdn.com/image/fetch/$s_!tgYz!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a3ef142-75f1-483d-af9a-3427c0dfc3ef_640x270.gif 1272w, https://substackcdn.com/image/fetch/$s_!tgYz!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a3ef142-75f1-483d-af9a-3427c0dfc3ef_640x270.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><h2>Scala Says Goodbye to JDK 8</h2><p>For a decade, JDK 8 was the anchor of the JVM ecosystem - but that era is coming to an end. Spring Boot 3 requires JDK 17. Jakarta EE 10 has a minimum of JDK 11. Hibernate 6, Quarkus 3.7, Micronaut 4 - all have gone down the same path. And it is precisely in this context that Scala made its most symbolic move in 2025. In March, the <a href="https://docs.scala-lang.org/overviews/jdk-compatibility/overview.html">Scala team officially announced its decision: JDK 17 will become the new minimum</a>, starting with Scala 3.8 (currently in RC4, so the release is likely imminent) and the next LTS (most likely Scala 3.9). Not JDK 11 - straight to 17. The discussion about whether to also drop JDK 11 revealed no convincing reason to keep it&#8212;11 is now almost as outdated as 8.</p><p>The direct reason? The implementation of <code>lazy val</code> in Scala - one of the language&#8217;s most distinctive constructs - relies on low-level operations from <code>sun.misc.Unsafe</code>, which are necessary to ensure correct behavior in multithreaded environments (initialization must happen exactly once, even when multiple threads access the value simultaneously). The problem is that Oracle has been planning to remove these methods for years - JEP 471 officially deprecates them, and future JDKs (25+) may remove them entirely. Scala therefore had to rewrite the <code>lazy val</code> implementation using a newer API (<code>VarHandle</code>), which is only available starting with JDK 9. Maintaining two code paths - the old one for JDK 8 and the new one for newer versions - was deemed too costly.</p><p>There is also a beautiful irony in all of this: for years, Scala was ahead of Java (pattern matching, sealed types, ADTs). Java eventually caught up with Scala at the language level - and now Scala can finally take advantage of the bytecode that Java created&#8230; inspired by Scala. The loop is complete.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!83I1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89b84c02-a382-4976-8689-76c5ce07746b_1275x1062.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!83I1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89b84c02-a382-4976-8689-76c5ce07746b_1275x1062.jpeg 424w, https://substackcdn.com/image/fetch/$s_!83I1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89b84c02-a382-4976-8689-76c5ce07746b_1275x1062.jpeg 848w, https://substackcdn.com/image/fetch/$s_!83I1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89b84c02-a382-4976-8689-76c5ce07746b_1275x1062.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!83I1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89b84c02-a382-4976-8689-76c5ce07746b_1275x1062.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!83I1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89b84c02-a382-4976-8689-76c5ce07746b_1275x1062.jpeg" width="1275" height="1062" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/89b84c02-a382-4976-8689-76c5ce07746b_1275x1062.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1062,&quot;width&quot;:1275,&quot;resizeWidth&quot;:0,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&#1057;omics meme: \&quot;Scala Java Scala Java Java Python\&quot; - Comics ...&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="&#1057;omics meme: &quot;Scala Java Scala Java Java Python&quot; - Comics ..." title="&#1057;omics meme: &quot;Scala Java Scala Java Java Python&quot; - Comics ..." srcset="https://substackcdn.com/image/fetch/$s_!83I1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89b84c02-a382-4976-8689-76c5ce07746b_1275x1062.jpeg 424w, https://substackcdn.com/image/fetch/$s_!83I1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89b84c02-a382-4976-8689-76c5ce07746b_1275x1062.jpeg 848w, https://substackcdn.com/image/fetch/$s_!83I1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89b84c02-a382-4976-8689-76c5ce07746b_1275x1062.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!83I1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89b84c02-a382-4976-8689-76c5ce07746b_1275x1062.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">We are one great family, in the end</figcaption></figure></div><h2>Kotlin and the Moment When K2 Stops Being &#8220;New&#8221;</h2><p>After Kotlin&#8217;s very dynamic development in 2024, with the highlight being version 2.0 in May, 2025 became a year of normalization. Kotlin 2.2 (June) and 2.3 (December) no longer try to convince anyone that K2 is the future - they assume instead that &#8220;the future is now,&#8221; and focus on what ultimately determines real adoption: performance, ergonomics, and ecosystem completeness.</p><p>The most telling signal is therefore tooling-related rather than language-level. K2 mode became the default in IntelliJ IDEA (from 2025.1). This means that code analysis, completion, highlighting, and refactorings in the IDE are powered by exactly the same engine that compiles the code. JetBrains decided that K2 is stable and fast enough to become the foundation of the entire workflow.</p><p><a href="https://kotlinlang.org/docs/whatsnew22.html">Kotlin 2.2</a> and <a href="https://kotlinlang.org/docs/whatsnew23.html">2.3</a> (which we didn&#8217;t covered yet in JVM Weekly, but it time will come) represent a maturation phase - rather than a single &#8220;killer feature,&#8221; we get a series of small but noticeable improvements. Guard conditions in <code>when</code>, context parameters that organize dependencies, non-local <code>break</code>/<code>continue</code>, multi-dollar string interpolation&#8212;these are changes that don&#8217;t make a splash (you&#8217;ve probably already forgotten what was in the previous sentence), but save time every day. API stabilization (<code>HexFormat</code>, <code>Base64</code>, <code>UUID</code>), compatibility with Gradle 9.0, new mechanisms for source registration - Kotlin stops living &#8220;alongside&#8221; the JVM toolchain and starts being co-designed with it.</p><p>At the same time, Kotlin Multiplatform continues to mature - a technology that for years was both the biggest promise and the biggest question mark. Compose Multiplatform for iOS reaches production-ready status in 2025, and not in the sense of &#8220;it works in a demo,&#8221; but as a fully-fledged UI stack: native scrolling, text selection, drag-and-drop, variable fonts, natural gestures. Add to that Compose Hot Reload, which dramatically shortens the feedback loop. This is the moment when UI stops being the &#8220;weak link&#8221; of KMP.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7xKI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d34b3f1-2c3f-4c9f-9275-b0ff779b8465_800x800.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7xKI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d34b3f1-2c3f-4c9f-9275-b0ff779b8465_800x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!7xKI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d34b3f1-2c3f-4c9f-9275-b0ff779b8465_800x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!7xKI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d34b3f1-2c3f-4c9f-9275-b0ff779b8465_800x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!7xKI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d34b3f1-2c3f-4c9f-9275-b0ff779b8465_800x800.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7xKI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d34b3f1-2c3f-4c9f-9275-b0ff779b8465_800x800.jpeg" width="484" height="484" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5d34b3f1-2c3f-4c9f-9275-b0ff779b8465_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;:484,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;androiddev | Ranbir Singh | 64 comments&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="androiddev | Ranbir Singh | 64 comments" title="androiddev | Ranbir Singh | 64 comments" srcset="https://substackcdn.com/image/fetch/$s_!7xKI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d34b3f1-2c3f-4c9f-9275-b0ff779b8465_800x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!7xKI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d34b3f1-2c3f-4c9f-9275-b0ff779b8465_800x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!7xKI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d34b3f1-2c3f-4c9f-9275-b0ff779b8465_800x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!7xKI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d34b3f1-2c3f-4c9f-9275-b0ff779b8465_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><p>In the same context, <a href="https://kotlinlang.org/docs/native-swift-export.html">Swift Export</a> appears - still in preview, but highly symbolic. Kotlin no longer integrates with Swift via Objective-C, and instead starts exporting APIs directly into the Swift world.</p><p>The tooling backend is also being cleaned up. <code>kapt</code> uses K2 by default, old flags are being deprecated, and annotation processing finally stops being a &#8220;parallel world&#8221; alongside the new compiler. Alongside this, Amper continues to evolve&#8212;still experimental, but increasingly positioned as an alternative where Gradle is too heavy and tight IDE integration matters more than maximum configurability.</p><p>There is, of course, Kotlin LSP - but it is such an interesting phenomenon in its own right that we&#8217;ll come back to it later.</p><h2>Clojure Is&#8230; AI-Skeptical</h2><p>In 2025, Clojure did something that, in the age of &#8220;AI everywhere,&#8221; feels almost countercultural: instead of trying to win the fireworks race, it focused on steadily closing the gaps in the language&#8217;s and tooling&#8217;s foundations. The most &#8220;official&#8221; rhythm of the year came from successive releases in the 1.12.x line. On paper, these were tiny releases, but they&#8217;re quintessentially Clojure: semantic fixes, compiler improvements, visibility and safety issues in LazySeq and STM - the kinds of changes that improve the predictability of systems meant to last for years.</p><p>And here&#8217;s the most interesting part: this &#8220;quiet&#8221; year for the language itself collided with a very loud statement from Rich Hickey about AI - a statement that, in many ways, explains why Clojure in 2025 looks the way it does. In early January 2026, Hickey published an essay titled <em>&#8220;<a href="https://gist.github.com/richhickey/ea94e3741ff0a4e3af55b9fe6287887f">Thanks AI!</a>&#8221;</em> (sneaking into this overview at the last possible moment), in which he directly addresses the side effects of generative AI: from flooding the world with &#8220;slop,&#8221; through degrading search and education, to cutting off the entry path for juniors (the disappearance of entry-level jobs as a &#8220;road to experience&#8221;). Classic Hickey: evaluating technology through the lens of whether it reduces complexity and improves the quality of social systems, not just technical ones.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gD5q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1d9b34a-d244-4247-90a9-de6ced17291b_500x532.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gD5q!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1d9b34a-d244-4247-90a9-de6ced17291b_500x532.jpeg 424w, https://substackcdn.com/image/fetch/$s_!gD5q!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1d9b34a-d244-4247-90a9-de6ced17291b_500x532.jpeg 848w, https://substackcdn.com/image/fetch/$s_!gD5q!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1d9b34a-d244-4247-90a9-de6ced17291b_500x532.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!gD5q!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1d9b34a-d244-4247-90a9-de6ced17291b_500x532.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gD5q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1d9b34a-d244-4247-90a9-de6ced17291b_500x532.jpeg" width="500" height="532" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d1d9b34a-d244-4247-90a9-de6ced17291b_500x532.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:532,&quot;width&quot;:500,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Ai tools Memes &#183; ProgrammerHumor.io&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="Ai tools Memes &#183; ProgrammerHumor.io" title="Ai tools Memes &#183; ProgrammerHumor.io" srcset="https://substackcdn.com/image/fetch/$s_!gD5q!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1d9b34a-d244-4247-90a9-de6ced17291b_500x532.jpeg 424w, https://substackcdn.com/image/fetch/$s_!gD5q!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1d9b34a-d244-4247-90a9-de6ced17291b_500x532.jpeg 848w, https://substackcdn.com/image/fetch/$s_!gD5q!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1d9b34a-d244-4247-90a9-de6ced17291b_500x532.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!gD5q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1d9b34a-d244-4247-90a9-de6ced17291b_500x532.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>Instead of building &#8220;the Clojure AI agent framework of the year,&#8221; the community pumped energy into tooling and ergonomics. <a href="https://www.clojuriststogether.org/news/annually-funded-developers-update-september/october-2025/">Clojurists Together&#8217;s 2025 reports</a> explicitly show where funding and effort went: to people working on <code>clojure-lsp</code> and IDE integration, on <code>clj-kondo</code>, <code>babashka</code>, and SCI, on CIDER - in other words, on things that shorten the feedback loop and improve the quality of everyday work, regardless of whether an LLM is involved in the background.</p><p>And this is, paradoxically, one of the most important things about Clojure in 2025: in a world where many ecosystems respond to AI with a marketing reflex, Clojure responds&#8230; like Clojure. Quality, semantics, and tools first. The rest can wait.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Tset!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2efa51ad-08da-43b2-8fdc-3bce1f17da61_736x611.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Tset!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2efa51ad-08da-43b2-8fdc-3bce1f17da61_736x611.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Tset!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2efa51ad-08da-43b2-8fdc-3bce1f17da61_736x611.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Tset!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2efa51ad-08da-43b2-8fdc-3bce1f17da61_736x611.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Tset!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2efa51ad-08da-43b2-8fdc-3bce1f17da61_736x611.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Tset!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2efa51ad-08da-43b2-8fdc-3bce1f17da61_736x611.jpeg" width="736" height="611" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2efa51ad-08da-43b2-8fdc-3bce1f17da61_736x611.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:611,&quot;width&quot;:736,&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_!Tset!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2efa51ad-08da-43b2-8fdc-3bce1f17da61_736x611.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Tset!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2efa51ad-08da-43b2-8fdc-3bce1f17da61_736x611.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Tset!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2efa51ad-08da-43b2-8fdc-3bce1f17da61_736x611.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Tset!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2efa51ad-08da-43b2-8fdc-3bce1f17da61_736x611.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><h2>Groovy 5.0 - A New (Small) Impulse for a Classic JVM Language</h2><p>Groovy has a long history behind it - from a dynamic, &#8220;magical&#8221; JVM language that in the mid-2000s was one of the most interesting alternatives to Java, inspired by Ruby (the ultimate &#8220;cool kid&#8221; language of its time), through a scripting platform used in Gradle, Jenkins, and Grails, to today&#8217;s ecosystem where its mainstream adoption has been declining in favor of Kotlin/Java and more strongly typed tools.</p><p>Released in the summer of 2025, <a href="https://groovy-lang.org/releasenotes/groovy-5.0.html">Groovy 5.0</a> is the first major revision since Groovy 4 and an attempt to bring more modern language features and tooling quality into a project that for a long time was seen more as a &#8220;support tool&#8221; than a fully fledged programming language. The release includes a wide range of improvements: broad compatibility with JDK 11&#8211;25, hundreds of new or enhanced extension methods for Java&#8217;s standard APIs, a reworked REPL console, better interoperability with modern JDK versions, and a number of conveniences for working with collections and iteration. All of this is meant to ensure that Groovy doesn&#8217;t fall behind in the era of newer JVM platforms.</p><p>One of the most anticipated features of 5.0 is GINQ (Groovy INtegrated Query) - a SQL-style query language built into Groovy that allows collection and data-structure operations to be expressed in a more declarative way. This functionality already existed in earlier 4.x versions, but in 5.0 it is strengthened and treated as a first-class part of the language. GINQ offers capabilities similar to LINQ in .NET, with <code>from</code>, <code>where</code>, <code>orderby</code>, and <code>select</code> clauses, and support for working with different kinds of data sources.</p><p>The community&#8217;s reception of Groovy 5.0 has been mixed, which is hardly surprising given the language&#8217;s position in 2025. Developers still invested in Groovy appreciate the modern improvements - such as better performance for collection operations, fixes to the REPL and interoperability, and the fact that the project continues to evolve beyond 4.x. As some commentators put it, this is &#8220;the best version of Groovy so far,&#8221; with hundreds of fixes and extensions. On the other hand, discussions and forum posts also point out that the language continues to struggle with limited adoption and tooling support outside its traditional niches, such as CI/CD scripts, Gradle DSLs, or automation tasks. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!03_0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F221c2982-1fd4-4c9b-8488-c868b7be3d04_597x499.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!03_0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F221c2982-1fd4-4c9b-8488-c868b7be3d04_597x499.jpeg 424w, https://substackcdn.com/image/fetch/$s_!03_0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F221c2982-1fd4-4c9b-8488-c868b7be3d04_597x499.jpeg 848w, https://substackcdn.com/image/fetch/$s_!03_0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F221c2982-1fd4-4c9b-8488-c868b7be3d04_597x499.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!03_0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F221c2982-1fd4-4c9b-8488-c868b7be3d04_597x499.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!03_0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F221c2982-1fd4-4c9b-8488-c868b7be3d04_597x499.jpeg" width="597" height="499" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/221c2982-1fd4-4c9b-8488-c868b7be3d04_597x499.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:499,&quot;width&quot;:597,&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_!03_0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F221c2982-1fd4-4c9b-8488-c868b7be3d04_597x499.jpeg 424w, https://substackcdn.com/image/fetch/$s_!03_0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F221c2982-1fd4-4c9b-8488-c868b7be3d04_597x499.jpeg 848w, https://substackcdn.com/image/fetch/$s_!03_0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F221c2982-1fd4-4c9b-8488-c868b7be3d04_597x499.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!03_0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F221c2982-1fd4-4c9b-8488-c868b7be3d04_597x499.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>All in all, Groovy 5.0 is an interesting release: it delivers new language features, stronger JDK compatibility, and improved ergonomics, while at the same time fighting for attention in a JVM landscape dominated by Kotlin, Java, and statically typed tools. Its role in projects like Gradle (where it is gradually being displaced by Kotlin), Grails (which itself is no longer a popularity powerhouse), or Jenkins shows that the language still has its place - but its development in 2025 is more evolutionary than revolutionary.</p><h1>2. What&#8217;s Happening in the Community</h1><h2>OpenRewrite: From a Tool to an Ecosystem</h2><p>Not long ago, OpenRewrite existed in the collective consciousness as <em>&#8220;that tool for migrating Spring Boot.&#8221;</em> Useful and effective, but still fairly narrowly pigeonholed. In 2025, that phase definitively ended. OpenRewrite stopped being a product and started functioning like infrastructure - quiet, embedded, often invisible, but absolutely critical to how code in the JVM ecosystem is modernized today.</p><p>A symbolic moment was OpenRewrite being built directly into IntelliJ IDEA starting with version 2024.1. From that point on, it was no longer a plugin for enthusiasts, but a first-contact tool. <a href="https://www.jetbrains.com/idea/whatsnew/2024-1/">YAML recipes with autocompletion, inline execution of complex transformations, gutter-based migration runs, and debugging scans and Refaster rules</a> turned automated refactoring from a &#8220;special operation&#8221; into a normal part of everyday IDE work. When JetBrains treats a tool as part of the editor itself, it usually signals that the ecosystem has matured to a new standard.</p><p>In parallel, <a href="https://github.com/features/copilot">Microsoft&#8217;s App Modernization initiatives built around GitHub Copilot</a> do not &#8220;write migrations&#8221; themselves. Copilot plans steps, explains changes, and closes error loops&#8212;but the deterministic code transformation is performed by OpenRewrite itself. AI analyzes the codebase and proposes a migration sequence, <a href="https://docs.openrewrite.org/">OpenRewrite applies semantic transformations</a>, and Copilot iteratively fixes compilation and test failures. Java 8 &#8594; 25, Spring Boot 2 &#8594; 4, <code>javax</code> &#8594; <code>jakarta</code>, JUnit 4 &#8594; 6&#8212;without a semantic refactoring layer, this entire process would degrade into little more than prompt engineering and hope. Even the most advanced LLM-based tools still require a deterministic refactoring engine underneath to constrain stochastic behavior.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!E-sA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe89de203-0c9f-4957-a14f-375f0baed7ab_500x793.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!E-sA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe89de203-0c9f-4957-a14f-375f0baed7ab_500x793.png 424w, https://substackcdn.com/image/fetch/$s_!E-sA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe89de203-0c9f-4957-a14f-375f0baed7ab_500x793.png 848w, https://substackcdn.com/image/fetch/$s_!E-sA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe89de203-0c9f-4957-a14f-375f0baed7ab_500x793.png 1272w, https://substackcdn.com/image/fetch/$s_!E-sA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe89de203-0c9f-4957-a14f-375f0baed7ab_500x793.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!E-sA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe89de203-0c9f-4957-a14f-375f0baed7ab_500x793.png" width="500" height="793" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e89de203-0c9f-4957-a14f-375f0baed7ab_500x793.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:793,&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_!E-sA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe89de203-0c9f-4957-a14f-375f0baed7ab_500x793.png 424w, https://substackcdn.com/image/fetch/$s_!E-sA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe89de203-0c9f-4957-a14f-375f0baed7ab_500x793.png 848w, https://substackcdn.com/image/fetch/$s_!E-sA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe89de203-0c9f-4957-a14f-375f0baed7ab_500x793.png 1272w, https://substackcdn.com/image/fetch/$s_!E-sA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe89de203-0c9f-4957-a14f-375f0baed7ab_500x793.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>The same pattern appears elsewhere. <a href="https://www.moderne.io/">Azul integrates OpenRewrite via Moderne rather than building its own refactoring system</a>, combining automated code transformations with <a href="https://www.azul.com/products/intelligence-cloud/">runtime insights from Azul Intelligence Cloud</a>. </p><p>What&#8217;s most interesting is how many tools now rely on OpenRewrite without exposing that dependency prominently. Moderne is the obvious example, but the same pattern can be observed in security auditing tools, compliance platforms, mass repository migration systems, and internal &#8220;code remediation&#8221; platforms built by large organizations. OpenRewrite is increasingly playing the same role for refactoring that <a href="https://llvm.org/">LLVM plays for compilers</a> - a shared substrate on which others can build workflows, UIs, and integrations without reimplementing parsers, visitors, or semantic analysis from scratch.</p><p>At the same time, the technical scope of OpenRewrite continues to expand beyond Java. It now supports JavaScript, TypeScript, Android, and increasingly complete Scala coverage, with rapid parser updates tracking Java 25, Spring Boot 3.5, and Spring Cloud 2025. The <a href="https://docs.openrewrite.org/recipes">OpenRewrite recipe catalog has surpassed 3,000 entries</a>, evolving from a simple list of migrations into a living knowledge base that captures how large, long-lived systems actually evolve in practice.</p><p>Have fun with JavaScript, OpenRewrite.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!n4qT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F087a9512-25f0-4b3d-bbe3-6c7286593854_1488x960.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!n4qT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F087a9512-25f0-4b3d-bbe3-6c7286593854_1488x960.png 424w, https://substackcdn.com/image/fetch/$s_!n4qT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F087a9512-25f0-4b3d-bbe3-6c7286593854_1488x960.png 848w, https://substackcdn.com/image/fetch/$s_!n4qT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F087a9512-25f0-4b3d-bbe3-6c7286593854_1488x960.png 1272w, https://substackcdn.com/image/fetch/$s_!n4qT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F087a9512-25f0-4b3d-bbe3-6c7286593854_1488x960.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!n4qT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F087a9512-25f0-4b3d-bbe3-6c7286593854_1488x960.png" width="1456" height="939" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/087a9512-25f0-4b3d-bbe3-6c7286593854_1488x960.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:939,&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_!n4qT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F087a9512-25f0-4b3d-bbe3-6c7286593854_1488x960.png 424w, https://substackcdn.com/image/fetch/$s_!n4qT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F087a9512-25f0-4b3d-bbe3-6c7286593854_1488x960.png 848w, https://substackcdn.com/image/fetch/$s_!n4qT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F087a9512-25f0-4b3d-bbe3-6c7286593854_1488x960.png 1272w, https://substackcdn.com/image/fetch/$s_!n4qT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F087a9512-25f0-4b3d-bbe3-6c7286593854_1488x960.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>Private Equity Enters the Game: Azul Acquires Payara</h2><p>On December 10, 2025, <a href="https://www.azul.com/">Azul</a> announced the acquisition of <a href="https://www.payara.fish/">Payara</a>&#8212;the company behind the enterprise fork of GlassFish and one of the last truly serious players in the <a href="https://jakarta.ee/">Jakarta EE</a> world. On paper, this looks like a classic product acquisition. In practice, it&#8217;s a much deeper move that closes a long sequence of events.</p><p>Just a few weeks earlier, <a href="https://www.thomabravo.com/">Thoma Bravo</a> entered Azul. And when private equity of that scale shows up in a technology company, it&#8217;s usually not about maintaining the status quo - it&#8217;s about building a platform capable of aggressive growth.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ff6f!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe49d360d-c807-4f7d-aae7-5626b538807d_2118x1268.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ff6f!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe49d360d-c807-4f7d-aae7-5626b538807d_2118x1268.png 424w, https://substackcdn.com/image/fetch/$s_!Ff6f!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe49d360d-c807-4f7d-aae7-5626b538807d_2118x1268.png 848w, https://substackcdn.com/image/fetch/$s_!Ff6f!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe49d360d-c807-4f7d-aae7-5626b538807d_2118x1268.png 1272w, https://substackcdn.com/image/fetch/$s_!Ff6f!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe49d360d-c807-4f7d-aae7-5626b538807d_2118x1268.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ff6f!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe49d360d-c807-4f7d-aae7-5626b538807d_2118x1268.png" width="1456" height="872" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e49d360d-c807-4f7d-aae7-5626b538807d_2118x1268.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:872,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4436662,&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/183660944?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe49d360d-c807-4f7d-aae7-5626b538807d_2118x1268.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_!Ff6f!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe49d360d-c807-4f7d-aae7-5626b538807d_2118x1268.png 424w, https://substackcdn.com/image/fetch/$s_!Ff6f!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe49d360d-c807-4f7d-aae7-5626b538807d_2118x1268.png 848w, https://substackcdn.com/image/fetch/$s_!Ff6f!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe49d360d-c807-4f7d-aae7-5626b538807d_2118x1268.png 1272w, https://substackcdn.com/image/fetch/$s_!Ff6f!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe49d360d-c807-4f7d-aae7-5626b538807d_2118x1268.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>For years, Azul has been a very clearly profiled company: an excellent JDK, extremely strong expertise in performance, stability, and security&#8212;but still just one fragment of the overall stack. For large Java customers (you know - the true enterprise+ scale), the story rarely ends at the JVM. It ends with the question: <em>&#8220;what about the application server themselves?&#8221;</em></p><p>And this is exactly where Payara comes into the picture.</p><p>For years, Payara has existed somewhat outside the main hype cycle, consistently serving organizations that could not - or did not want to - abandon Jakarta EE. Banks, public administration, industry - places where applications live for decades, not quarters.</p><p>For Azul, this was the missing piece of the puzzle. The acquisition of Payara makes it possible to offer customers a complete, coherent story: from the JDK, through the runtime, all the way to the application platform. One responsibility, one vendor, one operating model. The broader market context is even more interesting. The application server market - declared dead many times over, even in this article itself - is today worth tens of billions of dollars (<a href="https://www.grandviewresearch.com/industry-analysis/application-server-market">yes, I was surprised too</a>).</p><p>Why? Because microservices and the cloud didn&#8217;t erase monoliths - they merely added new layers alongside them. Organizations are migrating, but they do so in stages. And they need platforms that can handle both the <em>&#8220;old&#8221;</em> and the <em>&#8220;new&#8221;</em> at the same time.</p><h2>BM Merges the Red Hat Java Team&#8230; and Buys Kafka</h2><p>Azul isn&#8217;t the only company trying to give customers a more focused, end-to-end offering. 2025 brought two IBM moves that, taken separately, look like routine corporate reshuffles&#8212;but together form something much more interesting: an attempt to build a coherent enterprise stack that actually lives in real time, instead of pretending to analyze data &#8220;almost instantly.&#8221;</p><p>Early in the year - fairly quietly (unless you read <em>JVM Weekly</em>, in which case not quietly at all) - <a href="https://www.redhat.com/en/blog/evolving-our-middleware-strategy">Red Hat&#8217;s Java and middleware teams were merged into IBM&#8217;s Data Security, IAM &amp; Runtimes organization</a>. Sounds like just another reorg? Maybe. But the context matters.</p><p>Since IBM acquired Red Hat in 2019 for $34 billion, the two companies have effectively been running parallel JVM universes: Red Hat with JBoss EAP, WildFly, and Quarkus and IBM with WebSphere, Open Liberty, and OpenJ9.</p><p>Two teams, two roadmaps, two philosophies tackling the same problem. Now they&#8217;re meant to be one. The projects remain open source (WildFly and Quarkus were moved under the Commonhaus Foundation), but middleware strategy is now owned by a single organization - not two competing ones.</p><p>December, however, brought the real fireworks: <a href="https://newsroom.ibm.com/2025-12-08-ibm-to-acquire-confluent-to-create-smart-data-platform-for-enterprise-generative-ai">IBM buys Confluent for $11 billion</a> in cash. Eleven. Not &#8220;considering,&#8221; not &#8220;exploring&#8221; - done, signed, with a premium and full commitment. And suddenly, everything clicks.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!J6-6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb85579bf-605e-4abc-8e38-f12a571124a7_725x500.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!J6-6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb85579bf-605e-4abc-8e38-f12a571124a7_725x500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!J6-6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb85579bf-605e-4abc-8e38-f12a571124a7_725x500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!J6-6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb85579bf-605e-4abc-8e38-f12a571124a7_725x500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!J6-6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb85579bf-605e-4abc-8e38-f12a571124a7_725x500.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!J6-6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb85579bf-605e-4abc-8e38-f12a571124a7_725x500.jpeg" width="725" height="500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b85579bf-605e-4abc-8e38-f12a571124a7_725x500.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:500,&quot;width&quot;:725,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Resharing this meme by Stanislav Kozlovski as it's hilarious and true. Stan  what is the next domino?? Doesn't this shit just keep getting bigger?? |  Hugo Lu&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="Resharing this meme by Stanislav Kozlovski as it's hilarious and true. Stan  what is the next domino?? Doesn't this shit just keep getting bigger?? |  Hugo Lu" title="Resharing this meme by Stanislav Kozlovski as it's hilarious and true. Stan  what is the next domino?? Doesn't this shit just keep getting bigger?? |  Hugo Lu" srcset="https://substackcdn.com/image/fetch/$s_!J6-6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb85579bf-605e-4abc-8e38-f12a571124a7_725x500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!J6-6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb85579bf-605e-4abc-8e38-f12a571124a7_725x500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!J6-6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb85579bf-605e-4abc-8e38-f12a571124a7_725x500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!J6-6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb85579bf-605e-4abc-8e38-f12a571124a7_725x500.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>Kafka may be the backbone of real-time data, but Confluent has never been profitable - billions in losses over the years - which made many analysts skeptical. IBM sees it differently: 45% of the Fortune 500 already use Confluent products. For a startup (okay, not that small anymore), that&#8217;s success. For Big Blue, it&#8217;s a list of customers who don&#8217;t yet realize they need event-driven architecture bundled with 24/7 support and long-term enterprise contracts.</p><p>And this is where Java comes back into the picture. Red Hat gave IBM the platform (OpenShift). HashiCorp (<a href="https://www.hashicorp.com/en/blog/hashicorp-officially-joins-the-ibm-family">deal finalized this year as well</a>) delivered infrastructure as code. Confluent brings real time.</p><p>The newly unified Java/middleware team is supposed to glue all of this into a single, predictable stack for enterprises that want to build event-reactive systems.</p><p>It&#8217;s an interesting bet: IBM is wagering that the future of enterprise isn&#8217;t better dashboards, but architectures where data stops being &#8220;what happened&#8221; and becomes &#8220;what is happening.&#8221; And to do that properly, you need runtimes (the Java stack), a platform (OpenShift), orchestration (Terraform), and a circulatory system (Kafka).</p><p>Will it work? Time will tell. But one thing is certain: IBM didn&#8217;t buy Confluent to improve the next quarterly report. The effects should become visible pretty soon.</p><p>Cause always remember the crucial 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_!grbM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb2ffd31-ca71-4ac3-93f1-90e64e4dba87_976x802.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!grbM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb2ffd31-ca71-4ac3-93f1-90e64e4dba87_976x802.png 424w, https://substackcdn.com/image/fetch/$s_!grbM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb2ffd31-ca71-4ac3-93f1-90e64e4dba87_976x802.png 848w, https://substackcdn.com/image/fetch/$s_!grbM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb2ffd31-ca71-4ac3-93f1-90e64e4dba87_976x802.png 1272w, https://substackcdn.com/image/fetch/$s_!grbM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb2ffd31-ca71-4ac3-93f1-90e64e4dba87_976x802.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!grbM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb2ffd31-ca71-4ac3-93f1-90e64e4dba87_976x802.png" width="976" height="802" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/eb2ffd31-ca71-4ac3-93f1-90e64e4dba87_976x802.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:802,&quot;width&quot;:976,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:661322,&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/183660944?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb2ffd31-ca71-4ac3-93f1-90e64e4dba87_976x802.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_!grbM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb2ffd31-ca71-4ac3-93f1-90e64e4dba87_976x802.png 424w, https://substackcdn.com/image/fetch/$s_!grbM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb2ffd31-ca71-4ac3-93f1-90e64e4dba87_976x802.png 848w, https://substackcdn.com/image/fetch/$s_!grbM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb2ffd31-ca71-4ac3-93f1-90e64e4dba87_976x802.png 1272w, https://substackcdn.com/image/fetch/$s_!grbM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb2ffd31-ca71-4ac3-93f1-90e64e4dba87_976x802.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>Canonical Releases Its Own JDK</h2><p>And while we&#8217;re on the topic of JDK teams tied to Linux distributions&#8230;</p><p>July also brought something unexpected: Canonical announced its own <a href="https://canonical.com/blog/introducing-canonical-builds-of-openjdk">Canonical builds of OpenJDK</a> - binary OpenJDK builds optimized specifically for Ubuntu, including ultra-slim <strong><a href="https://canonical.com/blog/chiseled-ubuntu-containers-openjre">Chiseled OpenJRE</a></strong><a href="https://canonical.com/blog/chiseled-ubuntu-containers-openjre"> </a>containers aimed at cloud and CI/CD environments. This is another step in a growing trend where the JDK is treated as an artifact tightly coupled to the platform, tooling, and ecosystem around it.</p><p>Canonical emphasizes that these builds are significantly smaller - up to 50% smaller than popular distributions like Temurin - without sacrificing throughput or performance.</p><p>For JVM developers, this means that the choice of runtime environment is becoming increasingly dependent on deployment context: Ubuntu Pro on servers, IBM Semeru or Red Hat OpenJDK/Quarkus in enterprise setups, Microsoft Build of OpenJDK for Azure, and so on.</p><p>As a result, choosing a JDK is no longer simply &#8220;just OpenJDK.&#8221; It&#8217;s becoming more complex, with each provider adding its own twist. Canonical focuses on container size reduction and long-term support; IBM and Red Hat emphasize long-term stability and enterprise application compatibility; Microsoft offers builds tailored specifically for Azure.</p><p>What&#8217;s interesting is how different organizations now view Java - as a set of composable artifacts fitted to their own ecosystems, rather than as &#8220;one universal distribution everyone just downloads and uses.&#8221; And that&#8217;s the broader trend worth paying attention to.</p><h2>Hibernate ORM changes its license: The end of the LGPL Era</h2><p><a href="https://in.relation.to/2025/03/14/orm-asl/">Hibernate&#8217;s license change from LGPL to the Apache License 2.0 </a>also has an interesting broader context. For years, LGPL was &#8220;safe enough&#8221; for Hibernate. It allowed use in commercial projects, didn&#8217;t force companies to open their own code, and in practice rarely caused real problems for engineering teams. The issue is that open source reality doesn&#8217;t stop at engineers. In many organizations, the mere presence of LGPL in the dependency tree was enough to trigger a red flag&#8212;regardless of how liberal its interpretation actually was. For legal departments, intent mattered less than the license header.</p><p>This tension grew as the entire ecosystem evolved. Hibernate &#1076;&#1072;&#1074;&#1085;&#1086; stopped being a &#8220;standalone project&#8221; and became a foundation of the modern Java stack: Jakarta EE, Quarkus, and newer initiatives centered around the Commonhaus Foundation. These ecosystems share one common trait: a strong preference for the Apache License as the default standard. LGPL increasingly became an exception - something that had to be explained, justified, and pushed through yet another committee.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!omMa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a5e9be9-45ff-4d7e-b698-6ec4ec766c04_420x294.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!omMa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a5e9be9-45ff-4d7e-b698-6ec4ec766c04_420x294.png 424w, https://substackcdn.com/image/fetch/$s_!omMa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a5e9be9-45ff-4d7e-b698-6ec4ec766c04_420x294.png 848w, https://substackcdn.com/image/fetch/$s_!omMa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a5e9be9-45ff-4d7e-b698-6ec4ec766c04_420x294.png 1272w, https://substackcdn.com/image/fetch/$s_!omMa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a5e9be9-45ff-4d7e-b698-6ec4ec766c04_420x294.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!omMa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a5e9be9-45ff-4d7e-b698-6ec4ec766c04_420x294.png" width="420" height="294" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0a5e9be9-45ff-4d7e-b698-6ec4ec766c04_420x294.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:294,&quot;width&quot;:420,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Discover 12 Audit Humor and humor ideas | accounting humor, audit, work  humor and more&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="Discover 12 Audit Humor and humor ideas | accounting humor, audit, work  humor and more" title="Discover 12 Audit Humor and humor ideas | accounting humor, audit, work  humor and more" srcset="https://substackcdn.com/image/fetch/$s_!omMa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a5e9be9-45ff-4d7e-b698-6ec4ec766c04_420x294.png 424w, https://substackcdn.com/image/fetch/$s_!omMa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a5e9be9-45ff-4d7e-b698-6ec4ec766c04_420x294.png 848w, https://substackcdn.com/image/fetch/$s_!omMa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a5e9be9-45ff-4d7e-b698-6ec4ec766c04_420x294.png 1272w, https://substackcdn.com/image/fetch/$s_!omMa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a5e9be9-45ff-4d7e-b698-6ec4ec766c04_420x294.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>In that sense, relicensing was a rational move. The question wasn&#8217;t whether LGPL is &#8220;bad,&#8221; but whether it was still compatible with the direction Java as a platform has taken. Apache License provides simple answers to hard questions: you can use it, distribute it, build products on top of it - without nuances, exceptions, or interpretations - and nobody asks uncomfortable follow-up questions. For projects targeting enterprise adoption - and Hibernate very much is one - that simplicity has real value.</p><p>So why go all the way? Because the alternative was slow marginalization. Staying on LGPL would increasingly turn Hibernate into &#8220;that problematic component&#8221; that blocks adoption, complicates audits, and requires extra explanations.</p><p>The license change came with real costs and real losses. It required reaching out to hundreds of contributors across 25 years of project history. It was a test of how &#8220;alive&#8221; an open-source project really is - one that many people treat as a given part of the landscape. Where consent couldn&#8217;t be obtained, code had to be removed or split out. Envers remained under LGPL; other modules simply ceased to exist. Trade-offs were inevitable.</p><h2>Deno vs Oracle: Who Owns &#8220;JavaScript&#8221;?</h2><p>JavaScript is the air of the internet today. A language you don&#8217;t really choose&#8212;it&#8217;s just there. In the browser, on the server, in tools, frameworks, builds, and deploys. And precisely because of that, it can be surprising that, formally, the name &#8220;JavaScript&#8221; is still a trademark owned by one specific company: Oracle. For years, this was one of those legal oddities everyone knew about, but no one had the time or energy to do anything about. Until the end of 2024.</p><p>In November, Ryan Dahl the creator of Node.js and Deno - <a href="https://deno.com/blog/deno-v-oracle">filed a formal petition with the U.S. Patent and Trademark Office to cancel the &#8220;JavaScript&#8221; trademark</a>. The starting point is simple: Oracle inherited the mark from Sun Microsystems in 2009, but since then it has not participated in the development of the language, does not take part in TC39, does not sell products based on JavaScript, and in practice has no real connection to it beyond a historical entry in a registry.</p><p><a href="https://deno.com/blog/deno-v-oracle2">The dispute drags on through 2025, with Oracle consistently refusing to voluntarily relinquish the trademark, rejecting the allegations, and attempting to neutralize the heaviest charge</a> - fraud in the renewal of the mark in 2019, when a screenshot of the Node.js website was presented as proof of use. In legal terms, that turns out to be insufficient to prove intentional deception. The rest of the case, however, remains alive, and in September the parties enter the discovery phase - the most expensive and most brutal part of the proceedings.</p><p>In the background, something far more interesting is happening than the lawyers&#8217; battle itself. A community that for three decades has treated JavaScript as a common good suddenly realizes that its name does not formally belong to it. <a href="https://javascript.tm/letter">An open letter</a> published on javascript.tm gathers tens of thousands of signatures, including that of Brendan Eich - the creator of the language - as well as people who actually shape its evolution today. <a href="https://deno.com/blog/javascript-tm-gofundme">Deno launches a fundraiser</a> to cover legal costs, because discovery is not paid for with ideals, but with very real money.</p><p>I&#8217;m writing about this because, in truth, this is not really a dispute about JavaScript itself, but about whether the trademark system should allow the &#8220;hoarding&#8221; of names that have become technological standards, or whether it should be able to release them once they stop being anyone&#8217;s product. Regardless of how the case ends - and we&#8217;ll likely wait until 2027 for a verdict - one thing has already happened: someone finally asked out loud whether JavaScript is still someone&#8217;s brand, or simply a language that belongs to everyone.</p><p>And sometimes, just asking that question is enough to shake the foundations.</p><p>Wish you luck, Deno. You will need 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_!4Puv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a59e6e7-fa88-4de5-9e8c-fff2deceafb1_1090x600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4Puv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a59e6e7-fa88-4de5-9e8c-fff2deceafb1_1090x600.png 424w, https://substackcdn.com/image/fetch/$s_!4Puv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a59e6e7-fa88-4de5-9e8c-fff2deceafb1_1090x600.png 848w, https://substackcdn.com/image/fetch/$s_!4Puv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a59e6e7-fa88-4de5-9e8c-fff2deceafb1_1090x600.png 1272w, https://substackcdn.com/image/fetch/$s_!4Puv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a59e6e7-fa88-4de5-9e8c-fff2deceafb1_1090x600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4Puv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a59e6e7-fa88-4de5-9e8c-fff2deceafb1_1090x600.png" width="1090" height="600" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5a59e6e7-fa88-4de5-9e8c-fff2deceafb1_1090x600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:600,&quot;width&quot;:1090,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:233727,&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/183660944?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a59e6e7-fa88-4de5-9e8c-fff2deceafb1_1090x600.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_!4Puv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a59e6e7-fa88-4de5-9e8c-fff2deceafb1_1090x600.png 424w, https://substackcdn.com/image/fetch/$s_!4Puv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a59e6e7-fa88-4de5-9e8c-fff2deceafb1_1090x600.png 848w, https://substackcdn.com/image/fetch/$s_!4Puv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a59e6e7-fa88-4de5-9e8c-fff2deceafb1_1090x600.png 1272w, https://substackcdn.com/image/fetch/$s_!4Puv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a59e6e7-fa88-4de5-9e8c-fff2deceafb1_1090x600.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>JetBrains Reveals Plans for a New Programming Language</h2><p>In July 2025, <a href="https://www.linkedin.com/in/kirill-skrygan-7b86073a?originalSubdomain=nl">Kirill Skrygan</a>, CEO of JetBrains, said in an <a href="https://www.infoworld.com/article/4029053/jetbrains-working-on-higher-abstraction-programming-language.html">interview with </a><em><a href="https://www.infoworld.com/article/4029053/jetbrains-working-on-higher-abstraction-programming-language.html">InfoWorld</a></em> that JetBrains is indeed working on a new programming language. And no - it&#8217;s not Kotlin 3.0, nor another iteration of a familiar paradigm. It&#8217;s an attempt to jump an entire level of abstraction.</p><p>Skrygan described it in a way that almost sounds old-fashioned: through the history of language evolution. First assembly, then C and C++, then Java and C#. Each step moved the programmer further away from the machine and closer to a mental model. The problem is that we&#8217;ve been stuck at this level for years. Today&#8217;s developers still translate their intent into classes, interfaces, annotations, and frameworks&#8212;even though the real design of a system lives elsewhere: in people&#8217;s heads, in architecture discussions, in design docs, diagrams, and domain descriptions.</p><p>That gap is exactly what JetBrains wants to address. The new language is not meant to be a &#8220;better Kotlin,&#8221; but an attempt to formalize what has so far been informal: the system&#8217;s ontology, the relationships between entities, architectural assumptions, and decisions that today get lost in comments, Confluence pages, or Slack threads - and later have to be manually reconstructed in code. In other words, everything agents need to operate: context.</p><p>The most controversial part of this vision appears when Skrygan talks about natural language. The foundation of the new language is supposed to be&#8230; English. But not in the sense of &#8220;write a sentence and magic happens.&#8221; Rather, as a controlled, semantic representation of intent - something between a design document and a formal system description language. AI agents, deeply integrated with JetBrains tooling, would take this description and generate implementations for different platforms: backend, frontend, mobile - everything consistent, everything derived from a single source of truth.</p><p>This distinction matters, because Skrygan explicitly distances himself from the popular slogan that &#8220;English will be the new programming language.&#8221; His view is surprisingly sober: you can&#8217;t build industrial systems in plain English. And that tension is key to understanding the whole initiative. JetBrains isn&#8217;t trying to replace programming with prompts. It&#8217;s trying to build a formal language of intent - one that looks like English but behaves like a programming language. A kind of spec-driven engineering baked directly into the core of 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_!z38g!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb38124c2-1ecf-4450-93ee-fc7b190fd313_1600x987.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!z38g!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb38124c2-1ecf-4450-93ee-fc7b190fd313_1600x987.png 424w, https://substackcdn.com/image/fetch/$s_!z38g!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb38124c2-1ecf-4450-93ee-fc7b190fd313_1600x987.png 848w, https://substackcdn.com/image/fetch/$s_!z38g!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb38124c2-1ecf-4450-93ee-fc7b190fd313_1600x987.png 1272w, https://substackcdn.com/image/fetch/$s_!z38g!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb38124c2-1ecf-4450-93ee-fc7b190fd313_1600x987.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!z38g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb38124c2-1ecf-4450-93ee-fc7b190fd313_1600x987.png" width="1456" height="898" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b38124c2-1ecf-4450-93ee-fc7b190fd313_1600x987.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;Natural Language Instructions&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="Natural Language Instructions" title="Natural Language Instructions" srcset="https://substackcdn.com/image/fetch/$s_!z38g!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb38124c2-1ecf-4450-93ee-fc7b190fd313_1600x987.png 424w, https://substackcdn.com/image/fetch/$s_!z38g!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb38124c2-1ecf-4450-93ee-fc7b190fd313_1600x987.png 848w, https://substackcdn.com/image/fetch/$s_!z38g!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb38124c2-1ecf-4450-93ee-fc7b190fd313_1600x987.png 1272w, https://substackcdn.com/image/fetch/$s_!z38g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb38124c2-1ecf-4450-93ee-fc7b190fd313_1600x987.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>The organizational context also matters. JetBrains is a private company. It doesn&#8217;t need to deliver quarterly narratives for the stock market, and it doesn&#8217;t have to chase hype. Skrygan says it openly: people are tired of grand AI declarations. And precisely because of that, JetBrains can afford a long-term experiment that may not produce a sellable product for years. It&#8217;s the same logic that once allowed them to invest in Kotlin long before anyone knew it would become mainstream.</p><p>Importantly, this new language isn&#8217;t emerging in a vacuum. JetBrains is already building infrastructure for a world where the IDE is no longer just a code editor. Junie as a coding agent (and yes, we&#8217;ll talk more about Junie later), <a href="https://blog.jetbrains.com/ai/2025/07/whats-new-with-mellum-expanded-language-support-and-new-ways-to-use-it-locally/">local Mellum models</a>, deep integrations with LLM providers - all of these are pieces of a puzzle in which code stops being the only artifact and becomes just one of many possible &#8220;renders of intent.&#8221;</p><p>We don&#8217;t know the timeline. It&#8217;s possible that for years we&#8217;ll see nothing but prototypes, internal DSLs, and experimental tools - or perhaps nothing at all. But the very decision to think about a new programming language in 2025 (let&#8217;s be honest: who even cares about programming languages in 2025?) already says something. JetBrains clearly believes that the next revolution won&#8217;t happen in yet another version of Java, Kotlin, or TypeScript, but in a place where we still lack sufficient precision - where code ends and thinking about the system begins.</p><p>And since we&#8217;re already talking about JetBrains&#8230;</p><h2>The End of the Two - IntelliJ IDEA Era</h2><p>December 2025 brought a decision that would have seemed unthinkable just a few years ago: the end of the split between <a href="http://jetbrains.com/idea/whatsnew">IntelliJ IDEA Community Edition and Ultimate. Starting with version 2025.3</a>, there is a single IntelliJ IDEA. Some features are available for free, others require a subscription or a 30-day trial - but the product no longer pretends these are two separate worlds.</p><p>For a long time, the Community vs. Ultimate split made sense. Community was a clean IDE for Java and Kotlin; Ultimate was a platform for the enterprise world&#8212;Spring, databases, and everything considered &#8220;serious.&#8221; The problem is that the line between &#8220;basic&#8221; and &#8220;enterprise&#8221; has become increasingly blurred. Today, even a student project very quickly touches Spring Boot, SQL, database migrations, or simple web integrations. Keeping these features behind a paywall increasingly stopped being monetization and started becoming frustration - and an onboarding barrier that many simply wouldn&#8217;t cross.</p><p>At the same time, two products meant two development pipelines, two test suites, two backlogs, and constant decisions about whether a given feature &#8220;belongs&#8221; in Community or already in Ultimate. In practice, this led to duplicated effort and slowed overall development. Consolidating into a single IDE is, first and foremost, an engineering decision: one codebase, one distribution model, one evolution path. Very Kotlin Multiplatform in spirit.</p><p>A (very user-friendly) side effect is the shift in the boundary of free features. Basic support for Spring and Jakarta EE, the Spring Boot wizard, SQL tooling, database connection configuration, and schema browsing suddenly stop being &#8220;enterprise-only&#8221; features - not because JetBrains became philanthropic, but because without them IntelliJ simply stops being a realistic starting tool for new developers.</p><p>But the real reason for this change, in my view, is much more down to earth: pressure from Cursor, Windsurf, Antigravity, and the entire wave of VS Code forks with built-in AI features. When the competition gives you not only a free IDE, but also an intelligent assistant that writes code, refactors, and debugs, the discussion of &#8220;should I pay for Spring support?&#8221; starts to sound a bit absurd. JetBrains clearly realized that fighting for user base now matters more than optimizing revenue from basic licenses.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!X3z_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6d17f37-ec5e-4bb0-853e-a47a00784e21_736x736.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!X3z_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6d17f37-ec5e-4bb0-853e-a47a00784e21_736x736.jpeg 424w, https://substackcdn.com/image/fetch/$s_!X3z_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6d17f37-ec5e-4bb0-853e-a47a00784e21_736x736.jpeg 848w, https://substackcdn.com/image/fetch/$s_!X3z_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6d17f37-ec5e-4bb0-853e-a47a00784e21_736x736.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!X3z_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6d17f37-ec5e-4bb0-853e-a47a00784e21_736x736.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!X3z_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6d17f37-ec5e-4bb0-853e-a47a00784e21_736x736.jpeg" width="736" height="736" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d6d17f37-ec5e-4bb0-853e-a47a00784e21_736x736.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:736,&quot;width&quot;:736,&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_!X3z_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6d17f37-ec5e-4bb0-853e-a47a00784e21_736x736.jpeg 424w, https://substackcdn.com/image/fetch/$s_!X3z_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6d17f37-ec5e-4bb0-853e-a47a00784e21_736x736.jpeg 848w, https://substackcdn.com/image/fetch/$s_!X3z_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6d17f37-ec5e-4bb0-853e-a47a00784e21_736x736.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!X3z_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6d17f37-ec5e-4bb0-853e-a47a00784e21_736x736.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">Even if free access to these tools is.. a bit risky</figcaption></figure></div><p>Monetization doesn&#8217;t disappear - but it shifts dramatically. Instead of selling access to frameworks (especially for quasi-commercial users - companies will buy full IntelliJ anyway), JetBrains will sell AI-assisted development, advanced code analysis, team collaboration, and enterprise tooling. Upselling moves higher up the stack - where real value lies in productivity and scale, not in the mere fact that the IDE &#8220;understands Spring.&#8221;</p><p>This is the end of a certain era (a phrase heavily overused in 2025), but also an open admission of a new reality: if JetBrains wants a chance to compete with free, AI-powered editors, it first has to keep users inside its ecosystem. Limiting basic functionality was only accelerating the exodus to tools like Cursor. From 2025 onward, there is one IntelliJ. And this isn&#8217;t a gesture of goodwill, but a necessity in today&#8217;s world. That is what industry expects right no</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ib8Q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4e51411-35ab-4071-b6c6-660c01b712f9_500x534.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ib8Q!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4e51411-35ab-4071-b6c6-660c01b712f9_500x534.webp 424w, https://substackcdn.com/image/fetch/$s_!Ib8Q!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4e51411-35ab-4071-b6c6-660c01b712f9_500x534.webp 848w, https://substackcdn.com/image/fetch/$s_!Ib8Q!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4e51411-35ab-4071-b6c6-660c01b712f9_500x534.webp 1272w, https://substackcdn.com/image/fetch/$s_!Ib8Q!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4e51411-35ab-4071-b6c6-660c01b712f9_500x534.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ib8Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4e51411-35ab-4071-b6c6-660c01b712f9_500x534.webp" width="500" height="534" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f4e51411-35ab-4071-b6c6-660c01b712f9_500x534.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:534,&quot;width&quot;:500,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;meme_chatgpt&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="meme_chatgpt" title="meme_chatgpt" srcset="https://substackcdn.com/image/fetch/$s_!Ib8Q!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4e51411-35ab-4071-b6c6-660c01b712f9_500x534.webp 424w, https://substackcdn.com/image/fetch/$s_!Ib8Q!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4e51411-35ab-4071-b6c6-660c01b712f9_500x534.webp 848w, https://substackcdn.com/image/fetch/$s_!Ib8Q!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4e51411-35ab-4071-b6c6-660c01b712f9_500x534.webp 1272w, https://substackcdn.com/image/fetch/$s_!Ib8Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4e51411-35ab-4071-b6c6-660c01b712f9_500x534.webp 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="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GENL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ae3d2c2-5799-448a-9213-2b017e9f68ec_501x498.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GENL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ae3d2c2-5799-448a-9213-2b017e9f68ec_501x498.jpeg 424w, https://substackcdn.com/image/fetch/$s_!GENL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ae3d2c2-5799-448a-9213-2b017e9f68ec_501x498.jpeg 848w, https://substackcdn.com/image/fetch/$s_!GENL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ae3d2c2-5799-448a-9213-2b017e9f68ec_501x498.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!GENL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ae3d2c2-5799-448a-9213-2b017e9f68ec_501x498.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GENL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ae3d2c2-5799-448a-9213-2b017e9f68ec_501x498.jpeg" width="501" height="498" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5ae3d2c2-5799-448a-9213-2b017e9f68ec_501x498.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:498,&quot;width&quot;:501,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Obraz Pina z opowie&#347;ci&#261;&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="Obraz Pina z opowie&#347;ci&#261;" title="Obraz Pina z opowie&#347;ci&#261;" srcset="https://substackcdn.com/image/fetch/$s_!GENL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ae3d2c2-5799-448a-9213-2b017e9f68ec_501x498.jpeg 424w, https://substackcdn.com/image/fetch/$s_!GENL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ae3d2c2-5799-448a-9213-2b017e9f68ec_501x498.jpeg 848w, https://substackcdn.com/image/fetch/$s_!GENL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ae3d2c2-5799-448a-9213-2b017e9f68ec_501x498.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!GENL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ae3d2c2-5799-448a-9213-2b017e9f68ec_501x498.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><h2>WASM for the JVM Is Gaining Momentum</h2><p>WebAssembly is one of those standards that has been circulating in industry narratives for years like <em>Death in Venice</em> - everyone knows it&#8217;s about to take off, it&#8217;s just that the &#8220;any moment now&#8221; keeps getting postponed.</p><div id="youtube2-h3hwff_CeeM" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;h3hwff_CeeM&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/h3hwff_CeeM?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>(Sorry for the slightly hermetic Polish literary joke - couldn&#8217;t resist.)</p><p>And yet, looking at what&#8217;s happening today in the JVM ecosystem, it&#8217;s hard to shake the feeling that WASM is finally starting to find its place - and in several interesting niches at once.</p><p>The most obvious signal is <strong>GraalVM</strong>, which is increasingly treating WebAssembly not as an exotic target, but as one of <a href="https://www.graalvm.org/latest/reference-manual/wasm/">the first-class ways of executing code</a>. WASM in Graal&#8217;s incarnation is not trying to replace the JVM or AOT in the style of Native Image &#8212; instead, it offers yet another <em>secure sandbox</em> that Java can interact with on its own terms.</p><p>In parallel, a completely different approach is emerging, represented by <strong><a href="http://(https://leaningtech.com/cheerpj/">CheerpJ</a></strong>. This line of thinking doesn&#8217;t ask <em>&#8220;how do we port Java cleanly to WASM?&#8221;</em> but rather <em>&#8220;how do we make existing JVM applications simply run in the browser?&#8221;</em> &#8212; without rewriting, without porting, without months-long migrations. <a href="https://leaningtech.com/cheerpj/">CheerpJ</a> demonstrates that WebAssembly can act as a <strong>compatibility layer</strong> - something akin to a modern JRE for the web world. It&#8217;s a highly pragmatic vision, especially for old, heavy desktop applications that suddenly get a second life in the browser.</p><p>On top of that comes <strong>Kotlin</strong>, which for a long time has treated the web as a first-class platform rather than merely a &#8220;frontend to a backend.&#8221; In JetBrains&#8217; latest plans, WASM is increasingly visible as a real alternative to JavaScript in places where predictability, performance, and <a href="https://kotlinlang.org/docs/wasm-overview.html">consistency of execution models matter</a>. This is not a mass movement yet, but the direction is clear: <strong>Kotlin/Wasm</strong> is not meant to compete with JavaScript in writing widgets, but in building serious web applications that don&#8217;t want to inherit the full baggage of the browser ecosystem.</p><p>The most interesting pieces, however, are projects that show WASM <em>from the inside</em>. One of my favorite spikes of the year is the story of porting the<a href="https://www.javaadvent.com/2025/12/chicory-webassembly-on-the-jvm.html"> </a><strong><a href="https://www.javaadvent.com/2025/12/chicory-webassembly-on-the-jvm.html">Chicory WebAssembly runtime</a></strong> to Android. It&#8217;s a great example of the fact that WebAssembly is not a magical format that solves all problems. Quite the opposite &#8212; it forces very deliberate thinking about memory, ABI, execution models, and host integration. And that&#8217;s precisely why it fits the JVM so well: a platform that has lived for decades at the intersection of high-level abstraction and hardcore runtime engineering.</p><p>Taken together, this paints an interesting picture. WASM in the JVM world is not a <em>&#8220;new JVM&#8221;</em> trying to replace bytecode or HotSpot. Instead, it&#8217;s another <strong>universal execution format</strong> that can be plugged in wherever isolation, portability, or execution in previously inaccessible environments is required. Browser, edge, sandbox, mobile - in all these places, WASM can serve as a natural bridge.</p><p>And perhaps that&#8217;s exactly why this time WebAssembly really does have a chance to <em>take off</em>. Not as a hype-driven replacement for everything, but as a missing puzzle piece. JVM, being the JVM, doesn&#8217;t rush into WASM with startup-style enthusiasm - it approaches it methodically, calmly, and with full awareness of its limitations. And Java&#8217;s history suggests that this is usually the best predictor of long-term success.</p><p>However we need to remember world looks a bit different nowadays. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Bt29!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe1c87fe-45a8-43cb-a938-c28347b2c5c4_553x567.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Bt29!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe1c87fe-45a8-43cb-a938-c28347b2c5c4_553x567.png 424w, https://substackcdn.com/image/fetch/$s_!Bt29!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe1c87fe-45a8-43cb-a938-c28347b2c5c4_553x567.png 848w, https://substackcdn.com/image/fetch/$s_!Bt29!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe1c87fe-45a8-43cb-a938-c28347b2c5c4_553x567.png 1272w, https://substackcdn.com/image/fetch/$s_!Bt29!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe1c87fe-45a8-43cb-a938-c28347b2c5c4_553x567.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Bt29!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe1c87fe-45a8-43cb-a938-c28347b2c5c4_553x567.png" width="553" height="567" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/be1c87fe-45a8-43cb-a938-c28347b2c5c4_553x567.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:567,&quot;width&quot;:553,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:263792,&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/183660944?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe1c87fe-45a8-43cb-a938-c28347b2c5c4_553x567.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_!Bt29!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe1c87fe-45a8-43cb-a938-c28347b2c5c4_553x567.png 424w, https://substackcdn.com/image/fetch/$s_!Bt29!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe1c87fe-45a8-43cb-a938-c28347b2c5c4_553x567.png 848w, https://substackcdn.com/image/fetch/$s_!Bt29!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe1c87fe-45a8-43cb-a938-c28347b2c5c4_553x567.png 1272w, https://substackcdn.com/image/fetch/$s_!Bt29!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe1c87fe-45a8-43cb-a938-c28347b2c5c4_553x567.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>TornadoVM Is having the time of its life</h2><p>For years, TornadoVM was one of those projects everyone &#8220;had on their radar,&#8221; but few treated as anything more than an <em>academic</em> curiosity - fitting for a project coming out of the University of Manchester. Java on GPUs, FPGAs, and accelerators? It sounded like a future that was always one conference too far away. The year 2025 very clearly changed that picture. TornadoVM stopped being a promise and started to look like a technology that has genuinely found its place in the JVM ecosystem, addressing concrete needs of the platform.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-ULr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c9097f9-8547-4b73-ab72-4e51d36ce51b_882x985.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-ULr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c9097f9-8547-4b73-ab72-4e51d36ce51b_882x985.png 424w, https://substackcdn.com/image/fetch/$s_!-ULr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c9097f9-8547-4b73-ab72-4e51d36ce51b_882x985.png 848w, https://substackcdn.com/image/fetch/$s_!-ULr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c9097f9-8547-4b73-ab72-4e51d36ce51b_882x985.png 1272w, https://substackcdn.com/image/fetch/$s_!-ULr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c9097f9-8547-4b73-ab72-4e51d36ce51b_882x985.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-ULr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c9097f9-8547-4b73-ab72-4e51d36ce51b_882x985.png" width="882" height="985" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3c9097f9-8547-4b73-ab72-4e51d36ce51b_882x985.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:985,&quot;width&quot;:882,&quot;resizeWidth&quot;:0,&quot;bytes&quot;:958120,&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/183660944?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c9097f9-8547-4b73-ab72-4e51d36ce51b_882x985.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_!-ULr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c9097f9-8547-4b73-ab72-4e51d36ce51b_882x985.png 424w, https://substackcdn.com/image/fetch/$s_!-ULr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c9097f9-8547-4b73-ab72-4e51d36ce51b_882x985.png 848w, https://substackcdn.com/image/fetch/$s_!-ULr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c9097f9-8547-4b73-ab72-4e51d36ce51b_882x985.png 1272w, https://substackcdn.com/image/fetch/$s_!-ULr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c9097f9-8547-4b73-ab72-4e51d36ce51b_882x985.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">And all that Engineering &#8220;just&#8221; to serve AI models from JVM</figcaption></figure></div><p>One of the most symbolic signals of this shift was a personnel move. <a href="https://jjfumero.github.io/">Juan Fumero</a>, one of the leaders of the TornadoVM project and the public face of the BeeHive Lab at the University of Manchester, joined the Java Platform Group at Oracle. This is the moment when an experimental research project meets, directly, the team responsible for the future of OpenJDK. It&#8217;s hard to imagine a clearer sign that JVM acceleration is no longer a side topic.</p><p>The strongest signal of TornadoVM&#8217;s &#8220;entry into the real world,&#8221; however, turned out to be <strong><a href="https://github.com/beehive-lab/GPULlama3.java">GPULlama3.java</a></strong>. Running LLaMA on GPUs without leaving the Java ecosystem, without writing CUDA, and without manual memory management is something that would have sounded like clickbait just two years ago. The 0.2.0 release of the project proved that TornadoVM is not only capable of handling simple kernels, but can also support real AI workloads.</p><p>What&#8217;s crucial here is that TornadoVM never tried to compete with GraalVM, CUDA, or OpenCL on the level of &#8220;who&#8217;s faster.&#8221; Its ambition was different: to let JVM developers think in terms of tasks and data, rather than threads, blocks, and registers. In this context, <a href="https://www.tornadovm.org/post/getting-started-with-tornadovm-2-0-for-accelerating-java-applications">TornadoVM 2.0</a> (which I will cover more deeply in January) looks like the transition point from a <em>research prototype</em> to a <em>platform</em>. A more stable programming model, better integration with the JVM, real support for GPUs, CPUs, and accelerators - and, above all, less magic and more predictable contracts. This is exactly the moment when a project stops living only in academic papers and starts living in production repositories.</p><p>The most interesting question is no longer &#8220;does TornadoVM make sense,&#8221; but rather: when will we see its DNA in OpenJDK? Perhaps not as a ready-made framework, but as APIs, abstractions, and a direction for JVM evolution prepared for a world where the CPU is just one of many places where code runs.</p><p>Seen more broadly, TornadoVM fits perfectly into a moment in which Java is once again redefining its boundaries. Not by changing syntax, but by changing where and how code is executed. And perhaps for the first time in a long while, hardware acceleration in Java no longer looks like an experiment.</p><p>TornadoVM has truly come into its own.</p><p>BTW: We had a guest appearance post in the December about TornadoVM Architecture - I consider it the essential lecture for 2026 &#128513;</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;a4b948dc-415d-47b3-8b46-5f77b1ee95e4&quot;,&quot;caption&quot;:&quot;Year ago I announced that JVM Weekly had joined the Friends of OpenJDK (Foojay.io) family. Foojay.io is a dynamic, community-driven platform for OpenJDK users, primarily Java and Kotlin enthusiasts. As a hub for the &#8220;Friends of OpenJDK,&#8221; Foojay.io gathers a rich collection of articles written by industry experts and active community members, offering va&#8230;&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;The TornadoVM Programming Model Explained with Juan Fumero - JVM Weekly vol. 155&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:73551664,&quot;name&quot;:&quot;Artur Skowronski&quot;,&quot;bio&quot;:&quot;Head of Java / Kotlin Engineering at VirtusLab&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/02ec8807-299f-42d2-bcde-168795228629_2362x2362.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2025-12-04T14:02:59.432Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!P5ZI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F257bc369-4b0d-4c2b-85af-99953b6473d4_1456x1048.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://www.jvm-weekly.com/p/the-tornadovm-programming-model-explained&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:180187675,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:1,&quot;publication_id&quot;:862586,&quot;publication_name&quot;:&quot;JVM Weekly&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!zYMM!,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&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><h2>Project Stargate Becomes Oracle&#8217;s New Darling</h2><p>At first glance, Project Stargate looks like something completely outside our bubble. OpenAI, SoftBank, gigantic data centers, hundreds of billions of dollars, and a narrative straight out of AI geopolitics. It&#8217;s hard to imagine anything further removed from the JVM, GC, and JDK releases. And yet - if you look more closely - Oracle shows up in this story in a way that makes it entirely reasonable to talk about it right here.</p><p>In January 2025, OpenAI and SoftBank announced Stargate: a long-term project to build hyperscale computing infrastructure for AI, ultimately valued at as much as several hundred billion dollars. The goal is not a single data center, but a global network of facilities designed from the ground up for training and inference of large models. It&#8217;s an attempt to create an &#8220;intelligence factory&#8221; - infrastructure positioned as a strategic asset&#8230; all based on GPUs from Nvidia.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DA05!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad984f90-9bfa-486b-b699-af00d77aef05_640x640.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DA05!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad984f90-9bfa-486b-b699-af00d77aef05_640x640.jpeg 424w, https://substackcdn.com/image/fetch/$s_!DA05!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad984f90-9bfa-486b-b699-af00d77aef05_640x640.jpeg 848w, https://substackcdn.com/image/fetch/$s_!DA05!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad984f90-9bfa-486b-b699-af00d77aef05_640x640.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!DA05!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad984f90-9bfa-486b-b699-af00d77aef05_640x640.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DA05!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad984f90-9bfa-486b-b699-af00d77aef05_640x640.jpeg" width="640" height="640" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ad984f90-9bfa-486b-b699-af00d77aef05_640x640.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:640,&quot;width&quot;:640,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;I felt this meme was more true with nvidia than intel, so I changed it a  bit. : r/pcmasterrace&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="I felt this meme was more true with nvidia than intel, so I changed it a  bit. : r/pcmasterrace" title="I felt this meme was more true with nvidia than intel, so I changed it a  bit. : r/pcmasterrace" srcset="https://substackcdn.com/image/fetch/$s_!DA05!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad984f90-9bfa-486b-b699-af00d77aef05_640x640.jpeg 424w, https://substackcdn.com/image/fetch/$s_!DA05!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad984f90-9bfa-486b-b699-af00d77aef05_640x640.jpeg 848w, https://substackcdn.com/image/fetch/$s_!DA05!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad984f90-9bfa-486b-b699-af00d77aef05_640x640.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!DA05!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad984f90-9bfa-486b-b699-af00d77aef05_640x640.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>And this is where Oracle enters the picture, as a real operator and cloud provider. Oracle Cloud Infrastructure is meant to be one of the pillars of Stargate - both technologically and operationally. This is a very interesting turn, because for years Oracle was perceived more as a databases-and-enterprise-legacy company than as a player shaping the AI compute race. Stargate shows that this perception is becoming increasingly outdated.</p><p>From a JVM perspective, this is still very much a &#8220;side topic.&#8221; Stargate is not about Java, bytecode, or HotSpot, but about GPUs, networks, power, cooling, and decades-long contracts. At the same time, it involves the same company that owns the JavaScript trademark, develops OpenJDK, pushes Valhalla, Leyden, and Babylon, and makes enormous amounts of money on enterprise Java. Oracle is playing on several boards at once - and Stargate illustrates the scale of that game.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ssez!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3acf0d9f-55c5-455d-ae16-a4b7ac79159e_634x460.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ssez!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3acf0d9f-55c5-455d-ae16-a4b7ac79159e_634x460.png 424w, https://substackcdn.com/image/fetch/$s_!Ssez!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3acf0d9f-55c5-455d-ae16-a4b7ac79159e_634x460.png 848w, https://substackcdn.com/image/fetch/$s_!Ssez!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3acf0d9f-55c5-455d-ae16-a4b7ac79159e_634x460.png 1272w, https://substackcdn.com/image/fetch/$s_!Ssez!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3acf0d9f-55c5-455d-ae16-a4b7ac79159e_634x460.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ssez!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3acf0d9f-55c5-455d-ae16-a4b7ac79159e_634x460.png" width="634" height="460" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3acf0d9f-55c5-455d-ae16-a4b7ac79159e_634x460.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:460,&quot;width&quot;:634,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:435914,&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/183660944?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3acf0d9f-55c5-455d-ae16-a4b7ac79159e_634x460.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_!Ssez!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3acf0d9f-55c5-455d-ae16-a4b7ac79159e_634x460.png 424w, https://substackcdn.com/image/fetch/$s_!Ssez!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3acf0d9f-55c5-455d-ae16-a4b7ac79159e_634x460.png 848w, https://substackcdn.com/image/fetch/$s_!Ssez!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3acf0d9f-55c5-455d-ae16-a4b7ac79159e_634x460.png 1272w, https://substackcdn.com/image/fetch/$s_!Ssez!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3acf0d9f-55c5-455d-ae16-a4b7ac79159e_634x460.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">They also want to buy <a href="https://www.exchangewire.com/blog/2025/12/24/digest-oracle-co-founder-backs-paramounts-hostile-bid-for-warner-bros-discovery-instacart-terminates-ai-price-tests/">Warner Bros through Paramount</a>.</figcaption></figure></div><p>Project Stargate is a story about just how much the landscape around the JVM is changing. About how companies that spent decades building stable, boring IT foundations are now also players in the most capital-intensive and futuristic technology race of our time.</p><p>And even if the JVM stands a bit off to the side here, Oracle - somewhat atypically for itself - is standing very close to the center of the stage. It will be interesting to see how much of this we&#8217;ll start to notice over the coming year.</p><h1>3. Major Releases</h1><h2>Spring Framework 7 and Spring Boot 4: A New Generation</h2><p>November 2025 closed a very long chapter for Spring. <a href="https://spring.io/blog/2025/11/13/spring-framework-7-0-general-availability">Spring Framework 7</a> and <a href="https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-4.0-Release-Notes">Spring Boot 4 </a>are the first releases that assume the market has already moved on. You can see this in every decision: Java 17 as the minimum baseline, optimization for JDK 25, and Jakarta EE 11 as the new normal.</p><p>There is also a very clear shift toward standardization instead of custom, homegrown solutions. The move to JSpecify as the default source of null-safety signals that Spring is no longer building its own micro-standards and is instead playing in the same league as OpenJDK, JetBrains, and the rest of the tooling ecosystem. This matters enormously for adoption in polyglot teams, especially where Kotlin and Java coexist in a single codebase.</p><p>Spring Boot 4.0, in turn, marks a moment of deliberate &#8220;slimming down&#8221; of the ecosystem. The removal of Undertow, RestTemplate (on the horizon), XML, JUnit 4, and Jackson 2.x clearly shows that anything blocking evolution will not be maintained indefinitely. At the same time, the modularization of <code>spring-boot-autoconfigure</code> demonstrates that Spring is taking startup time, security surface, and debuggability very seriously - precisely the areas that now determine platform choices in large organizations.</p><p>Against the broader market backdrop, Spring 7 / Boot 4 positions itself with remarkable clarity. This is not a framework for the &#8220;freshest experiments&#8221; - that role is increasingly taken over by Quarkus or Micronaut. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cVZM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf3e9d12-94c1-4e9e-a477-ef6265f9cb13_1067x856.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cVZM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf3e9d12-94c1-4e9e-a477-ef6265f9cb13_1067x856.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cVZM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf3e9d12-94c1-4e9e-a477-ef6265f9cb13_1067x856.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cVZM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf3e9d12-94c1-4e9e-a477-ef6265f9cb13_1067x856.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cVZM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf3e9d12-94c1-4e9e-a477-ef6265f9cb13_1067x856.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cVZM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf3e9d12-94c1-4e9e-a477-ef6265f9cb13_1067x856.jpeg" width="1067" height="856" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/df3e9d12-94c1-4e9e-a477-ef6265f9cb13_1067x856.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:856,&quot;width&quot;:1067,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Everything you might have missed in Java in 2022 - JVM Weekly #119 - Vived&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="Everything you might have missed in Java in 2022 - JVM Weekly #119 - Vived" title="Everything you might have missed in Java in 2022 - JVM Weekly #119 - Vived" srcset="https://substackcdn.com/image/fetch/$s_!cVZM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf3e9d12-94c1-4e9e-a477-ef6265f9cb13_1067x856.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cVZM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf3e9d12-94c1-4e9e-a477-ef6265f9cb13_1067x856.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cVZM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf3e9d12-94c1-4e9e-a477-ef6265f9cb13_1067x856.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cVZM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf3e9d12-94c1-4e9e-a477-ef6265f9cb13_1067x856.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>Spring remains the default enterprise JVM platform, but in a far more disciplined, modern, and coherent form than a few years ago, consolidating what has become the standard: Jakarta, modern JDKs, cloud-native operations, and deep tooling integration.</p><h2>Spring Modulith 2.0 as the consequence of a single, coherent vision</h2><p>Spring Modulith 2.0 is particularly interesting not only because of what it introduces, but because of who stands behind it. This is still the same line of thinking that Oliver Drotbohm has been developing for years - the author of Spring Data, the initiator of jMolecules, and one of the most consistent voices in the Spring world when it comes to connecting domain architecture with framework practice. Modulith is therefore not a new idea coming &#8220;from the side,&#8221; but the culmination of concepts that have been maturing in the ecosystem for over a decade.</p><p>For years, Drotbohm has argued that the biggest problem of enterprise systems is not a lack of frameworks, but a lack of enforceable boundaries. Domain-Driven Design offered excellent concepts, but weak tools for enforcing them. Spring provided immense flexibility, but made it just as easy to abuse. jMolecules was the first attempt to dress architecture in code - to give names, stereotypes, and semantics to what previously existed only as diagrams. Spring Modulith is the natural next step: moving that semantics into the very heart of the Spring runtime.</p><p>Spring Modulith 2.0 stops pretending that modularity is a matter of developer goodwill. Integration with <a href="https://odrotbohm.de/2025/11/jmolecules-2.0-stereotypical/">jMolecules 2.0</a> changes the rules of the game &#8212; DDD stereotypes such as <code>@Aggregate</code>, <code>@Repository</code>, or <code>@ValueObject</code>, which used to be comments for humans, now become contracts enforced by Spring. The framework understands your domain: it knows that an aggregate should not directly access another aggregate, that a repository operates on aggregate roots. Violations of module boundaries no longer surface in code reviews, but as red builds. Module boundaries stop being lines drawn in the sand on a wiki and become walls guarded by the framework - move a class between modules and you immediately see what you broke, instead of discovering it in production.</p><p>Spring Modulith 2.0 arrives at the perfect moment. The market is clearly moving away from unreflective microservices enthusiasm, but at the same time has no desire to return to unstructured monoliths. The so-called &#8220;modular monolith&#8221; thus becomes a conscious architectural choice. Through Modulith, Spring shows that it is possible to build systems that are coherent, modular, and operationally simple - without breaking everything into a mesh of services.</p><h2>Spring AI - Spring positions itself as a system layer for LLM-Based Applications</h2><p>By 2025, it was already clear that integration with LLMs is not the problem of a single library, but of the entire application architecture &#8212; from configuration and observability to security and model lifecycle. Spring AI emerged precisely in this gap. It very quickly stopped being a &#8220;wrapper around the OpenAI API&#8221; and began to play the role that &#8220;classic&#8221; Spring has always assumed during major technological shifts: normalizing chaos. And the release of Spring AI 1.0 in May 2025 - after more than a year of intensive development - officially closed the experimentation phase.</p><p>What matters most is what Spring AI does <em>not</em> try to do. It does not compete with LangChain or purely agent-oriented frameworks. Instead, it assumes that an LLM is just another external system &#8212; like a database, a broker, or a file system &#8212; and as such should be handled consistently with the rest of a Spring application. Concepts such as <code>ChatClient</code>, Advisors, memory, and tool calling were designed to fit existing configuration, transactional, and testing models, rather than bypass them.</p><p>In this way, against the current landscape, Spring AI positions itself as an enterprise-grade glue layer. For teams that already use Spring Boot, Spring Security, Actuator, and Micrometer, entering the world of LLMs does not require rebuilding their mental model of the application. This is a massive adoption advantage &#8212; especially in organizations where experiments must very quickly transition into maintenance, audit, and scaling mode&#8230; particularly if those organizations already use Spring. And since many do, having such a &#8220;default&#8221; from a familiar provider genuinely simplifies things.</p><h2>Langchain4j 1.0: A Java-Native Framework for LLMs</h2><p>Spring AI was not the only JVM project to reach a 1.0 milestone in 2025. A few months earlier, in February, Langchain4j crossed the same threshold &#8212; and while both frameworks address LLM integration, their philosophies differ significantly.</p><p>Langchain4j was created in 2023 as a direct response to the success of Python&#8217;s LangChain - a framework that at the time defined how LLM applications were built (and, despite competition, largely still does). The problem was that for JVM teams, LangChain was inaccessible without rewriting entire services in Python or maintaining hybrid stacks. Dmitriy Dumanskiy, the project&#8217;s creator, set out to fill this gap: the Java and Kotlin worlds lacked AI libraries that were design-wise consistent with their idioms. From the start, <a href="https://github.com/langchain4j/langchain4j">Langchain4j</a> combined ideas not only from LangChain, but also from LlamaIndex and Haystack, adapting them to JVM realities - with integrations for Spring Boot, Quarkus, Micronaut, and Helidon.</p><p>It&#8217;s worth emphasizing, however: despite the name and inspiration, Langchain4j is not a port or a wrapper. The project evolved independently, with its own abstraction model and an API designed from the ground up for the JVM. While Python&#8217;s LangChain evolved toward LangGraph and LCEL, Langchain4j followed its own path - one closer to Java idioms than to Python&#8217;s functional chaining style.</p><p>Where Spring AI deliberately positions itself as a &#8220;glue layer&#8221; for existing Spring applications, Langchain4j has broader ambitions - it aims to be a self-contained framework for building agents, independent of any particular web stack. This is a fundamental difference in approach: Spring AI assumes that the LLM is another external system to be integrated into an application, whereas Langchain4j treats the agent as the central architectural element. Hence the equal-footing integrations with four different web frameworks.</p><p>Proof of this ambition is <strong>langchain4j-agentic</strong> - a subproject developed alongside the core library, providing ready-made abstractions for building multi-agent systems with orchestration, planning, and task delegation. It is the JVM&#8217;s answer to patterns represented in the Python ecosystem by CrewAI or AutoGen and the whole Agentic AI Economy</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NIY4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F016aabe1-ce10-422b-ba28-a3c0d97e9979_1020x1339.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NIY4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F016aabe1-ce10-422b-ba28-a3c0d97e9979_1020x1339.jpeg 424w, https://substackcdn.com/image/fetch/$s_!NIY4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F016aabe1-ce10-422b-ba28-a3c0d97e9979_1020x1339.jpeg 848w, https://substackcdn.com/image/fetch/$s_!NIY4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F016aabe1-ce10-422b-ba28-a3c0d97e9979_1020x1339.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!NIY4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F016aabe1-ce10-422b-ba28-a3c0d97e9979_1020x1339.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NIY4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F016aabe1-ce10-422b-ba28-a3c0d97e9979_1020x1339.jpeg" width="1020" height="1339" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/016aabe1-ce10-422b-ba28-a3c0d97e9979_1020x1339.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1339,&quot;width&quot;:1020,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The House Of Cards Called Agentic AI &#183; ProgrammerHumor.io&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="The House Of Cards Called Agentic AI &#183; ProgrammerHumor.io" title="The House Of Cards Called Agentic AI &#183; ProgrammerHumor.io" srcset="https://substackcdn.com/image/fetch/$s_!NIY4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F016aabe1-ce10-422b-ba28-a3c0d97e9979_1020x1339.jpeg 424w, https://substackcdn.com/image/fetch/$s_!NIY4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F016aabe1-ce10-422b-ba28-a3c0d97e9979_1020x1339.jpeg 848w, https://substackcdn.com/image/fetch/$s_!NIY4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F016aabe1-ce10-422b-ba28-a3c0d97e9979_1020x1339.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!NIY4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F016aabe1-ce10-422b-ba28-a3c0d97e9979_1020x1339.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">Agentic AI Economy</figcaption></figure></div><p>The library offers a unified API for multiple LLM providers and vector databases, supports context memory, RAG patterns, and tool calling &#8212; all expressed in idioms familiar to JVM developers. Integrations with Vertex AI, OpenAI, Ollama, and other providers allow companies to experiment with and compare models without rewriting integration logic.</p><p>Adoption is still not as broad as in Python, but in 2025 it is clearly growing - especially among Kotlin/Spring teams and enterprise applications that previously had to implement their own integration layers. According to Microsoft, hundreds of their customers are already using Langchain4j in production environments. The project has gained serious corporate backing: Red Hat actively co-develops Quarkus integrations (and Dmitriy himself now works at Red Hat), while Microsoft not only conducted a comprehensive security audit of the framework but also contributed nearly 200 pull requests &#8212; including integration of the official OpenAI Java SDK.</p><p>The community around the project is now incomparably larger than a year ago: the repository has surpassed 10,000 stars on GitHub, has over 500 contributors, and a rich ecosystem of extensions &#8212; from integrations with Azure Cosmos DB and Azure AI Search, through MCP support, to dedicated extensions for Quarkus and CDI. This is decisively no longer a &#8220;single author in a basement&#8221; project.</p><h2>Kotlin LSP and why it really matters</h2><p>In 2025, JetBrains officially released <a href="https://github.com/Kotlin/kotlin-lsp">Kotlin LSP</a> - an implementation of the Language Server Protocol developed internally by the Kotlin team, not as a community project. This marks a surprising shift in the positioning of a language that, throughout its history, was inseparably tied to a single IDE.</p><p>Where did that bond come from? Kotlin was created inside JetBrains as an &#8220;IDE-first&#8221; language. Code analysis, refactorings, and completions were all deeply integrated into IntelliJ&#8217;s architecture. Extracting that engine would have required rewriting the foundations. As long as IntelliJ dominated the JVM world, there was little pressure to do so. And then VS Code arrived&#8230; and not just VS Code.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cIKP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ecb0c42-2d96-405b-80a1-d11943131c75_640x620.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cIKP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ecb0c42-2d96-405b-80a1-d11943131c75_640x620.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cIKP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ecb0c42-2d96-405b-80a1-d11943131c75_640x620.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cIKP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ecb0c42-2d96-405b-80a1-d11943131c75_640x620.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cIKP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ecb0c42-2d96-405b-80a1-d11943131c75_640x620.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cIKP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ecb0c42-2d96-405b-80a1-d11943131c75_640x620.jpeg" width="640" height="620" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6ecb0c42-2d96-405b-80a1-d11943131c75_640x620.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:620,&quot;width&quot;:640,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;canWeStopThisNonsense : r/ProgrammerHumor&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="canWeStopThisNonsense : r/ProgrammerHumor" title="canWeStopThisNonsense : r/ProgrammerHumor" srcset="https://substackcdn.com/image/fetch/$s_!cIKP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ecb0c42-2d96-405b-80a1-d11943131c75_640x620.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cIKP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ecb0c42-2d96-405b-80a1-d11943131c75_640x620.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cIKP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ecb0c42-2d96-405b-80a1-d11943131c75_640x620.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cIKP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ecb0c42-2d96-405b-80a1-d11943131c75_640x620.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>By 2025, web-based editors, cloud tools, and - crucially - agentic IDEs like Cursor, Windsurf, and dozens of other AI-powered VS Code forks have become the norm. These tools are not built around IntelliJ plugins (although solutions are beginning to appear there as well). They are built around LSP. A language without LSP is a second-class language for them - the AI assistant can, at best, guess from raw text instead of operating on code structure, symbols, and types.</p><p>This is the crux of the issue: modern AI tools do not &#8220;read&#8221; code like humans do. They need structural information - dependency graphs, type definitions, semantic context. LSP has become the natural interface between a language and AI agents. Kotlin without LSP is Kotlin invisible to an entire generation of tools that will define how we write code in the coming years.</p><p>Kotlin LSP fits into a broader strategy of opening Kotlin up as a language platform: the same move as the K2 compiler front-end - one engine, many consumers. VS Code, Neovim, Zed, Cursor, and its successors all suddenly become real homes for Kotlin.</p><p>What comes next? If JetBrains takes LSP seriously - and all signs point to yes - then within the next 2&#8211;3 years we will see Kotlin as a full-fledged citizen in the ecosystem of agentic IDEs. This also means a potential explosion of third-party tools: linters, analyzers, code generators that do not exist today because building them required deep IntelliJ integration. LSP dramatically lowers that barrier. Paradoxically, by opening Kotlin to the world beyond IntelliJ, JetBrains may strengthen the position of the language itself more than any further IDE improvement ever could.</p><h2>JetBrains Junie - an AI Coding Agent in the IDE World</h2><p>JetBrains Junie, released in 2025, fits into a somewhat opposite trend &#8212; an AI coding agent deeply integrated with IntelliJ IDEA and the broader JetBrains ecosystem. It is the company&#8217;s direct response to Cursor, Windsurf, and the wave of agentic IDEs that, within just two years, evolved from a curiosity into a real threat to traditional editors.</p><p>Context is crucial here. Cursor and similar tools built their advantage on simplicity: take VS Code, add an AI agent, let it edit files and run commands. The problem is that these tools treat code as text. They parse it, tokenize it, and guess. This works great for simple tasks and greenfield projects. But in a large monorepo with thousands of classes, a complex dependency graph, and years of history? The guessing starts to break down.</p><p>JetBrains chose a different path. Instead of building an agent on top of text, they built it on top of semantics. Junie uses the same code analysis engine as IntelliJ itself &#8212; parsers, ASTs, type graphs, and symbol resolution. It understands not just the code, but also the build pipeline, dependency configuration, change history, and tests. When it proposes a refactoring, it knows which classes are related. When it generates code, it understands project conventions. This is an advantage Cursor simply doesn&#8217;t have &#8212; and one that&#8217;s extremely hard to recreate from scratch.</p><p>In practice, Junie goes far beyond &#8220;method completion.&#8221; It fixes compilation errors on the fly, completes test suites, proposes library migrations, and performs project-wide refactorings. For the JVM ecosystem, this is particularly important &#8212; Java and Kotlin have rich semantics, where architectural decisions manifest in relationships between classes and modules, not in individual lines of code.</p><p>Even if she is quite slow doing 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_!2VzM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cf0c00a-18a9-4068-9eab-9807a5aa487e_662x579.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2VzM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cf0c00a-18a9-4068-9eab-9807a5aa487e_662x579.png 424w, https://substackcdn.com/image/fetch/$s_!2VzM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cf0c00a-18a9-4068-9eab-9807a5aa487e_662x579.png 848w, https://substackcdn.com/image/fetch/$s_!2VzM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cf0c00a-18a9-4068-9eab-9807a5aa487e_662x579.png 1272w, https://substackcdn.com/image/fetch/$s_!2VzM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cf0c00a-18a9-4068-9eab-9807a5aa487e_662x579.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2VzM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cf0c00a-18a9-4068-9eab-9807a5aa487e_662x579.png" width="662" height="579" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1cf0c00a-18a9-4068-9eab-9807a5aa487e_662x579.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:579,&quot;width&quot;:662,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:166866,&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/183660944?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cf0c00a-18a9-4068-9eab-9807a5aa487e_662x579.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_!2VzM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cf0c00a-18a9-4068-9eab-9807a5aa487e_662x579.png 424w, https://substackcdn.com/image/fetch/$s_!2VzM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cf0c00a-18a9-4068-9eab-9807a5aa487e_662x579.png 848w, https://substackcdn.com/image/fetch/$s_!2VzM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cf0c00a-18a9-4068-9eab-9807a5aa487e_662x579.png 1272w, https://substackcdn.com/image/fetch/$s_!2VzM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cf0c00a-18a9-4068-9eab-9807a5aa487e_662x579.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>Junie also fits into JetBrains&#8217; broader strategy. Kotlin LSP opens the language to external editors, Mellum provides local models, and the agent itself integrates with QA pipelines and test coverage analysis. JetBrains is clearly not treating AI as an add-on, but as the foundation for a new tooling layer.</p><p>The question for 2026 is whether deep semantic integration will prove to be a sufficient advantage over Cursor&#8217;s rapid iteration speed and the simplicity of VS Code. Cursor has momentum, a strong community, and a low barrier to entry. JetBrains has decades of experience in understanding code and a large IntelliJ user base that doesn&#8217;t want to switch editors. If Junie proves that a semantically aware agent makes fewer mistakes in large projects &#8212; and early signals (including my own tests) suggest that it does &#8212; it may win where it matters most: in enterprise environments, legacy codebases, and places where &#8220;almost works&#8221; is not good enough.</p><h2>Kafka 4.0 and the definitive end of the ZooKeeper era</h2><p>To close, a slightly unusual entry - Kafka touches the JVM only indirectly, as it&#8217;s not a library but an infrastructure component. But that&#8217;s precisely why it matters: Kafka is a flagship project of the JVM ecosystem, and its health reflects on the reputation of the entire platform.</p><p>And that reputation has been tested. Redpanda - rewritten from scratch in C++ - spent recent years pushing a simple, effective narrative: Kafka without the JVM, without ZooKeeper, without GC pauses, faster and easier to operate. WarpStream went even further - Kafka-compatible, but written in Go and built around a completely different cost model. This was real pressure on a project that for years carried the burden of ZooKeeper and a reputation for being &#8220;powerful, but hard.&#8221;</p><p><a href="https://www.confluent.io/blog/latest-apache-kafka-release/">Kafka 4.0</a> is the answer. ZooKeeper is gone for good - KRaft becomes the only mode. No separate cluster, no separate quorum, no failures unrelated to brokers. Fewer components, faster rebalancing, more predictable recovery. Kafka starts to look like a modern platform rather than a system from an era when a &#8220;coordinator&#8221; was a separate entity requiring separate care.</p><p>And the mentioned acquisition of Confluent by IBM is a signal that Kafka is entering a phase of enterprise-grade stability measured in decades.</p><p>What&#8217;s next? Redpanda and WarpStream won&#8217;t disappear - they have their niches and momentum, even if they can be assimilated, like happened in case of Borg. But the main argument against Kafka has just evaporated. Over the next 2&#8211;3 years, we&#8217;ll likely see adoption in mid-scale environments where ZooKeeper was an insurmountable barrier. We&#8217;ll also see whether Kafka proves what the JVM has proven for years: that maturity and ecosystem are still powerful selling points.</p><h2>Other Notable Releases</h2><p><strong><a href="https://hibernate.org/orm/releases/7.0/">Hibernate 7.0</a>:</strong> Jakarta Persistence 3.2, Jakarta Data 1.0, the new QuerySpecification API, a redesigned Restrictions API, a MongoDB Extension in public preview (HQL queries against MongoDB documents), and a move to the Apache License 2.0.</p><p><strong>Quarkus + Mandrel 25:</strong> Full integration with Hibernate 7, a shared Apache License, Native Image optimizations, and support for Project Leyden AOT.</p><p><strong><a href="https://testcontainers.com/blog/testcontainers-2-0/">Testcontainers 2.0</a>:</strong> API redesign, improved support for parallel execution, and tighter integration with cloud providers.</p><p><strong><a href="https://github.com/async-profiler/async-profiler/releases">async-profiler 4.0 / 4.1</a>:</strong> The de facto standard JVM profiling tool gains deeper integration with JFR and support for the latest JDKs &#8212; a quiet but important update for anyone serious about performance tuning.</p><p><strong><a href="https://vertx.io/blog/eclipse-vert-x-5-released/">Vert.x 5.0</a>:</strong> The reactive framework from the Eclipse Foundation catches up with the Loom era &#8212; optimizations for Virtual Threads make it possible to combine the proven event-loop model with the simplicity of blocking code, without sacrificing performance.</p><p><strong><a href="https://grails.org/blog/2025-06-01-grails-7-0-released.html">Grails 7.0</a>:</strong> The Groovy-based web framework jumps to a Spring Boot 4 baseline, continuing its strategy of closely following the Spring ecosystem &#8212; which means Java 17+ as a minimum and full compatibility with Jakarta EE 10.</p><p><strong><a href="https://www.jobrunr.io/en/blog/jobrunr-8/">JobRunr 8.0</a>:</strong> One of the year&#8217;s curiosities - <strong>carbon-aware scheduling</strong>. Jobs can be scheduled for times when the power grid&#8217;s CO&#8322; emissions are lower.</p><p><strong><a href="https://docs.gradle.org/9.0/release-notes.html">Gradle 9.0</a>:</strong> Configuration Cache enabled by default, deprecated APIs cleaned up, new contracts for code generators, and a hard dependency on Kotlin 2.3 signal the end of the era of &#8220;flexible but unpredictable&#8221; builds in favor of deterministic, cacheable build infrastructure.</p><p><strong><a href="https://junit.org/junit6/">JUnit 6.0</a>:</strong> New lifecycle APIs, removal of legacy components, and improved parameterized testing.</p><p><strong><a href="https://micronaut.io/2025/">Micronaut 4.8&#8211;4.10</a>:</strong> Micronaut Langchain4j and Micronaut MCP for building Model Context Protocol servers &#8212; joining the JVM framework race for AI support alongside Spring AI and Helidon AI, while continuing strong AOT development.</p><p><strong><a href="https://helidon.io/docs/v4/#/about/releases/4.2">Helidon 4.2</a>:</strong> Oracle&#8217;s framework surprises not only with Native Image improvements, but above all with Helidon AI (no surprise there) &#8212; integration with LangChain4j. 2025 also brought CRaC support.</p><h1>4. So, What Are We Entering 2026 With?</h1><h2>The Year No One Talked About Platforms - Yet Everything Stood on Them</h2><p>2025 was a year in which the JVM ecosystem made some of the most important moves in its thirty-year history. Valhalla delivered its first concrete JEP. Leyden began to materialize in mainline JDK builds. Virtual Threads shed their last major &#8220;but.&#8221; Spring Framework went through its biggest transformation in years. GraalVM found its true identity.</p><p>At the same time, there&#8217;s a certain irony in the fact that 2025 will go down in history as the year of AI, agents, LLMs, and the generative revolution &#8212; while in everyday tech conversations, Java and the JVM were, at best, background noise. The world debated whether Cursor would replace programmers, whether GPT-5 would change everything, whether agentic IDEs were the future or a dead end&#8230; including within the JVM world. And in a way, that&#8217;s the perfect barometer of platform maturity: nobody talks about the foundations as long as they work. And in 2025, the JVM worked so well that it became invisible.</p><p>This isn&#8217;t a polite, courtesy compliment. Sometimes, in the race for novelty, we forget what critical infrastructure in real companies actually looks like.</p><ul><li><p>Kafka processing trillions of events per day? JVM.</p></li><li><p>Spring powering half of the enterprise backend in the Fortune 500? JVM.</p></li><li><p>Banking applications, reservation systems, e-commerce platforms that handled</p></li><li><p>Black Friday and Cyber Monday without blinking? JVM.</p></li><li><p>ML models served on GPUs via TornadoVM, LLM integrations through Spring</p></li><li><p>AI and Langchain4j, agentic workflows in Quarkus? JVM.</p></li></ul><p>Java doesn&#8217;t need to win the narrative war. It only needs to win the production war. Java&#8217;s strength in 2025 doesn&#8217;t lie in any single feature, framework, or hype cycle. It lies in something far harder to copy: ecosystem density. This is a platform that has an answer to almost every question - not always the most fashionable one, not always the most elegant, but one that works, is tested, maintained, and backward-compatible.</p><ul><li><p>Want to build microservices? Spring Boot, Quarkus, Micronaut, Helidon - pick your philosophy</p></li><li><p>Need reactivity? Vert.x, Project Reactor, RxJava.</p></li><li><p>Prefer a modular monolith? Spring Modulith just reached version 2.0, enforcing module boundaries at the framework level.</p></li><li><p>Building an AI application? Spring AI, Langchain4j, Helidon AI &#8212; each with integrations to dozens of LLM providers.</p></li><li><p>Need native binaries? GraalVM Native Image.</p></li><li><p>Want to keep JVM dynamism but start fast? Project Leyden already delivers AOT class loading in JDK 24.</p></li><li><p>Need to talk to GPUs? TornadoVM.</p></li><li><p>To native code? Panama.</p></li><li><p>To WebAssembly? Chicory, GraalVM, CheerpJ.</p></li></ul><p>This breadth of choice is both a curse and a blessing. A curse, because to outsiders it looks like chaos - &#8220;Java has three frameworks for everything and none of them is obvious.&#8221; A blessing, because for those inside the ecosystem, it means you almost never have to leave the platform. And in a world where context-switching and cross-stack integration costs are among the biggest hidden expenses in software projects, that cohesion has very real business value.</p><p>The power of a platform is that you don&#8217;t need to know everything in advance. The platform evolves, and your code keeps moving forward.</p><h2>Where Java is at Risk - and why it&#8217;s worth talking about openly</h2><p>It would be dishonest to talk about the JVM&#8217;s strength without explicitly naming where the platform has real problems. And in 2025, those problems became more visible than ever.</p><p><strong>Problem one: narrative.</strong> Java is losing the mindshare war among young developers. For someone starting out in 2025, Python is &#8220;the AI language,&#8221; JavaScript is &#8220;the web language,&#8221; Go is &#8220;the cloud language,&#8221; and Rust is &#8220;the language of the future.&#8221; Java is &#8220;what they teach at university&#8221; or &#8220;what corporations use.&#8221; It&#8217;s not a fair assessment, but perception shapes reality. If young developers don&#8217;t enter the ecosystem, the ecosystem will face a talent problem a decade from 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_!-llT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cbe3422-5f4e-4b22-8180-afd2813b2cda_620x1629.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-llT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cbe3422-5f4e-4b22-8180-afd2813b2cda_620x1629.jpeg 424w, https://substackcdn.com/image/fetch/$s_!-llT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cbe3422-5f4e-4b22-8180-afd2813b2cda_620x1629.jpeg 848w, https://substackcdn.com/image/fetch/$s_!-llT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cbe3422-5f4e-4b22-8180-afd2813b2cda_620x1629.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!-llT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cbe3422-5f4e-4b22-8180-afd2813b2cda_620x1629.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-llT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cbe3422-5f4e-4b22-8180-afd2813b2cda_620x1629.jpeg" width="620" height="1629" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6cbe3422-5f4e-4b22-8180-afd2813b2cda_620x1629.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1629,&quot;width&quot;:620,&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_!-llT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cbe3422-5f4e-4b22-8180-afd2813b2cda_620x1629.jpeg 424w, https://substackcdn.com/image/fetch/$s_!-llT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cbe3422-5f4e-4b22-8180-afd2813b2cda_620x1629.jpeg 848w, https://substackcdn.com/image/fetch/$s_!-llT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cbe3422-5f4e-4b22-8180-afd2813b2cda_620x1629.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!-llT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cbe3422-5f4e-4b22-8180-afd2813b2cda_620x1629.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><strong>Problem two: AI-first tooling.</strong> Cursor, Windsurf, and the whole wave of agentic IDEs are built around VS Code and the JavaScript/TypeScript ecosystem. Language models are trained primarily on Python and JavaScript - Java is present, but it doesn&#8217;t dominate. Coding benchmarks (HumanEval, SWE-bench) are written in Python. When people ask &#8220;which language does AI write best,&#8221; Java is not the answer. This may change - I&#8217;m particularly hopeful about JetBrains, Junie, and deep semantic integration - but today, Java is not the &#8220;default language of the AI era.&#8221;</p><p>However, JetBrains fighting for relevance. The merger of Community and Ultimate into a single IntelliJ, Kotlin LSP opening the language to external editors, Junie as an answer to Cursor, and the announcement of a new programming language &#8212; these are not the moves of a company resting on its laurels. They&#8217;re the moves of a company that sees the threat and responds aggressively. If Junie proves that an agent with deep semantic understanding outperforms a text-based agent, JetBrains could reclaim the narrative in the enterprise segment - which very much does not want to give up its beloved IDE.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MS5B!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb858a27d-0511-4d5e-be91-7bcf75b14b63_501x498.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MS5B!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb858a27d-0511-4d5e-be91-7bcf75b14b63_501x498.jpeg 424w, https://substackcdn.com/image/fetch/$s_!MS5B!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb858a27d-0511-4d5e-be91-7bcf75b14b63_501x498.jpeg 848w, https://substackcdn.com/image/fetch/$s_!MS5B!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb858a27d-0511-4d5e-be91-7bcf75b14b63_501x498.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!MS5B!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb858a27d-0511-4d5e-be91-7bcf75b14b63_501x498.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MS5B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb858a27d-0511-4d5e-be91-7bcf75b14b63_501x498.jpeg" width="501" height="498" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b858a27d-0511-4d5e-be91-7bcf75b14b63_501x498.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:498,&quot;width&quot;:501,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Obraz Pina z opowie&#347;ci&#261;&quot;,&quot;title&quot;:&quot;Obraz Pina z opowie&#347;ci&#261;&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="Obraz Pina z opowie&#347;ci&#261;" title="Obraz Pina z opowie&#347;ci&#261;" srcset="https://substackcdn.com/image/fetch/$s_!MS5B!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb858a27d-0511-4d5e-be91-7bcf75b14b63_501x498.jpeg 424w, https://substackcdn.com/image/fetch/$s_!MS5B!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb858a27d-0511-4d5e-be91-7bcf75b14b63_501x498.jpeg 848w, https://substackcdn.com/image/fetch/$s_!MS5B!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb858a27d-0511-4d5e-be91-7bcf75b14b63_501x498.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!MS5B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb858a27d-0511-4d5e-be91-7bcf75b14b63_501x498.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><strong>Problem three: serverless and edge.</strong> Despite progress with Leyden and GraalVM Native Image, Java is still not a natural choice for serverless functions with sub-100ms cold starts. AWS Lambda, Cloudflare Workers, Vercel Functions - these platforms favor JavaScript, Go, and Rust. Java can run there, but it&#8217;s not the first choice. Serverless is one of the fastest-growing segments of the market, and Java is not leading it.</p><p><strong>Problem four: entry complexity.</strong> Maven or Gradle? Spring Boot or Quarkus? Oracle JDK, Temurin, Corretto, or Azul? IntelliJ or VS Code with extensions? For an experienced developer, these choices are trivial. For someone just starting out, they&#8217;re overwhelming. Python has <code>pip install</code> and Jupyter Notebook. JavaScript has <code>npm init</code> and Node. Java has&#8230; a debate about why Gradle is better than Maven that lasts longer than writing the first application.</p><p>These problems are real, and it&#8217;s worth talking about them openly. But it&#8217;s also worth pointing out what the ecosystem is doing to address them.</p><div><hr></div><p>There&#8217;s a strong temptation in 2025 to say that &#8220;platforms no longer matter.&#8221; That only AI matters, that code writes itself, that developers will become &#8220;prompters,&#8221; and that programming languages will fade into the background. This narrative is appealing because it&#8217;s simple. The problem is that it&#8217;s false.</p><p>AI doesn&#8217;t operate in a vacuum. It runs on infrastructure. Models are served by servers. Requests flow through load balancers. Data is stored in databases. Events move through Kafka. Applications are deployed on Kubernetes. And underneath all of that - beneath layers of abstraction, frameworks, orchestrators, and agents - there is code. Code that someone must maintain. Code that must be secure. Code that must run for years, not months. We like to call this DeepTech now, but in reality, these are just the foundations that allow people to calmly vibe-code on top.</p><p>Java isn&#8217;t sexy. Java isn&#8217;t on the covers of tech magazines. Java doesn&#8217;t have its own TikTok full of viral tutorials. But Java is in every bank, every airline, every reservation system, every e-commerce platform larger than a hobby project. Java is in Netflix, Amazon, Google, LinkedIn. Java is in systems that cannot afford to fail.</p><p>In a world obsessed with novelty, there is something deeply valuable (and refreshing!) about a technology that can be boring in the best possible way. Boring because it works. Boring because it&#8217;s predictable. Boring because when production breaks at 3 a.m., you know where to look for logs, who to ask for help, and which tools to run.</p><p>Java in 2025 didn&#8217;t need to be exciting. It needed to be reliable. And it was.</p><p>Now it&#8217;s time for even more interesting 2026. Because if Valhalla makes it to preview in JDK 26, if Leyden truly changes the cold-start equation, if Babylon starts showing real results, if Junie proves the advantage of a semantically aware agent - then 2026 might be the year when even those who don&#8217;t care about platforms start talking about the JVM.</p><p>And <em>that</em> will be interesting.</p><div><hr></div><p>Thank you for making it to the end of this review. I know it was long. I hope that coffee was well invested &#9749; - and, as always, I invite you to spend another year with JVM Weekly.</p><p>Wishing you a great time fulfilling your New Year&#8217;s resolutions!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!k4TF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F445a94cb-28be-4032-9337-d64d2c5b1a73_475x595.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!k4TF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F445a94cb-28be-4032-9337-d64d2c5b1a73_475x595.png 424w, https://substackcdn.com/image/fetch/$s_!k4TF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F445a94cb-28be-4032-9337-d64d2c5b1a73_475x595.png 848w, https://substackcdn.com/image/fetch/$s_!k4TF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F445a94cb-28be-4032-9337-d64d2c5b1a73_475x595.png 1272w, https://substackcdn.com/image/fetch/$s_!k4TF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F445a94cb-28be-4032-9337-d64d2c5b1a73_475x595.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!k4TF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F445a94cb-28be-4032-9337-d64d2c5b1a73_475x595.png" width="475" height="595" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/445a94cb-28be-4032-9337-d64d2c5b1a73_475x595.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:595,&quot;width&quot;:475,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:397057,&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/183660944?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F445a94cb-28be-4032-9337-d64d2c5b1a73_475x595.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_!k4TF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F445a94cb-28be-4032-9337-d64d2c5b1a73_475x595.png 424w, https://substackcdn.com/image/fetch/$s_!k4TF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F445a94cb-28be-4032-9337-d64d2c5b1a73_475x595.png 848w, https://substackcdn.com/image/fetch/$s_!k4TF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F445a94cb-28be-4032-9337-d64d2c5b1a73_475x595.png 1272w, https://substackcdn.com/image/fetch/$s_!k4TF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F445a94cb-28be-4032-9337-d64d2c5b1a73_475x595.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>BTW: Why 2025 was special for me</h3><p>2025 was a <em>very</em> interesting year for me personally. Not because of a single release or hype wave - but because I spent a big chunk of it writing this book. The full premiere is planned for 2026, but the journey already reshaped how I think about engineering, AI, and decision-making under uncertainty.</p><p>&#128073; <em><a href="https://www.manning.com/books/vibe-engineering?utm_source=skowronski&amp;utm_medium=affiliate&amp;utm_campaign=book_lelek2&amp;a_aid=skowronski&amp;a_bid=84bee74c&amp;chan=mm_newsletter&amp;utm_campaign=31615566-book_lelek2&amp;utm_source=author_newsletter">Vibe Engineering: Best Practices, Mistakes and Tradeoffs</a></em><a href="https://www.manning.com/books/vibe-engineering?utm_source=skowronski&amp;utm_medium=affiliate&amp;utm_campaign=book_lelek2&amp;a_aid=skowronski&amp;a_bid=84bee74c&amp;chan=mm_newsletter&amp;utm_campaign=31615566-book_lelek2&amp;utm_source=author_newsletter"> &#8212; Manning MEAP</a></p><p>If you feel like challenging yourself with <strong>AI productivity in my (and my co-author, Tomek) interpretation</strong> - I recommend to at least check.</p><p>No memes inside (Daddy Manning wouldn&#8217;t allow it &#128517;), but I genuinely hope you&#8217;ll still enjoy the ride.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xjUw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fbe5a8e-4802-4cc5-a133-e849c804468b_1558x1036.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xjUw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fbe5a8e-4802-4cc5-a133-e849c804468b_1558x1036.png 424w, https://substackcdn.com/image/fetch/$s_!xjUw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fbe5a8e-4802-4cc5-a133-e849c804468b_1558x1036.png 848w, https://substackcdn.com/image/fetch/$s_!xjUw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fbe5a8e-4802-4cc5-a133-e849c804468b_1558x1036.png 1272w, https://substackcdn.com/image/fetch/$s_!xjUw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fbe5a8e-4802-4cc5-a133-e849c804468b_1558x1036.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xjUw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fbe5a8e-4802-4cc5-a133-e849c804468b_1558x1036.png" width="1456" height="968" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6fbe5a8e-4802-4cc5-a133-e849c804468b_1558x1036.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;:2971886,&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/183660944?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fbe5a8e-4802-4cc5-a133-e849c804468b_1558x1036.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_!xjUw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fbe5a8e-4802-4cc5-a133-e849c804468b_1558x1036.png 424w, https://substackcdn.com/image/fetch/$s_!xjUw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fbe5a8e-4802-4cc5-a133-e849c804468b_1558x1036.png 848w, https://substackcdn.com/image/fetch/$s_!xjUw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fbe5a8e-4802-4cc5-a133-e849c804468b_1558x1036.png 1272w, https://substackcdn.com/image/fetch/$s_!xjUw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fbe5a8e-4802-4cc5-a133-e849c804468b_1558x1036.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>PS3: Just like last year, an uplifting song from an animation for you. Let&#8217;s make it our new year tradition &#10084;&#65039;</p><div id="youtube2-y0aLqu548A4" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;y0aLqu548A4&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/y0aLqu548A4?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>Awhhh&#8230; how I love Hazbin Hotel. </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 26: What Will the New Edition Bring? - JVM Weekly vol. 157]]></title><description><![CDATA[Starting December 4th (yeah, missed it due to yester-week announcement), JDK 26 entered the Rampdown phase!]]></description><link>https://www.jvm-weekly.com/p/feature-freeze-for-jdk-26-what-will</link><guid isPermaLink="false">https://www.jvm-weekly.com/p/feature-freeze-for-jdk-26-what-will</guid><dc:creator><![CDATA[Artur Skowronski]]></dc:creator><pubDate>Thu, 18 Dec 2025 14:03:29 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!czff!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e7de26d-d28e-4e22-9535-fe9d5ab34509_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_!czff!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e7de26d-d28e-4e22-9535-fe9d5ab34509_1456x1048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!czff!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e7de26d-d28e-4e22-9535-fe9d5ab34509_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!czff!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e7de26d-d28e-4e22-9535-fe9d5ab34509_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!czff!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e7de26d-d28e-4e22-9535-fe9d5ab34509_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!czff!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e7de26d-d28e-4e22-9535-fe9d5ab34509_1456x1048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!czff!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e7de26d-d28e-4e22-9535-fe9d5ab34509_1456x1048.png" width="1456" height="1048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2e7de26d-d28e-4e22-9535-fe9d5ab34509_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;:2089676,&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/181979398?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e7de26d-d28e-4e22-9535-fe9d5ab34509_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_!czff!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e7de26d-d28e-4e22-9535-fe9d5ab34509_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!czff!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e7de26d-d28e-4e22-9535-fe9d5ab34509_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!czff!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e7de26d-d28e-4e22-9535-fe9d5ab34509_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!czff!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e7de26d-d28e-4e22-9535-fe9d5ab34509_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>Rampdown phase means that the feature list has been frozen and no further new features are to be expected.</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>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>The production release is scheduled for March 17, 2026, following a second rampdown phase starting January 15, with two release candidates expected in February.</p><p>Now, let&#8217;s go through the complete list of changes in the new edition.</p><h2><strong>Exegi monumentum - Stable Feature</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_!Z2go!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43e3bdb5-8cc0-4621-ab20-307b53a897d5_1488x996.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Z2go!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43e3bdb5-8cc0-4621-ab20-307b53a897d5_1488x996.png 424w, https://substackcdn.com/image/fetch/$s_!Z2go!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43e3bdb5-8cc0-4621-ab20-307b53a897d5_1488x996.png 848w, https://substackcdn.com/image/fetch/$s_!Z2go!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43e3bdb5-8cc0-4621-ab20-307b53a897d5_1488x996.png 1272w, https://substackcdn.com/image/fetch/$s_!Z2go!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43e3bdb5-8cc0-4621-ab20-307b53a897d5_1488x996.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Z2go!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43e3bdb5-8cc0-4621-ab20-307b53a897d5_1488x996.png" width="1456" height="975" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/43e3bdb5-8cc0-4621-ab20-307b53a897d5_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;&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_!Z2go!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43e3bdb5-8cc0-4621-ab20-307b53a897d5_1488x996.png 424w, https://substackcdn.com/image/fetch/$s_!Z2go!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43e3bdb5-8cc0-4621-ab20-307b53a897d5_1488x996.png 848w, https://substackcdn.com/image/fetch/$s_!Z2go!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43e3bdb5-8cc0-4621-ab20-307b53a897d5_1488x996.png 1272w, https://substackcdn.com/image/fetch/$s_!Z2go!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43e3bdb5-8cc0-4621-ab20-307b53a897d5_1488x996.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><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(&#8221;https://example.com/&#8221;))
                         .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><h2><strong>Goodbye, Old Friends - Removals and Preparations</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_!okg-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22386889-23dc-41c5-aa4a-d0fa82e0cc4a_1488x985.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!okg-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22386889-23dc-41c5-aa4a-d0fa82e0cc4a_1488x985.png 424w, https://substackcdn.com/image/fetch/$s_!okg-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22386889-23dc-41c5-aa4a-d0fa82e0cc4a_1488x985.png 848w, https://substackcdn.com/image/fetch/$s_!okg-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22386889-23dc-41c5-aa4a-d0fa82e0cc4a_1488x985.png 1272w, https://substackcdn.com/image/fetch/$s_!okg-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22386889-23dc-41c5-aa4a-d0fa82e0cc4a_1488x985.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!okg-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22386889-23dc-41c5-aa4a-d0fa82e0cc4a_1488x985.png" width="1456" height="964" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/22386889-23dc-41c5-aa4a-d0fa82e0cc4a_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_!okg-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22386889-23dc-41c5-aa4a-d0fa82e0cc4a_1488x985.png 424w, https://substackcdn.com/image/fetch/$s_!okg-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22386889-23dc-41c5-aa4a-d0fa82e0cc4a_1488x985.png 848w, https://substackcdn.com/image/fetch/$s_!okg-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22386889-23dc-41c5-aa4a-d0fa82e0cc4a_1488x985.png 1272w, https://substackcdn.com/image/fetch/$s_!okg-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22386889-23dc-41c5-aa4a-d0fa82e0cc4a_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>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_!Ydou!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cd6fa27-4d6f-4920-9dfd-640022d0ae1a_1357x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ydou!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cd6fa27-4d6f-4920-9dfd-640022d0ae1a_1357x1000.png 424w, https://substackcdn.com/image/fetch/$s_!Ydou!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cd6fa27-4d6f-4920-9dfd-640022d0ae1a_1357x1000.png 848w, https://substackcdn.com/image/fetch/$s_!Ydou!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cd6fa27-4d6f-4920-9dfd-640022d0ae1a_1357x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!Ydou!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cd6fa27-4d6f-4920-9dfd-640022d0ae1a_1357x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ydou!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cd6fa27-4d6f-4920-9dfd-640022d0ae1a_1357x1000.png" width="1357" height="1000" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2cd6fa27-4d6f-4920-9dfd-640022d0ae1a_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;&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_!Ydou!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cd6fa27-4d6f-4920-9dfd-640022d0ae1a_1357x1000.png 424w, https://substackcdn.com/image/fetch/$s_!Ydou!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cd6fa27-4d6f-4920-9dfd-640022d0ae1a_1357x1000.png 848w, https://substackcdn.com/image/fetch/$s_!Ydou!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cd6fa27-4d6f-4920-9dfd-640022d0ae1a_1357x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!Ydou!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2cd6fa27-4d6f-4920-9dfd-640022d0ae1a_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></figure></div><p></p><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><h2><strong>Performance - VM Internals</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_!rzPn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02b1cffd-114f-4d66-b379-2ec1830dd80b_1488x989.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rzPn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02b1cffd-114f-4d66-b379-2ec1830dd80b_1488x989.png 424w, https://substackcdn.com/image/fetch/$s_!rzPn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02b1cffd-114f-4d66-b379-2ec1830dd80b_1488x989.png 848w, https://substackcdn.com/image/fetch/$s_!rzPn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02b1cffd-114f-4d66-b379-2ec1830dd80b_1488x989.png 1272w, https://substackcdn.com/image/fetch/$s_!rzPn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02b1cffd-114f-4d66-b379-2ec1830dd80b_1488x989.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rzPn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02b1cffd-114f-4d66-b379-2ec1830dd80b_1488x989.png" width="1456" height="968" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/02b1cffd-114f-4d66-b379-2ec1830dd80b_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;&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_!rzPn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02b1cffd-114f-4d66-b379-2ec1830dd80b_1488x989.png 424w, https://substackcdn.com/image/fetch/$s_!rzPn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02b1cffd-114f-4d66-b379-2ec1830dd80b_1488x989.png 848w, https://substackcdn.com/image/fetch/$s_!rzPn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02b1cffd-114f-4d66-b379-2ec1830dd80b_1488x989.png 1272w, https://substackcdn.com/image/fetch/$s_!rzPn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02b1cffd-114f-4d66-b379-2ec1830dd80b_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></figure></div><p></p><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><h2><strong>Nihil Novi Sub Sole - Preview Features Continue</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_!30Kb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29657dde-2b67-4eee-9d55-4ef9366750d8_1488x986.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!30Kb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29657dde-2b67-4eee-9d55-4ef9366750d8_1488x986.png 424w, https://substackcdn.com/image/fetch/$s_!30Kb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29657dde-2b67-4eee-9d55-4ef9366750d8_1488x986.png 848w, https://substackcdn.com/image/fetch/$s_!30Kb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29657dde-2b67-4eee-9d55-4ef9366750d8_1488x986.png 1272w, https://substackcdn.com/image/fetch/$s_!30Kb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29657dde-2b67-4eee-9d55-4ef9366750d8_1488x986.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!30Kb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29657dde-2b67-4eee-9d55-4ef9366750d8_1488x986.png" width="1456" height="965" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/29657dde-2b67-4eee-9d55-4ef9366750d8_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;&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_!30Kb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29657dde-2b67-4eee-9d55-4ef9366750d8_1488x986.png 424w, https://substackcdn.com/image/fetch/$s_!30Kb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29657dde-2b67-4eee-9d55-4ef9366750d8_1488x986.png 848w, https://substackcdn.com/image/fetch/$s_!30Kb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29657dde-2b67-4eee-9d55-4ef9366750d8_1488x986.png 1272w, https://substackcdn.com/image/fetch/$s_!30Kb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29657dde-2b67-4eee-9d55-4ef9366750d8_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></figure></div><p></p><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(&#8221;order started&#8221;);  // 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; &#8220;No flights&#8221;;
    case 1 -&gt; &#8220;One flight&#8221;;
    case int i when i &gt;= 100 -&gt; &#8220;Gold status!&#8221;;
    case int i -&gt; &#8220;Regular: &#8220; + i + &#8220; flights&#8221;;
}

// 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><p>This is the last edition before Christmas - next Thursday we have Christmas Day, do you believe? &#127876;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-WfM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbab6f2ee-1d45-4e8f-abe2-66fc2610f436_1488x993.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-WfM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbab6f2ee-1d45-4e8f-abe2-66fc2610f436_1488x993.png 424w, https://substackcdn.com/image/fetch/$s_!-WfM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbab6f2ee-1d45-4e8f-abe2-66fc2610f436_1488x993.png 848w, https://substackcdn.com/image/fetch/$s_!-WfM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbab6f2ee-1d45-4e8f-abe2-66fc2610f436_1488x993.png 1272w, https://substackcdn.com/image/fetch/$s_!-WfM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbab6f2ee-1d45-4e8f-abe2-66fc2610f436_1488x993.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-WfM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbab6f2ee-1d45-4e8f-abe2-66fc2610f436_1488x993.png" width="1456" height="972" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bab6f2ee-1d45-4e8f-abe2-66fc2610f436_1488x993.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_!-WfM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbab6f2ee-1d45-4e8f-abe2-66fc2610f436_1488x993.png 424w, https://substackcdn.com/image/fetch/$s_!-WfM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbab6f2ee-1d45-4e8f-abe2-66fc2610f436_1488x993.png 848w, https://substackcdn.com/image/fetch/$s_!-WfM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbab6f2ee-1d45-4e8f-abe2-66fc2610f436_1488x993.png 1272w, https://substackcdn.com/image/fetch/$s_!-WfM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbab6f2ee-1d45-4e8f-abe2-66fc2610f436_1488x993.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>I wish you a calm end of the year, a few days without alerts, incidents, and &#8220;quick questions&#8221;, and at least one moment to properly unplug - whether &#8220;unplug&#8221; means to you.</p><p>Merry Christmas and happy holidays to everyone - see you next year &#10084;&#65039;</p><div><hr></div><p>BTW: if you&#8217;re looking for interesting technical articles for the holiday season, I highly recommend <strong><a href="https://www.javaadvent.com/">Java Advent Calendar</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_!6NUO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffee0ec9e-b156-4f5a-8005-6086118d0c62_600x313.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6NUO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffee0ec9e-b156-4f5a-8005-6086118d0c62_600x313.png 424w, https://substackcdn.com/image/fetch/$s_!6NUO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffee0ec9e-b156-4f5a-8005-6086118d0c62_600x313.png 848w, https://substackcdn.com/image/fetch/$s_!6NUO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffee0ec9e-b156-4f5a-8005-6086118d0c62_600x313.png 1272w, https://substackcdn.com/image/fetch/$s_!6NUO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffee0ec9e-b156-4f5a-8005-6086118d0c62_600x313.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6NUO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffee0ec9e-b156-4f5a-8005-6086118d0c62_600x313.png" width="600" height="313" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fee0ec9e-b156-4f5a-8005-6086118d0c62_600x313.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:313,&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_!6NUO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffee0ec9e-b156-4f5a-8005-6086118d0c62_600x313.png 424w, https://substackcdn.com/image/fetch/$s_!6NUO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffee0ec9e-b156-4f5a-8005-6086118d0c62_600x313.png 848w, https://substackcdn.com/image/fetch/$s_!6NUO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffee0ec9e-b156-4f5a-8005-6086118d0c62_600x313.png 1272w, https://substackcdn.com/image/fetch/$s_!6NUO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffee0ec9e-b156-4f5a-8005-6086118d0c62_600x313.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 an initiative running since 2012, where every day for 24 days of December (the Advent period) a new technical article appears from various authors in the JVM community. Similar idea to Advent of Code, but instead of algorithmic puzzles &#8211; a solid dose of knowledge.</p><p>This year <strong><a href="https://www.linkedin.com/article/edit/7406742355938045952/#">Olimpiu Pop</a></strong> did great job... like every year.</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[I wrote a book for Manning... and it is not about Java - JVM Weekly vol. 156]]></title><description><![CDATA[Finally, I can spill the beans!]]></description><link>https://www.jvm-weekly.com/p/i-wrote-a-book-for-manning-and-it</link><guid isPermaLink="false">https://www.jvm-weekly.com/p/i-wrote-a-book-for-manning-and-it</guid><dc:creator><![CDATA[Artur Skowronski]]></dc:creator><pubDate>Thu, 11 Dec 2025 14:02:52 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!B6I8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88bf446e-d4d9-4b54-97c4-b544dc695d5b_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_!B6I8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88bf446e-d4d9-4b54-97c4-b544dc695d5b_1456x1048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!B6I8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88bf446e-d4d9-4b54-97c4-b544dc695d5b_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!B6I8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88bf446e-d4d9-4b54-97c4-b544dc695d5b_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!B6I8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88bf446e-d4d9-4b54-97c4-b544dc695d5b_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!B6I8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88bf446e-d4d9-4b54-97c4-b544dc695d5b_1456x1048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!B6I8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88bf446e-d4d9-4b54-97c4-b544dc695d5b_1456x1048.png" width="1456" height="1048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/88bf446e-d4d9-4b54-97c4-b544dc695d5b_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;:1406186,&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/181160011?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88bf446e-d4d9-4b54-97c4-b544dc695d5b_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_!B6I8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88bf446e-d4d9-4b54-97c4-b544dc695d5b_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!B6I8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88bf446e-d4d9-4b54-97c4-b544dc695d5b_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!B6I8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88bf446e-d4d9-4b54-97c4-b544dc695d5b_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!B6I8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88bf446e-d4d9-4b54-97c4-b544dc695d5b_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>I wrote a book. And no, it&#8217;s not about Java - can you believe?</p><p>Since I&#8217;m hijacking an entire newsletter edition for this announcement, you deserve an explanation. But first, the Call-to-Action: If you want to check at the source/buy the book, check the link below &#128513;</p><p><strong>&#128073; <a href="https://hubs.la/Q03XhPkb0">Vibe Engineering: Best Practices, Mistakes and Tradeoffs</a></strong><a href="https://hubs.la/Q03XhPkb0"> - Manning MEAP</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_!P6TF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61d88c71-58d2-4923-af06-500da73e06f1_1500x500.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!P6TF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61d88c71-58d2-4923-af06-500da73e06f1_1500x500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!P6TF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61d88c71-58d2-4923-af06-500da73e06f1_1500x500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!P6TF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61d88c71-58d2-4923-af06-500da73e06f1_1500x500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!P6TF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61d88c71-58d2-4923-af06-500da73e06f1_1500x500.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!P6TF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61d88c71-58d2-4923-af06-500da73e06f1_1500x500.jpeg" width="1456" height="485" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/61d88c71-58d2-4923-af06-500da73e06f1_1500x500.jpeg&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;:93720,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.jvm-weekly.com/i/181160011?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61d88c71-58d2-4923-af06-500da73e06f1_1500x500.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!P6TF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61d88c71-58d2-4923-af06-500da73e06f1_1500x500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!P6TF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61d88c71-58d2-4923-af06-500da73e06f1_1500x500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!P6TF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61d88c71-58d2-4923-af06-500da73e06f1_1500x500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!P6TF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61d88c71-58d2-4923-af06-500da73e06f1_1500x500.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>And now, the story.</p><h2><strong>What&#8217;s this book about?</strong></h2><p>It&#8217;s our guide to the new, messy reality of AI-assisted programming. No &#8220;10 prompts that will change your life&#8221; nonsense here. Instead, we shatter the illusion of simplicity and focus on the hard choices you&#8217;ll inevitably face.</p><p>What you get:</p><ul><li><p>A toolkit for critical thinking about AI tools</p></li><li><p>A map of common traps with recommendations on how to dodge them</p></li><li><p>Techniques for uncovering hidden costs and risks in AI-generated code</p></li><li><p>A framework for building processes that protect your team from the illusion of progress</p></li></ul><p>Rather than chasing prompts for one specific model (while we have our favourites), we teach provider-agnostic methodology built on human-readable, executable specifications. Use any LLM as a tool to fulfill a verifiable contract - and your skills stay relevant no matter which model is trending this week.</p><p><strong>A note for JVM developers:</strong> While the book isn&#8217;t Java-specific, you&#8217;ll find several chapters with hands-on examples from the JVM ecosystem - because that&#8217;s where we spend most of our coding time.</p><h2><strong>Why the book?</strong></h2><p><strong><a href="https://www.linkedin.com/in/tomaszlelek?miniProfileUrn=urn%3Ali%3Afs_miniProfile%3AACoAAAzjl1oBH50mzFnhLezZNoQkieTgWfevrDA">Tomasz Lelek</a></strong> and I know each other for very long time. We see each other as often as two adult men reasonably can (along with a wider crew, we run a Reading Club - monthly beer + book discussions). Tomek also wrote one of Manning&#8217;s big bestsellers, <em><a href="https://www.manning.com/books/software-mistakes-and-tradeoffs">Software Mistakes and Tradeoffs</a></em>. So when he was looking for a co-author for a new book and offered me the spot... well, I&#8217;m not exactly the assertive type, so here we are &#128517;</p><h2><strong>Why is a Java guy writing about Vibe Engineering?</strong></h2><p>I&#8217;ve never hidden that I work at VirtusLab as a Software Consultant. And in today&#8217;s world, believe me, every software consultancy is trying to figure out how to leverage AI. That&#8217;s exactly what I do as Head of my department - working on people productivity.</p><p>For the past year, my team and I have been testing, tweaking, and battle-testing everything we could find. Every technique in this book is grounded in what we&#8217;ve actually validated in the field.</p><p>Just take a look on my notes in the form of Mind Map I accumulated over the year &#129760;. Sharing them publicly the first time ever. It&#8217;s the smallest I can make them, and still just part of the bigger picture (you can download PDF below thou&#8217;)</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KUee!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3dd333a-c98f-47f4-b459-20c213237e50_2536x1500.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KUee!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3dd333a-c98f-47f4-b459-20c213237e50_2536x1500.png 424w, https://substackcdn.com/image/fetch/$s_!KUee!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3dd333a-c98f-47f4-b459-20c213237e50_2536x1500.png 848w, https://substackcdn.com/image/fetch/$s_!KUee!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3dd333a-c98f-47f4-b459-20c213237e50_2536x1500.png 1272w, https://substackcdn.com/image/fetch/$s_!KUee!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3dd333a-c98f-47f4-b459-20c213237e50_2536x1500.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KUee!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3dd333a-c98f-47f4-b459-20c213237e50_2536x1500.png" width="1456" height="861" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b3dd333a-c98f-47f4-b459-20c213237e50_2536x1500.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:861,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:904038,&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/181160011?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3dd333a-c98f-47f4-b459-20c213237e50_2536x1500.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_!KUee!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3dd333a-c98f-47f4-b459-20c213237e50_2536x1500.png 424w, https://substackcdn.com/image/fetch/$s_!KUee!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3dd333a-c98f-47f4-b459-20c213237e50_2536x1500.png 848w, https://substackcdn.com/image/fetch/$s_!KUee!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3dd333a-c98f-47f4-b459-20c213237e50_2536x1500.png 1272w, https://substackcdn.com/image/fetch/$s_!KUee!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3dd333a-c98f-47f4-b459-20c213237e50_2536x1500.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="file-embed-wrapper" data-component-name="FileToDOM"><div class="file-embed-container-reader"><div class="file-embed-container-top"><image class="file-embed-thumbnail-default" src="https://substackcdn.com/image/fetch/$s_!0Cy0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack.com%2Fimg%2Fattachment_icon.svg"></image><div class="file-embed-details"><div class="file-embed-details-h1">Vibe Engineering</div><div class="file-embed-details-h2">746KB &#8729; PDF file</div></div><a class="file-embed-button wide" href="https://www.jvm-weekly.com/api/v1/file/f89d534d-836a-47ca-bb1f-4c541f47df3e.pdf"><span class="file-embed-button-text">Download</span></a></div><a class="file-embed-button narrow" href="https://www.jvm-weekly.com/api/v1/file/f89d534d-836a-47ca-bb1f-4c541f47df3e.pdf"><span class="file-embed-button-text">Download</span></a></div></div><h2><strong>Why not self-publish?</strong></h2><p>Self-publishing is trendy, but honestly - working with a proper publisher like Manning is fantastic. We have a dedicated editor (Doug &#10084;&#65039;), editorial support, and 17 reviewers went through the manuscript before Early Access even launched.</p><p>We live in a world where anyone can publish... and that&#8217;s great&#8212;my newsletter exists because of it. But AI is a topic where <em>literally everyone</em> is writing, often shallow. Having that extra filter of reviewers and editors gives me confidence that what&#8217;s in there actually makes sense.</p><p>And I think we did solid work - even the first draft already passed Manning&#8217;s high review threshold with genuinely good scores - and we polished it since then!</p><h2><strong>What&#8217;s MEAP and what am I actually buying?</strong></h2><p>Manning Early Access Program means you read the book as it&#8217;s being written. You get access to new chapters as they&#8217;re ready - monthly drops until the full release in May. Plus the final version when it ships.</p><h2><strong>Was AI used to write book about AI?</strong></h2><p>I&#8217;m not a native speaker, so I use AI for editing, corrections, and flow improvements&#8212;it&#8217;s genuinely perfect for that. All the actual content is human.</p><p>My lifestyle (and anyone who&#8217;s worked with me can confirm) is waking up at 6 AM and speed-running through RSS feeds, Hacker News, Reddit, and newsletters&#8212;been doing it for years. Then I go deep on selected topics. That&#8217;s how JVM Weekly was born, how Vived came to be, and how Vibe Engineering was created.</p><p>If you&#8217;ve got training budgets left before year-end - consider this your sign &#128522;</p><p><strong>&#128073; <a href="https://hubs.la/Q03XhPkb0">Vibe Engineering: Best Practices, Mistakes and Tradeoffs</a></strong><a href="https://hubs.la/Q03XhPkb0"> - Manning MEAP</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_!fnxd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadafb769-1055-4b9d-8aca-83a06828346a_1080x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fnxd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadafb769-1055-4b9d-8aca-83a06828346a_1080x1080.png 424w, https://substackcdn.com/image/fetch/$s_!fnxd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadafb769-1055-4b9d-8aca-83a06828346a_1080x1080.png 848w, https://substackcdn.com/image/fetch/$s_!fnxd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadafb769-1055-4b9d-8aca-83a06828346a_1080x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!fnxd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadafb769-1055-4b9d-8aca-83a06828346a_1080x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fnxd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadafb769-1055-4b9d-8aca-83a06828346a_1080x1080.png" width="332" height="332" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/adafb769-1055-4b9d-8aca-83a06828346a_1080x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1080,&quot;width&quot;:1080,&quot;resizeWidth&quot;:332,&quot;bytes&quot;:400485,&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/181160011?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadafb769-1055-4b9d-8aca-83a06828346a_1080x1080.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_!fnxd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadafb769-1055-4b9d-8aca-83a06828346a_1080x1080.png 424w, https://substackcdn.com/image/fetch/$s_!fnxd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadafb769-1055-4b9d-8aca-83a06828346a_1080x1080.png 848w, https://substackcdn.com/image/fetch/$s_!fnxd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadafb769-1055-4b9d-8aca-83a06828346a_1080x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!fnxd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadafb769-1055-4b9d-8aca-83a06828346a_1080x1080.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>See you in the next (regular) edition!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!O3-P!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dab95ee-aa85-4232-8cda-6f8fb8b92ef3_895x612.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!O3-P!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dab95ee-aa85-4232-8cda-6f8fb8b92ef3_895x612.png 424w, https://substackcdn.com/image/fetch/$s_!O3-P!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dab95ee-aa85-4232-8cda-6f8fb8b92ef3_895x612.png 848w, https://substackcdn.com/image/fetch/$s_!O3-P!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dab95ee-aa85-4232-8cda-6f8fb8b92ef3_895x612.png 1272w, https://substackcdn.com/image/fetch/$s_!O3-P!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dab95ee-aa85-4232-8cda-6f8fb8b92ef3_895x612.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!O3-P!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dab95ee-aa85-4232-8cda-6f8fb8b92ef3_895x612.png" width="895" height="612" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8dab95ee-aa85-4232-8cda-6f8fb8b92ef3_895x612.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:612,&quot;width&quot;:895,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1053043,&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/181160011?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dab95ee-aa85-4232-8cda-6f8fb8b92ef3_895x612.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_!O3-P!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dab95ee-aa85-4232-8cda-6f8fb8b92ef3_895x612.png 424w, https://substackcdn.com/image/fetch/$s_!O3-P!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dab95ee-aa85-4232-8cda-6f8fb8b92ef3_895x612.png 848w, https://substackcdn.com/image/fetch/$s_!O3-P!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dab95ee-aa85-4232-8cda-6f8fb8b92ef3_895x612.png 1272w, https://substackcdn.com/image/fetch/$s_!O3-P!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dab95ee-aa85-4232-8cda-6f8fb8b92ef3_895x612.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 TornadoVM Programming Model Explained with Juan Fumero - JVM Weekly vol. 155]]></title><description><![CDATA[Today, Juan Fumero explains, how TornadoVM works under the hood.]]></description><link>https://www.jvm-weekly.com/p/the-tornadovm-programming-model-explained</link><guid isPermaLink="false">https://www.jvm-weekly.com/p/the-tornadovm-programming-model-explained</guid><dc:creator><![CDATA[Artur Skowronski]]></dc:creator><pubDate>Thu, 04 Dec 2025 14:02:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!P5ZI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F257bc369-4b0d-4c2b-85af-99953b6473d4_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_!P5ZI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F257bc369-4b0d-4c2b-85af-99953b6473d4_1456x1048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!P5ZI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F257bc369-4b0d-4c2b-85af-99953b6473d4_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!P5ZI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F257bc369-4b0d-4c2b-85af-99953b6473d4_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!P5ZI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F257bc369-4b0d-4c2b-85af-99953b6473d4_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!P5ZI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F257bc369-4b0d-4c2b-85af-99953b6473d4_1456x1048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!P5ZI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F257bc369-4b0d-4c2b-85af-99953b6473d4_1456x1048.png" width="1456" height="1048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/257bc369-4b0d-4c2b-85af-99953b6473d4_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;:2027590,&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/180187675?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F257bc369-4b0d-4c2b-85af-99953b6473d4_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_!P5ZI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F257bc369-4b0d-4c2b-85af-99953b6473d4_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!P5ZI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F257bc369-4b0d-4c2b-85af-99953b6473d4_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!P5ZI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F257bc369-4b0d-4c2b-85af-99953b6473d4_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!P5ZI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F257bc369-4b0d-4c2b-85af-99953b6473d4_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><em>Year ago I announced that JVM Weekly had joined the Friends of OpenJDK (Foojay.io) family. Foojay.io is a dynamic, community-driven platform for OpenJDK users, primarily Java and Kotlin enthusiasts. As a hub for the &#8220;Friends of OpenJDK,&#8221; Foojay.io 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.</em></p><p>Today we&#8217;re doing something slightly unusual in JVM Weekly &#8211; the article I&#8217;m sharing with you is not from this month. In fact, it&#8217;s almost a <strong>year and a half old</strong>. Why the time travel? Recently, in one of the Foojay podcast episodes (which I also reshare a bit later), <a href="https://www.linkedin.com/in/frankdelporte/">Frank Delporte</a> did a great tour of JVM-adjacent projects, including TornadoVM. That felt like the perfect excuse to come back to one of my all-time favourite pieces ever published on Foojay and ask the author whether he&#8217;d let me repost 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><p>So today you&#8217;re getting a proper engineering deep dive: <a href="https://www.linkedin.com/in/juanjosefumeroalfonso/">Juan Fumero</a> article on the <strong>architecture of TornadoVM</strong>. Back when the text was written, Juan was still at the University of Manchester - today he&#8217;s moved to Oracle and the Java Platform Group, and he is currently working on the <a href="https://github.com/openjdk/babylon/tree/code-reflection/hat">Heterogeneous Accelerator Toolkit (HAT)</a> within the OpenJDK <a href="https://github.com/openjdk/babylon">project Babylon</a> itself, using the new code-reflection APIs for GPU code generation from Java.</p><p><strong>Important:</strong> <a href="https://foojay.io/today/the-tornadovm-programming-model-explained/">Original article was published in May 2024</a> and TornadoVM and its ecosystem have evolved a bit since then. The core concepts in the article are still absolutely spot-on, though, and they do a fantastic job explaining why TornadoVM is one of the most interesting things happening around the JVM right now. </p><p>I genuinely hope you enjoy this piece as much as I did and that you share a bit of the excitement I felt while arranging this repost &#129321;</p><h1><strong>The TornadoVM Programming Model Explained</strong></h1><h2><strong>Key Takeaways</strong></h2><ul><li><p><a href="https://github.com/beehive-lab/TornadoVM/">TornadoVM</a> offers an API for parallel programming on modern hardware that tackles data parallel, task parallel and pipeline parallel applications.</p></li><li><p>TornadoVM offers different abstractions to developers to be able to express parallel applications in Java, identify the methods to offload, and dispatch the application on the corresponding accelerators.</p></li><li><p>Task-Graphs and Execution Plans are the main building blocks of TornadoVM applications, allowing developers to compose complex graphs of computations and interact with the TornadoVM runtime to enable/disable profiling, enable debugging, or enable dynamic reconfiguration to select the best possible accelerators for the compute graphs.</p></li></ul><p>In this blog post, I will explain how developers can start programming with TornadoVM and interact with the TornadoVM runtime.</p><p>I will explain the TornadoVM programming model and I will show an example from scratch that illustrates all the steps to be done to run on GPUs (or any other TornadoVM-compatible hardware).</p><h2><strong>Overview of the TornadoVM Software Stack</strong></h2><p>Let&#8217;s start with a general overview of the TornadoVM Software stack and the main components, as shown in the following Figure.</p><p>At a high level, TornadoVM exposes an API for developers.</p><p>This API contains the building blocks to be used by developers to express parallel applications, identify which methods to use and offload and run applications on GPUs and FPGAs.</p><p>This API is the main content of this blog post.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SG9y!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F562f6140-abff-4267-82c1-95977c3722ce_960x540.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SG9y!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F562f6140-abff-4267-82c1-95977c3722ce_960x540.jpeg 424w, https://substackcdn.com/image/fetch/$s_!SG9y!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F562f6140-abff-4267-82c1-95977c3722ce_960x540.jpeg 848w, https://substackcdn.com/image/fetch/$s_!SG9y!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F562f6140-abff-4267-82c1-95977c3722ce_960x540.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!SG9y!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F562f6140-abff-4267-82c1-95977c3722ce_960x540.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SG9y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F562f6140-abff-4267-82c1-95977c3722ce_960x540.jpeg" width="960" height="540" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/562f6140-abff-4267-82c1-95977c3722ce_960x540.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:540,&quot;width&quot;:960,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Alt text&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="Alt text" title="Alt text" srcset="https://substackcdn.com/image/fetch/$s_!SG9y!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F562f6140-abff-4267-82c1-95977c3722ce_960x540.jpeg 424w, https://substackcdn.com/image/fetch/$s_!SG9y!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F562f6140-abff-4267-82c1-95977c3722ce_960x540.jpeg 848w, https://substackcdn.com/image/fetch/$s_!SG9y!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F562f6140-abff-4267-82c1-95977c3722ce_960x540.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!SG9y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F562f6140-abff-4267-82c1-95977c3722ce_960x540.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>Under the hoods, the TornadoVM runtime system and the Just-In-Time compiler, optimise, compile and dispatch the input application on heterogeneous hardware.</p><p>We will not go into the details of the runtime system in this tutorial, but in a nutshell, the TornadoVM JIT compiler extends the GraalVM JIT compiler to offload Java code to low-level GPU-friendly code, such as CUDA, OpenCL and SPIR-V.</p><p>Then, the TornadoVM runtime takes care of data migration, data handling and execution of the application for the target hardware.</p><p>Thus, in a way, TornadoVM is a full-package solution that is not only used for programming on modern hardware but also for orchestrating, running, and optimising a subset of Java programs on heterogeneous hardware.</p><h2><strong>How do we start programming with TornadoVM?</strong></h2><p>So, let&#8217;s focus now on the API level and how developers can start using TornadoVM to program their applications. To understand the main ideas behind each API component in TornadoVM, we need to think about the following aspects:</p><ol><li><p>How do we <strong>represent</strong> parallelism, in a programming language that was not primarily designed for parallelism and modern hardware? Note that, there are different types of parallelism, such as data-parallelism, task-parallelism and pipeline-parallelism, and we would like to run a subset of Java programs on explicit parallel hardware, such as GPUs. Thus, ideally, we would like an API to express these types of parallelization in our programs in an easy manner, and be able to dispatch our parallel programs on a wide diverse of modern hardware, such as GPUs, FPGAs, RISC-V accelerators, etc.</p></li><li><p>How do we <strong>identify</strong> which functions (or methods) to offload? We usually have large programs with hundreds of classes and thousands of methods, but how do we select the methods to be offloaded (to be transformed and migrated to the target accelerator)?</p></li><li><p>How do we <strong>run</strong> on parallel hardware? And how do we profile, get the results, etc?</p></li></ol><p>The TornadoVM API tries to tackle all these questions with different API components. Let&#8217;s discuss this briefly one by one.</p><h2><strong>1. Representing Parallelism</strong></h2><p>There are two ways to express parallelism with TornadoVM, and developers can choose one or the other:</p><ol><li><p><strong>Via annotations in the source code:</strong> Annotating Java for-loops with the <code>@Parallel</code> annotation and reduction parameters with the <code>@Reduce</code> annotation for those loops that can be parallelisable. This means that, if the loop does not have data dependencies, we can add the <code>@Parallel</code> annotation to indicate to the TornadoVM compiler and runtime system that the loop/s can be parallelisable, and, therefore, the JIT compiler can perform the corresponding code transformations to convert Java sequential loops into explicit parallel loops. It is also possible to add nested parallel loops. <strong>This API is convenient for non-GPU/FPGA experts to get easier and quicker access to hardware accelerators.</strong></p></li><li><p><strong>Via an explicit parallel kernel API:</strong> Developers use the <code>KernelContext</code> API. This second style is a lower-level API compared to the annotations, and it is more similar to <a href="https://www.khronos.org/opencl/">OpenCL</a> and <a href="https://www.oneapi.io/">oneAPI</a> to program explicit parallel kernels. The use of the parallel kernel API is sometimes more convenient for developers who are already familiar with OpenCL, oneAPI or CUDA and want to port existing kernels into TornadoVM.</p></li></ol><p><strong>In this post, we will focus on the first option</strong>, using the TornadoVM annotations for the for-loops. Let&#8217;s see this in practice through an example.</p><p>Let&#8217;s say we want to initialise an array of floating point numbers (in fp32) and perform some computations with this array.</p><p>Thus, let&#8217;s code two methods for 1) initialization of an array; and b) perform a computation (e.g., compute the SQRT function from the <code>Math</code> library):</p><pre><code>public class MySample { 
    public static void init(FloatArray array) {
        for (int i = 0; i &lt; data.getSize(); i++) {
            array.set(i, i * 2);
        }
    }

    public static void computeSqrt(FloatArray array) {
        for (int i = 0; i &lt; data.getSize(); i++) {
            float value = array.get(i);
            array.set(i, Math.sqrt(value));
        }
    }

    public FloatArray compute(FloatArray array) {
        init(array);
        computeSqrt(array);
        // do something else
        // ...  
        return array;
    }
}</code></pre><p>A few things to highlight regarding this code snippet:</p><ol><li><p>We see a data type called <code>FloatArray</code>. This data type is provided by the TornadoVM API, and it contains (as the name suggests) an array of floating point numbers (<code>fp32</code>). The array is stored off-heap using the <a href="https://github.com/openjdk/panama-foreign/blob/foreign-memaccess%2Babi/doc/panama_memaccess.md">Java Panama Memory API</a>. For this tutorial, we are going to stay with our <code>FloatArray</code>, but feel free to <a href="https://github.com/beehive-lab/TornadoVM/tree/master/tornado-api/src/main/java/uk/ac/manchester/tornado/api/types">scan the API and Collections of TornadoVM to see all the supported types</a> to see all supported types.</p></li><li><p>We see that each method returns <code>void</code>, and the inputs and outputs are passed as arguments to the methods. This is intentional since the TornadoVM will offload each of the Java methods to run in parallel on the target device (e.g., a GPU). Since the target hardware of TornadoVM allows developers to run many threads (usually &gt; 1000s threads), it would be almost impossible to determine which thread/s returns a value from the entire method efficiently. Thus, we provide the method in a more &#8220;Tornado&#8221;-friendly way to approach the next step (use the annotations in the for-loops).</p></li></ol><p>Let&#8217;s now introduce the <code>@Parallel</code> annotation for parallel loops of the methods we want to offload.</p><p>When using the annotation, it is the responsibility of the developer to include the <code>@Parallel</code> annotation in the loops that do not have data dependencies.</p><p>This annotation will indicate the TornadoVM compiler that we want to run the whole loop in parallel using many threads.</p><p><strong>But, how many threads?:</strong> The number of threads depends on the loop bound of the annotated loop. But this is transparent to Java developers, and the TornadoVM runtime and the JIT compiler work together to set these values.</p><p>Going back to our example, let&#8217;s add the annotations for the two methods we potentially want to offload: the <code>init</code> and the <code>computeSqrt</code> methods.</p><pre><code>public class HelloTornado { 
    public static void init(FloatArray array) {
        for (@Parallel int i = 0; i &lt; data.getSize(); i++) {
            array.set(i, i * 2);
        }
    }

    public static void computeSqrt(FloatArray array) {
        for (@Parallel int i = 0; i &lt; data.getSize(); i++) {
            float value = array.get(i);
            array.set(i, TornadoMath.sqrt(value));   // &lt;&lt; Use TornadoMath class instead
        }
    }

    public FloatArray compute(FloatArray array) {
        init(array);
        computeSqrt(array);
        // do something else
        // ...  
        return array;
    }
}</code></pre><p>Furthermore, for this step, we transform the <code>Math.sqrt</code> into <code>TornadoMath.sqrt</code>. TornadoVM offers a math library, similar to Java. The reason for having this library is that, for some GPU/FPGA devices, <code>double</code> (fp64) types are not supported for all GPUS/accelerators. For example on Intel ARC GPUs, or the latest Intel HD graphics.</p><p>However, we can still compute sqrt or many of the math functions using less precision, such as in fp32 (<code>float</code> in Java), or even less. To allow this integration, TornadoVM offers this API that the JIT compiler can understand and provide the correct replacements using the narrower types (e.g., fp32 or fp16).</p><p>Besides, there is another reason why you might want to use the <code>TornadoMath</code> library for your applications when running on GPUs, and <strong>that&#8217;s performance</strong>.</p><p>CPUs, usually offer the same performance when computing fp32 and fp64 operations. However, this is not usually the case for current GPUs. For example, while you can compute operations in <code>double</code> (fp64) precision on NVIDIA GPUs, there are usually fewer functional units per GPU thread in fp64 compared to fp32. And this means that, if operating in fp64, CUDA threads need to share the functional units. To give an example, using the RTX 4090 GPU, <a href="https://www.techpowerup.com/gpu-specs/geforce-rtx-4090.c3889">the ratio is 1:64</a>. Thus. be careful! <strong>In GPU programming, think twice before you operate using </strong><code>double</code><strong> data types.</strong></p><p>Now, let&#8217;s move on to create our compute graphs.</p><h2><strong>2. Identifying the Java Methods to Offload</strong></h2><p>TornadoVM offloads code at the method level (similar to the <a href="https://developers.redhat.com/articles/2021/06/23/how-jit-compiler-boosts-java-performance-openjdk">JIT compiler in Hotspot</a>). To specify which method/s to offload, TornadoVM offers a Task-Graph API, in which each node in the graph represents a task.</p><p>Besides, we add the data inputs and outputs of our computation to the graph. This is useful for the TornadoVM runtime, which needs to perform data migration between the host (main CPU) and the accelerator (e.g., the GPU), since in many cases, the computing system does not share the same memory for both accelerators and the CPU.</p><p>To continue with our example, we build the Task-Graph as follows:</p><pre><code>public class HelloTornado { 
    public static void init(FloatArray array) {...}

    public static void computeSqrt(FloatArray array) {...}

    public FloatArray compute(FloatArray array) {
        TaskGraph graph = new TaskGraph(&#8221;graph&#8221;)  
          .transferToDevice(DataTransferMode.EVERY_EXECUTION, array)
          .task(&#8221;init&#8221;, HelloTornado::init, array)
          .task(&#8221;compute&#8221;, HelloTornado::computeSqrt, array)
          .transferToHost(DataTransferMode.EVERY_EXECUTION, array);
        return array;
    }
}</code></pre><p>We see that, for creating and defining all data and tasks of our computation, we use mainly three methods from the Task-Graph API:</p><ol><li><p><code>transferToDevice</code>: it defines all objects to be copied to the target accelerator. It also defines a mode for each of the objects. In this case, we specify that the <code>array</code> object must be transferred every time the whole graph is executed. TornadoVM also supports read-only copies.</p></li><li><p><code>task</code>: This is the method identification. To identify uniquely every method, we give a name. This name is useful to check with the profiler, change the device at runtime, etc. The next parameter of this method is the reference to an existing Java method. This could be a lambda expression, an instance method, or a static method. In our example, we use a reference to a static method.<br><strong>We can define as many tasks as we want</strong>, and, as soon as they are accessible from the class that instantiates the task graph, each referenced method could be located in different Java classes.</p></li><li><p><code>transferToHost</code>: it defines the data objects in which we expect the output of our computation. This could be one or many objects. Additionally, we pass a mode.<br>Usually, we want the output to be transferred to the host right after the execution of a task graph has finished. However, in some cases (e.g., iterative algorithms), we want to execute a graph multiple times and only transfer the data at the end. In this case, we could also define data to be transferred <code>UNDER_DEMAND</code> and use another data structure (called <code>TornadoExecutionPlan</code>) to copy data under demand.</p></li></ol><p>Note that the Task-Graph is never executed. It only defines which method/s, and which object/s to use. To execute a Task-Graph, we need to instantiate an object of type <code>TornadoExecutionPlan</code>.</p><h2><strong>3. Deploying and Running Task-Graphs</strong></h2><p>We are almost done. To execute a task graph, we need to instantiate an execution plan. The execution plan, receives, as an argument, a snapshot of an existing task graph.</p><h4><strong>Wait, a snapshot? what is this?</strong></h4><p>A snapshot is an object that contains an immutable task graph, which in turn, is a task graph that cannot be changed (e.g., add new tasks, or add new data).</p><p>This is by design to avoid changing the task graph (meaning appending more tasks or adding more data) while we execute code on the GPU.</p><p>Let&#8217;s go back to our example and create an execution plan from the <code>graph</code> object:</p><pre><code>TornadoExecutionPlan plan = new TornadoExecutionPlan<strong>(</strong>graph.snapshot<strong>())</strong>;</code></pre><p>And now, we can call the execute method:</p><pre><code>plan.execute();</code></pre><p>Done! If we do not specify anything else, the execute method in a blocking call, and it will optimise, compile and run the whole task graph on the default device.</p><p>For reference, this is the entire code of our example:</p><pre><code>public class HelloTornado { 
    public static void init(FloatArray array) {
        for (@Parallel int i = 0; i &lt; data.getSize(); i++) {
            array.set(i, i * 2);
        }
    }
    public static void computeSqrt(FloatArray array) {
        for (@Parallel int i = 0; i &lt; data.getSize(); i++) {
            float value = array.get(i);
            array.set(i, TornadoMath.sqrt(value));   
        }
    }
    public FloatArray compute(FloatArray array) {
        TaskGraph graph = new TaskGraph(&#8221;graph&#8221;)  
            .transferToDevice(DataTransferMode.EVERY_EXECUTION, array)
            .task(&#8221;init&#8221;, HelloTornado::init, array)
            .task(&#8221;compute&#8221;, HelloTornado::computeSqrt, array)
            .transferToHost(DataTransferMode.EVERY_EXECUTION, array);
        TornadoExecutionPlan plan = new TornadoExecutionPlan(graph.snapshot());
        plan.execute())
        return array;
    }
}</code></pre><h3><strong>Interacting with the Dispatcher</strong></h3><p>We can also change the default decisions of the TornadoVM runtime, and perform some actions (e.g., enable the profiler, change the hardware accelerator, enable dynamic reconfiguration, etc).</p><p>The TornadoVM Execution Plan follows a builder pattern to specify all these actions.</p><p>For example, to change a device:</p><pre><code>int driverIndex = 0;
int deviceIndex = 1;
TornadoDevice device = TornadoExecutionPlan.getDevice(driverIndex, deviceIndex);
plan.withDevice(device)
    .execute();</code></pre><p>And we can execute again, without the need to build a new task-graph.</p><p><em><strong>Update from TornadoVM (2025):</strong></em></p><p><em>Since publication, the TornadoVM Execution Plan has been extended with further experimental features. One of these features is Dynamic Reconfiguration, which was available in TornadoVM till version 1.1.1 and has since been deprecated in newer versions.</em></p><p>If we want to enable dynamic reconfiguration (a feature of TornadoVM to discover the best device depending on a policy), we can enable it as follows:</p><pre><code>plan.withDynamicReconfiguration(Policy.PERFORMANCE, DRMode.PARALLEL)
    .execute();</code></pre><p>In this call, we specify that we want to select the best device in terms of performance, and the TornadoVM should evaluate all permutations in parallel.</p><p>What this API call will trigger, is to compile and run for all hardware accelerators available in our system, and choose the best device that follows the policy we specified.</p><p>Cool, isn&#8217;t it? If you want to know more about dynamic reconfiguration, <a href="https://jjfumero.github.io/files/VEE2019_Fumero_Preprint.pdf">this paper</a> contains more details.</p><p>There are more methods in the <code>TornadoExecutionPlan</code> class. We covered just two of them. If you are interested, I invite you to read the documentation and the examples. Additionally, I recorded a video showing, step by step, some of these functions in action.</p><div id="youtube2-R3gwI0qijGk" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;R3gwI0qijGk&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/R3gwI0qijGk?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><strong>Summary</strong></h2><p>In this article, we have explained the basics of the TornadoVM programming model and the main API blocks.</p><p>With these tools, developers can start integrating these components into their applications and start accelerating portions of the Java programs on hardware accelerators, such as GPUs.</p><p>If you want to know more, I invite you to explore the <a href="https://github.com/beehive-lab/TornadoVM/tree/master/tornado-examples/src/main/java/uk/ac/manchester/tornado/examples">example suite</a> in TornadoVM to get an idea of the types of applications that can be expressed using the TornadoVM API with more complex <a href="https://tornadovm.readthedocs.io/en/latest/resources.html#demos-artefacts">use cases</a>.</p><div><hr></div><p><em>Originally published at <a href="https://foojay.io/today/think-in-graphs-not-just-chains-jgraphlet-for-taskpipelines/">Foojay.io</a> on May 2024.</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; but as promised, I will start with something more connected.</p><h3><a href="https://foojay.io/today/foojay-podcast-82/">Foojay Podcast #82 &#8211; Leyden, Babylon, Panama, TornadoVM</a></h3><div id="youtube2-Srxy_ukw3-k" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;Srxy_ukw3-k&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/Srxy_ukw3-k?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>As I mentioned earlier, the reason for republishing that slightly older piece is that <a href="https://www.linkedin.com/in/frankdelporte/">Frank Delporte</a> recently ran a whole series of interviews on a very juicy topic: the latest developments around the JDK.</p><p><a href="https://www.youtube.com/watch?v=Srxy_ukw3-k">This episode</a> is a neat &#8220;hallway track tour&#8221; across Devoxx and J-Fall: <a href="https://www.linkedin.com/in/moritz-halbritter-9301a1b1/">Moritz Halbritter</a> explains how <strong>Project Leyden</strong> improves Java startup (and how you can already feel it today in Spring Boot), <a href="https://www.linkedin.com/in/john-ceccarelli-95b7041/">John Ceccarelli</a> from <a href="https://www.linkedin.com/company/azul-systems/posts/?feedView=all">Azul</a> adds the story of moving from x86 to ARM/Graviton plus general JVM performance tricks, <a href="https://www.linkedin.com/in/balkrishnarawool/">Balkrishna Rawool</a> shows why the Vector API from Panama landed perfectly in the AI space - even though it launched <em>before</em> the LLM boom - and the TornadoVM crew (<a href="https://www.linkedin.com/in/kotselidis/">Christos Kotselidis</a> and <a href="https://www.linkedin.com/in/michalis-papadimitriou/">Michalis Papadimitriou</a>) explain how to run large models on GPUs without leaving pure Java, and how this all ties into <strong>Project Babylon</strong>.</p><p>Highly recommended podcast - and that&#8217;s only the beginning of the goodies.</p><div><hr></div><h3><a href="https://foojay.io/today/will-openjfx-be-merged-into-openjdk-it-would-be-a-perfect-match-with-java-on-mobile/">Will OpenJFX Be Merged Into OpenJDK? It Would Be a Perfect Match with Java on Mobile!</a></h3><p>Another interesting article from Frank &#8211; with a gloriously long title &#8211; <a href="https://foojay.io/today/will-openjfx-be-merged-into-openjdk-it-would-be-a-perfect-match-with-java-on-mobile/">Will OpenJFX Be Merged Into OpenJDK? It Would Be a Perfect Match with Java on Mobile!</a> recaps why JavaFX left the JDK in the first place (bloat, independent release cycle, distribution issues), and then shows that in 2025, after several Java evolutions, those reasons are much weaker &#8211; while the potential upside of bringing it back into OpenJDK is much bigger.</p><p>The key point: in parallel, Johan Vos and Gluon are pushing hard on the &#8220;Java on Mobile&#8221; initiative &#8211; instead of maintaining a patched toolchain, they&#8217;re building OpenJDK natively for mobile, with a pipeline that already runs Hello World on iOS, and a roadmap that includes the iOS Simulator, Android, Leyden-based optimizations, and full-blown JavaFX apps as native mobile apps. From the authors&#8217; perspective, if JavaFX returns to OpenJDK and OpenJDK becomes a first-class citizen on mobile, we finally get an honest &#8220;write once, run everywhere&#8221;: the same JavaFX code on desktop, mobile, and embedded, without sidecar toolchains &#8211; which is a pretty compelling vision, even if in the age of Kotlin Multiplatform it might feel a bit&#8230; optimistic.</p><div><hr></div><h3><a href="https://foojay.io/today/the-visitor-pattern-revisited-using-data-oriented-programming-techniques/">Visitor Pattern &#8220;done right&#8221; &#8211; use the language, not the pattern</a></h3><p><a href="https://foojay.io/today/the-visitor-pattern-revisited-using-data-oriented-programming-techniques/">The Visitor Pattern &#8211; &#8216;Revisited&#8217; using Data Oriented Programming technique</a> by <a href="https://www.linkedin.com/in/wim-de-troyer-40647b130/">Wim De Troyer</a> reminds us that many classic patterns (like Strategy) existed mostly because the language didn&#8217;t have better tools - and shows how Java 8 lambdas pretty much dissolved Strategy into normal code.</p><p>The author takes the Visitor pattern for a spin using a book curation system: the classic implementation with a type hierarchy, visitors, <code>accept</code> methods, and several levels of intermediate classes. To defuse that complexity, the whole thing is rewritten using Java 21 idioms: records, sealed interfaces as sum types, and beefed-up pattern matching in <code>switch</code>. </p><p>The result? The Visitor &#8220;disappears&#8221; - what&#8217;s left is a clean data model plus one well-designed switch, which the compiler checks for exhaustiveness. On the meta level, it&#8217;s a great example to show your team when it&#8217;s no longer worth torturing GoF patterns and instead remap them to the modern 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_!KwYI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff215ef0a-f6d8-4f0e-b18c-41e1f924d2a5_736x924.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KwYI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff215ef0a-f6d8-4f0e-b18c-41e1f924d2a5_736x924.jpeg 424w, https://substackcdn.com/image/fetch/$s_!KwYI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff215ef0a-f6d8-4f0e-b18c-41e1f924d2a5_736x924.jpeg 848w, https://substackcdn.com/image/fetch/$s_!KwYI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff215ef0a-f6d8-4f0e-b18c-41e1f924d2a5_736x924.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!KwYI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff215ef0a-f6d8-4f0e-b18c-41e1f924d2a5_736x924.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KwYI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff215ef0a-f6d8-4f0e-b18c-41e1f924d2a5_736x924.jpeg" width="736" height="924" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f215ef0a-f6d8-4f0e-b18c-41e1f924d2a5_736x924.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:924,&quot;width&quot;:736,&quot;resizeWidth&quot;:0,&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_!KwYI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff215ef0a-f6d8-4f0e-b18c-41e1f924d2a5_736x924.jpeg 424w, https://substackcdn.com/image/fetch/$s_!KwYI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff215ef0a-f6d8-4f0e-b18c-41e1f924d2a5_736x924.jpeg 848w, https://substackcdn.com/image/fetch/$s_!KwYI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff215ef0a-f6d8-4f0e-b18c-41e1f924d2a5_736x924.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!KwYI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff215ef0a-f6d8-4f0e-b18c-41e1f924d2a5_736x924.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">There is nothing wrong per se in Design Patterns, but sometimes they are giving Java a bad raps.</figcaption></figure></div><div><hr></div><h3><a href="https://foojay.io/today/navigating-the-nuances-of-graphrag-vs-rag/">GraphRAG vs RAG &#8211; when vectors are not enough</a></h3><p><a href="https://foojay.io/today/navigating-the-nuances-of-graphrag-vs-rag/">GraphRAG vs RAG &#8211; when vectors are not enough</a> by <a href="https://foojay.io/today/author/thibaut-gourdel/">Thibaut Gourdel</a> does a nice job of cleaning up the vocabulary: classic RAG is a vector knowledge base &#8211; we chunk documents, build embeddings, and then look for semantically similar pieces to the prompt. This works great when the task is &#8220;find me the right fragment of docs,&#8221; but starts to fall apart when the question needs multi-hop reasoning, traversing relationships between entities, or understanding the structure of a large document rather than isolated paragraphs.</p><p>GraphRAG adds a knowledge graph to the mix - explicitly modeled entities and relations - and uses the LLM to walk the graph, not just the vectors. That gives better accuracy (benchmarks like Lettra show up to +35% for complex queries) and more explainability (you can see the path in the graph), but comes at a cost: you need to build and maintain the graph (with help from frontier LLMs), handle traversal complexity, latency, and operational overhead.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8Kt3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feee78100-18a2-4e99-ba42-53fd595d3ddb_640x635.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8Kt3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feee78100-18a2-4e99-ba42-53fd595d3ddb_640x635.jpeg 424w, https://substackcdn.com/image/fetch/$s_!8Kt3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feee78100-18a2-4e99-ba42-53fd595d3ddb_640x635.jpeg 848w, https://substackcdn.com/image/fetch/$s_!8Kt3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feee78100-18a2-4e99-ba42-53fd595d3ddb_640x635.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!8Kt3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feee78100-18a2-4e99-ba42-53fd595d3ddb_640x635.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8Kt3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feee78100-18a2-4e99-ba42-53fd595d3ddb_640x635.jpeg" width="640" height="635" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/eee78100-18a2-4e99-ba42-53fd595d3ddb_640x635.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:635,&quot;width&quot;:640,&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_!8Kt3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feee78100-18a2-4e99-ba42-53fd595d3ddb_640x635.jpeg 424w, https://substackcdn.com/image/fetch/$s_!8Kt3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feee78100-18a2-4e99-ba42-53fd595d3ddb_640x635.jpeg 848w, https://substackcdn.com/image/fetch/$s_!8Kt3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feee78100-18a2-4e99-ba42-53fd595d3ddb_640x635.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!8Kt3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feee78100-18a2-4e99-ba42-53fd595d3ddb_640x635.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">That&#8217;s the reason, why your AI demo do not work on production that goos as expected.</figcaption></figure></div><p>So the author pushes hybrid setups: vectors for &#8220;fast recall,&#8221; graph for reasoning, ideally in a single platform like MongoDB Atlas that is document, vector, and graph at the same time. From the perspective of agent architecture and compliance, it&#8217;s a great piece to explain when &#8220;we dumped PDFs into vectors&#8221; stops being enough &#8211; and when you need to move toward explicit domain modeling.</p><div><hr></div><h3><a href="https://www.youtube.com/watch?v=qw-x3_pZ0wI">Foojay Podcast #83 &#8211; OpenJDK evolutions and tricks from the trenches</a></h3><div id="youtube2-qw-x3_pZ0wI" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;qw-x3_pZ0wI&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/qw-x3_pZ0wI?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>We started with a podcast, and unusually, we&#8217;ll end with one too = Frank really went all-in this time, and the two episodes form a nicely coherent combo.</p><p><a href="https://www.youtube.com/watch?v=qw-x3_pZ0wI">The second podcast</a> again uses the &#8220;many mini-stories&#8221; format: <a href="https://www.linkedin.com/in/johanvos/">Johan Vos</a> talks about the history of Java on Linux and how you can both preserve language/runtime stability <em>and</em> keep pushing the &#8220;write once, run everywhere&#8221; vision forward (yes, JavaFX on mobile and the openjdk-mobile initiative pop up again). <a href="https://www.linkedin.com/in/steveonjava/">Stephen Chin</a> adds the perspective of modern JavaFX clients and education (including his daughter&#8217;s book on teaching kids to code), while Joseph Phillips revisits the REST vs gRPC debate and asks bluntly: with virtual threads around, do async APIs really make sense <em>everywhere</em>?</p><p>Then <a href="https://www.linkedin.com/in/fran%C3%A7oismartin/">Fran&#231;ois Martin</a> covers microbenchmarks in JMH, <a href="https://www.linkedin.com/in/wadegeus/">Wouter De Geus</a> shares his journey from finance into dev and open-sourcing code (from inside the Dutch tax office!), and <a href="https://www.linkedin.com/in/roaldnefs/">Roald Nefs</a> shows how to actually use the <strong>Foreign Function &amp; Memory API</strong> to &#8220;hack&#8221; cars - and what kind of security implications that brings.</p><p>All in all, it&#8217;s a ready-made bundle of anecdotes and &#8220;Java in the real world&#8221; examples - straight from the conference hallway track.</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_!BZZB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc978565f-651c-4ed4-b943-69b946504a5e_2528x1696.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BZZB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc978565f-651c-4ed4-b943-69b946504a5e_2528x1696.png 424w, https://substackcdn.com/image/fetch/$s_!BZZB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc978565f-651c-4ed4-b943-69b946504a5e_2528x1696.png 848w, https://substackcdn.com/image/fetch/$s_!BZZB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc978565f-651c-4ed4-b943-69b946504a5e_2528x1696.png 1272w, https://substackcdn.com/image/fetch/$s_!BZZB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc978565f-651c-4ed4-b943-69b946504a5e_2528x1696.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BZZB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc978565f-651c-4ed4-b943-69b946504a5e_2528x1696.png" width="1456" height="977" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c978565f-651c-4ed4-b943-69b946504a5e_2528x1696.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:977,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:7825595,&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/180187675?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc978565f-651c-4ed4-b943-69b946504a5e_2528x1696.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_!BZZB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc978565f-651c-4ed4-b943-69b946504a5e_2528x1696.png 424w, https://substackcdn.com/image/fetch/$s_!BZZB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc978565f-651c-4ed4-b943-69b946504a5e_2528x1696.png 848w, https://substackcdn.com/image/fetch/$s_!BZZB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc978565f-651c-4ed4-b943-69b946504a5e_2528x1696.png 1272w, https://substackcdn.com/image/fetch/$s_!BZZB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc978565f-651c-4ed4-b943-69b946504a5e_2528x1696.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[November: The Rest of the Story - JVM Weekly vol. 154]]></title><description><![CDATA[I&#8217;ve gathered many interesting links in November 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/november-the-rest-of-the-story-jvm</link><guid isPermaLink="false">https://www.jvm-weekly.com/p/november-the-rest-of-the-story-jvm</guid><dc:creator><![CDATA[Artur Skowronski]]></dc:creator><pubDate>Thu, 27 Nov 2025 14:02:43 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GTtk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F130b0e49-72b9-45e2-8b62-848355ca8bdf_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_!GTtk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F130b0e49-72b9-45e2-8b62-848355ca8bdf_1456x1048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GTtk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F130b0e49-72b9-45e2-8b62-848355ca8bdf_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!GTtk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F130b0e49-72b9-45e2-8b62-848355ca8bdf_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!GTtk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F130b0e49-72b9-45e2-8b62-848355ca8bdf_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!GTtk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F130b0e49-72b9-45e2-8b62-848355ca8bdf_1456x1048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GTtk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F130b0e49-72b9-45e2-8b62-848355ca8bdf_1456x1048.png" width="1456" height="1048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/130b0e49-72b9-45e2-8b62-848355ca8bdf_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;:2150845,&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/180094252?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F130b0e49-72b9-45e2-8b62-848355ca8bdf_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_!GTtk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F130b0e49-72b9-45e2-8b62-848355ca8bdf_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!GTtk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F130b0e49-72b9-45e2-8b62-848355ca8bdf_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!GTtk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F130b0e49-72b9-45e2-8b62-848355ca8bdf_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!GTtk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F130b0e49-72b9-45e2-8b62-848355ca8bdf_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 week ago I wrote that &#8220;Spring has come&#8221;, and now it&#8217;s snowing in Poland...</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><strong>1. Missed in November</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_!AlB9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc0e3578-79c3-410e-80aa-10999c637d41_845x562.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AlB9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc0e3578-79c3-410e-80aa-10999c637d41_845x562.png 424w, https://substackcdn.com/image/fetch/$s_!AlB9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc0e3578-79c3-410e-80aa-10999c637d41_845x562.png 848w, https://substackcdn.com/image/fetch/$s_!AlB9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc0e3578-79c3-410e-80aa-10999c637d41_845x562.png 1272w, https://substackcdn.com/image/fetch/$s_!AlB9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc0e3578-79c3-410e-80aa-10999c637d41_845x562.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AlB9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc0e3578-79c3-410e-80aa-10999c637d41_845x562.png" width="845" height="562" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cc0e3578-79c3-410e-80aa-10999c637d41_845x562.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:562,&quot;width&quot;:845,&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_!AlB9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc0e3578-79c3-410e-80aa-10999c637d41_845x562.png 424w, https://substackcdn.com/image/fetch/$s_!AlB9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc0e3578-79c3-410e-80aa-10999c637d41_845x562.png 848w, https://substackcdn.com/image/fetch/$s_!AlB9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc0e3578-79c3-410e-80aa-10999c637d41_845x562.png 1272w, https://substackcdn.com/image/fetch/$s_!AlB9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc0e3578-79c3-410e-80aa-10999c637d41_845x562.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>But let&#8217;s actually start with some Spring-related topics.</p><p>The article <strong><a href="https://spring.io/blog/2025/11/12/null-safe-applications-with-spring-boot-4">Null-safe applications with Spring Boot 4</a></strong> by <strong><a href="https://www.linkedin.com/article/edit/7399390725668245505/#">S&#233;bastien Deleuze</a></strong> brings good news: with the arrival of Spring Boot 4 (and Spring Framework 7), most of the Spring portfolio has gained full support for <em>null-safety</em>. This means that key APIs have been explicitly annotated with JSpecify, which allows developer tools (such as IntelliJ IDEA or Eclipse) and the Kotlin compiler to precisely detect potential NullPointerException (NPE) issues. These changes are backwards compatible for Java, but drastically improve code safety, so if you want to learn more details (and certainly if you use Spring), it&#8217;s really worth a read.</p><div><hr></div><p>Staying with the most popular framework, the post <strong><a href="https://spring.io/blog/2025/11/18/opentelemetry-with-spring-boot/">OpenTelemetry with Spring Boot</a></strong> by <strong><a href="https://www.linkedin.com/article/edit/7399390725668245505/#">Moritz Halbritter</a></strong> is a guide to the native integration of OpenTelemetry in the Spring Boot 4 ecosystem. The authors explain how the latest version of the framework moves away from the need to use a heavy Java Agent in favor of built-in instrumentation based on Micrometer Tracing. Thanks to this, applications can now &#8220;out of the box&#8221; generate and propagate traces, metrics and logs in an OTel-compliant format, while retaining better performance and control over the code.</p><div><hr></div><p>In the article <strong><a href="https://spring.io/blog/2025/10/28/modularizing-spring-boot">Modularizing Spring Boot</a></strong>, the Spring Boot team describes a fundamental architectural change in version 4.0: splitting the monolithic spring-boot-autoconfigure.jar file (which had grown to 2 MiB) into smaller, more focused modules. The goal is not only to reduce artifact size and the application memory footprint, but above all to improve IDE &#8220;hygiene&#8221; &#8211; developers will no longer be bombarded with code completion suggestions for technologies they&#8217;re not using (e.g. Reactive Web classes in a pure MVC project).</p><p>Each supported technology (e.g. Flyway or Spring Security) now gets its own dedicated starter, which pulls in only the configuration modules it actually needs. What&#8217;s more, analogous test starters have been introduced for each module, making it easier to configure your test environment.</p><p>For teams worried about a painful migration, Classic Starter POMs are preserved. They emulate the old behavior by pulling in all modules at once, allowing for a gradual transition to the new, leaner architecture.</p><div><hr></div><p>As you can see, there&#8217;s a lot going on - so to round off the Spring section, I&#8217;ve got a migration guide for you.</p><p>The article <strong><a href="https://www.moderne.ai/blog/spring-boot-4x-migration-guide">Spring Boot 4.x Migration Guide</a></strong> from <strong><a href="https://www.linkedin.com/article/edit/7399390725668245505/#">Moderne</a></strong> shows that moving to Spring Boot 4 is much more than just bumping a version number. It comes with fundamental ecosystem changes: Java 17 as a minimum (with Java 25 recommended), full adoption of Jakarta EE 11, and integration with Spring Framework 7. The authors highlight the removal of as much as 88% of deprecated classes (including MockBean and SpyBean), the introduction of Jackson 3.x with its breaking changes, and the need to adapt your code to the new (and cool!) null-safety standards.</p><p>The main goal of the piece, however, is to show how to <em>automate</em> this process using OpenRewrite. Moderne has prepared ready-made &#8220;recipes&#8221; that can automatically update dependencies, replace removed APIs, and even perform complex code refactorings (e.g. switching to modular starters or adding JSpecify annotations). Thanks to this, a migration that could take weeks manually becomes a predictable and scalable process, one that can be rolled out across an entire organization.</p><p>As always, I highly recommend trying out <strong><a href="https://docs.openrewrite.org/">OpenRewrite</a></strong> &#8211; it&#8217;s a neat piece of software.</p><div><hr></div><p>And since we&#8217;ve wrapped up the Spring topic&#8230; for once I&#8217;ve got something for Android fans.</p><p>Google has introduced <strong><a href="https://android-developers.googleblog.com/2025/10/introducing-cahier-new-android-github.html">Cahier</a></strong> - a new open-source sample app meant to serve as a reference for developers building productivity and creativity tools for large screens (tablets and foldables). The name comes from the French word for &#8220;notebook&#8221;, which perfectly captures the app&#8217;s purpose: combining text, drawings (using the low-latency Ink API) and images into cohesive notes.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!h_Qb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7c0bd5d-d37b-4d98-8e29-d7e63e7b369d_640x400.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!h_Qb!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7c0bd5d-d37b-4d98-8e29-d7e63e7b369d_640x400.gif 424w, https://substackcdn.com/image/fetch/$s_!h_Qb!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7c0bd5d-d37b-4d98-8e29-d7e63e7b369d_640x400.gif 848w, https://substackcdn.com/image/fetch/$s_!h_Qb!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7c0bd5d-d37b-4d98-8e29-d7e63e7b369d_640x400.gif 1272w, https://substackcdn.com/image/fetch/$s_!h_Qb!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7c0bd5d-d37b-4d98-8e29-d7e63e7b369d_640x400.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!h_Qb!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7c0bd5d-d37b-4d98-8e29-d7e63e7b369d_640x400.gif" width="640" height="400" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a7c0bd5d-d37b-4d98-8e29-d7e63e7b369d_640x400.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:400,&quot;width&quot;:640,&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_!h_Qb!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7c0bd5d-d37b-4d98-8e29-d7e63e7b369d_640x400.gif 424w, https://substackcdn.com/image/fetch/$s_!h_Qb!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7c0bd5d-d37b-4d98-8e29-d7e63e7b369d_640x400.gif 848w, https://substackcdn.com/image/fetch/$s_!h_Qb!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7c0bd5d-d37b-4d98-8e29-d7e63e7b369d_640x400.gif 1272w, https://substackcdn.com/image/fetch/$s_!h_Qb!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7c0bd5d-d37b-4d98-8e29-d7e63e7b369d_640x400.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>Cahier demonstrates a modern offline-first architecture based on Room, as well as the use of Material 3 Adaptive libraries to create UIs that smoothly adapt to different device form factors.</p><div><hr></div><p>Now for something more lighthearted - <strong><a href="https://duke.mccue.dev/">Java Mascot Generator</a></strong> by <strong><a href="https://www.linkedin.com/article/edit/7399390725668245505/#">Ethan M.</a></strong> is a fun, lightweight web tool that lets you generate random, unique variations of Duke &#8211; Java&#8217;s iconic mascot.</p><p>Here&#8217;s mine.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!maYs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f2a8d77-1f49-4f09-ab22-a8b20760b09d_1034x982.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!maYs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f2a8d77-1f49-4f09-ab22-a8b20760b09d_1034x982.png 424w, https://substackcdn.com/image/fetch/$s_!maYs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f2a8d77-1f49-4f09-ab22-a8b20760b09d_1034x982.png 848w, https://substackcdn.com/image/fetch/$s_!maYs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f2a8d77-1f49-4f09-ab22-a8b20760b09d_1034x982.png 1272w, https://substackcdn.com/image/fetch/$s_!maYs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f2a8d77-1f49-4f09-ab22-a8b20760b09d_1034x982.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!maYs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f2a8d77-1f49-4f09-ab22-a8b20760b09d_1034x982.png" width="1034" height="982" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0f2a8d77-1f49-4f09-ab22-a8b20760b09d_1034x982.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:982,&quot;width&quot;:1034,&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_!maYs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f2a8d77-1f49-4f09-ab22-a8b20760b09d_1034x982.png 424w, https://substackcdn.com/image/fetch/$s_!maYs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f2a8d77-1f49-4f09-ab22-a8b20760b09d_1034x982.png 848w, https://substackcdn.com/image/fetch/$s_!maYs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f2a8d77-1f49-4f09-ab22-a8b20760b09d_1034x982.png 1272w, https://substackcdn.com/image/fetch/$s_!maYs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f2a8d77-1f49-4f09-ab22-a8b20760b09d_1034x982.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 app runs directly in the browser thanks to <strong><a href="https://cheerpj.com/">CheerpJ</a></strong>, which makes it possible to run classic Java code in a WebAssembly environment without installing any extra plugins.</p><p>The whole thing is built around a simple interface where a random seed is used to generate a new version of the mascot. Although it&#8217;s an unofficial project, it&#8217;s a great demo of how to bring older UI technologies into the browser, and at the same time it lets every developer &#8220;grow&#8221; their own unique Duke.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Tu9Y!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28cf1a28-e244-4f59-ad41-fc18ea9f384e_511x497.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Tu9Y!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28cf1a28-e244-4f59-ad41-fc18ea9f384e_511x497.png 424w, https://substackcdn.com/image/fetch/$s_!Tu9Y!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28cf1a28-e244-4f59-ad41-fc18ea9f384e_511x497.png 848w, https://substackcdn.com/image/fetch/$s_!Tu9Y!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28cf1a28-e244-4f59-ad41-fc18ea9f384e_511x497.png 1272w, https://substackcdn.com/image/fetch/$s_!Tu9Y!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28cf1a28-e244-4f59-ad41-fc18ea9f384e_511x497.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Tu9Y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28cf1a28-e244-4f59-ad41-fc18ea9f384e_511x497.png" width="511" height="497" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/28cf1a28-e244-4f59-ad41-fc18ea9f384e_511x497.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:497,&quot;width&quot;:511,&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_!Tu9Y!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28cf1a28-e244-4f59-ad41-fc18ea9f384e_511x497.png 424w, https://substackcdn.com/image/fetch/$s_!Tu9Y!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28cf1a28-e244-4f59-ad41-fc18ea9f384e_511x497.png 848w, https://substackcdn.com/image/fetch/$s_!Tu9Y!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28cf1a28-e244-4f59-ad41-fc18ea9f384e_511x497.png 1272w, https://substackcdn.com/image/fetch/$s_!Tu9Y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28cf1a28-e244-4f59-ad41-fc18ea9f384e_511x497.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>Awesome J2ME by <strong><a href="https://github.com/hstsethi">Harsh Sethi</a></strong> is not so much a repository as a sentimental journey back to the era of flip phones and games distributed as .jar files. The author has prepared a curated list of emulators, developer tools, documentation and software collections dedicated to the Java 2 Micro Edition (J2ME) platform. You&#8217;ll find everything you need to run classic mobile titles on modern systems.</p><p>The <strong><a href="https://news.ycombinator.com/item?id=45991497">discussion on Hacker News</a></strong> proves that J2ME still sparks strong emotions. Users swap memories of cult games (like <em>Doom RPG</em>) and share technical tidbits about the hardware fragmentation of that time. It&#8217;s a great resource for digital archivists and retro-gaming fans who want to see what Java in your pocket looked like before the smartphone era.</p><p>PS: It genuinely warmed my heart. If you&#8217;re from Poland (though YouTube will probably happily generate UI dubbing for you), I&#8217;ve got a great video for you about classic mobile games. And personally, I always liked Gameloft titles.</p><div id="youtube2-1PVaMJ_JHDg" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;1PVaMJ_JHDg&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/1PVaMJ_JHDg?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>Deal with this, Candy Crash.</p><div><hr></div><p>Staying in the mobile world, just a bit more modern this time, the article <strong><a href="https://www.infoq.com/news/2025/11/java-on-ios/">Java on iOS</a></strong> by Ben Evans discusses the latest advances in running Java applications on iOS, made possible thanks to full integration of Java 25 with GraalVM Native Image technology. The new solutions allow for direct AOT compilation of Java code to native machine code, eliminating long-standing performance issues and Apple&#8217;s restrictions on JIT compilation on mobile devices.</p><p>Ben highlights the growing role of frameworks like Gluon, which leverage these improvements to enable developers to build high-performance, cross-platform user interfaces in pure Java. As a result, porting modern backend and desktop applications to iPhones and iPads is becoming feasible, opening the Java ecosystem to the mobile market in a way that was previously reserved mainly for fully native solutions.</p><div><hr></div><p>The article <strong><a href="https://substack.com/inbox/post/177347562">First Look at Java Valhalla: Flattening and Memory Alignment of Value Objects</a></strong> by Joe Mwangi is a nice analysis of the latest Valhalla build (JEP 401), focusing on the memory &#8220;flattening&#8221; mechanism for Value Class objects. The author ran an experiment comparing an array of classic objects with an array of the new Value Objects. The results show that by giving up object identity, the JVM can store data directly in the array, rather than as references on the heap. In a test with 10 million records, memory usage dropped from ~309 MB to ~138 MB, which drastically improves cache locality and eliminates the overhead of object headers.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KCYX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc25185e7-94b8-46ec-bcf4-2ec12170f264_1386x774.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KCYX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc25185e7-94b8-46ec-bcf4-2ec12170f264_1386x774.png 424w, https://substackcdn.com/image/fetch/$s_!KCYX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc25185e7-94b8-46ec-bcf4-2ec12170f264_1386x774.png 848w, https://substackcdn.com/image/fetch/$s_!KCYX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc25185e7-94b8-46ec-bcf4-2ec12170f264_1386x774.png 1272w, https://substackcdn.com/image/fetch/$s_!KCYX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc25185e7-94b8-46ec-bcf4-2ec12170f264_1386x774.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KCYX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc25185e7-94b8-46ec-bcf4-2ec12170f264_1386x774.png" width="1386" height="774" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c25185e7-94b8-46ec-bcf4-2ec12170f264_1386x774.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:774,&quot;width&quot;:1386,&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_!KCYX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc25185e7-94b8-46ec-bcf4-2ec12170f264_1386x774.png 424w, https://substackcdn.com/image/fetch/$s_!KCYX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc25185e7-94b8-46ec-bcf4-2ec12170f264_1386x774.png 848w, https://substackcdn.com/image/fetch/$s_!KCYX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc25185e7-94b8-46ec-bcf4-2ec12170f264_1386x774.png 1272w, https://substackcdn.com/image/fetch/$s_!KCYX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc25185e7-94b8-46ec-bcf4-2ec12170f264_1386x774.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 more interesting part of the analysis, however, is memory alignment. The author noticed that an object with a size of 6 bytes takes up 8 bytes in memory. It turns out the culprit is the &#8220;null marker&#8221; &#8211; because Value Object arrays support null values by default, the JVM adds a hidden marker byte plus padding to align the structure to the atomicity boundary (typically 64 bits). You can already see this starting to conflict with Project Lilliput.</p><div><hr></div><p><strong><a href="https://www.linkedin.com/article/edit/7399390725668245505/#">Elliot Barlas</a></strong> shared an update to his tool for <strong><a href="https://openjdk.barlasgarden.com/">browsing and searching OpenJDK mailing lists</a></strong>. The site has gained indexes for additional lists (including javadoc-dev, jmh-dev, mobile-dev), bringing the total to over 400,000 email messages and 70 million phrases. The update also adds visual highlighting for records that originate from GitHub activity, as well as improved documentation, making this unofficial archive even more useful for the community.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BHif!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c3e0e29-14a1-4227-8b4b-9d840ecc092f_744x331.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BHif!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c3e0e29-14a1-4227-8b4b-9d840ecc092f_744x331.png 424w, https://substackcdn.com/image/fetch/$s_!BHif!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c3e0e29-14a1-4227-8b4b-9d840ecc092f_744x331.png 848w, https://substackcdn.com/image/fetch/$s_!BHif!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c3e0e29-14a1-4227-8b4b-9d840ecc092f_744x331.png 1272w, https://substackcdn.com/image/fetch/$s_!BHif!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c3e0e29-14a1-4227-8b4b-9d840ecc092f_744x331.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BHif!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c3e0e29-14a1-4227-8b4b-9d840ecc092f_744x331.png" width="744" height="331" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5c3e0e29-14a1-4227-8b4b-9d840ecc092f_744x331.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:331,&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_!BHif!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c3e0e29-14a1-4227-8b4b-9d840ecc092f_744x331.png 424w, https://substackcdn.com/image/fetch/$s_!BHif!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c3e0e29-14a1-4227-8b4b-9d840ecc092f_744x331.png 848w, https://substackcdn.com/image/fetch/$s_!BHif!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c3e0e29-14a1-4227-8b4b-9d840ecc092f_744x331.png 1272w, https://substackcdn.com/image/fetch/$s_!BHif!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c3e0e29-14a1-4227-8b4b-9d840ecc092f_744x331.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 tool lets you quickly find historical discussions without having to dig through raw mail archives, and I&#8217;ve already used it a few times myself when trying to track down early mentions of various projects. So thanks Elliot &#8211; you&#8217;ve definitely contributed something to this newsletter &#128583;</p><div><hr></div><p>And to finish, two talks from JetBrains.</p><p>In <strong><a href="https://www.youtube.com/watch?v=OC5u7_c3m9w">Kotlin Notebook Meets IntelliJ Platform</a></strong>, <strong><a href="https://www.linkedin.com/article/edit/7399390725668245505/#">&#129361; Jakub Chrzanowski</a></strong> at <strong><a href="https://lp.jetbrains.com/plugin-developer-conf-2025/">Plugin Dev Conf 2025</a></strong> showcases the capabilities of Kotlin Notebook &#8211; hopefully familiar to you as an interactive environment reminiscent of Jupyter Notebook, but running directly inside IntelliJ IDEA. The video shows how to create notes with embedded code, visualize results and &#8211; most interestingly &#8211; run IntelliJ Platform code directly from the notebook, without having to compile and launch a full plugin. It&#8217;s a huge convenience for plugin authors, allowing them to quickly test IDE APIs and experiment with new features in an isolated, safe REPL environment.</p><p>The second talk is <strong><a href="https://www.youtube.com/watch?v=acKL4XkaG2A">Learning Modern Java the playful way</a></strong> by <strong><a href="https://www.linkedin.com/article/edit/7399390725668245505/#">&#128105;&#127995;&#128187; Marit van Dijk</a></strong> &amp; <strong><a href="https://www.linkedin.com/article/edit/7399390725668245505/#">&#129404;Piotr Przyby&#322;</a></strong> , who address the problem of &#8220;decision paralysis&#8221; that can hit developers moving from older Java versions (e.g. Java 8) to modern releases. Instead of dry theory, the speakers focus on &#8220;play&#8221; and a practical approach to learning new features such as Structured Concurrency and Pattern Matching.</p><p>The session focuses on how to use a modern IDE to discover these features organically while writing code - and on top of that, it&#8217;s freaking hilarious. Highly recommended &#128513;</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_!gzqg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2303acb-290c-4e54-8cc7-13ed3542089f_862x574.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gzqg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2303acb-290c-4e54-8cc7-13ed3542089f_862x574.png 424w, https://substackcdn.com/image/fetch/$s_!gzqg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2303acb-290c-4e54-8cc7-13ed3542089f_862x574.png 848w, https://substackcdn.com/image/fetch/$s_!gzqg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2303acb-290c-4e54-8cc7-13ed3542089f_862x574.png 1272w, https://substackcdn.com/image/fetch/$s_!gzqg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2303acb-290c-4e54-8cc7-13ed3542089f_862x574.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gzqg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2303acb-290c-4e54-8cc7-13ed3542089f_862x574.png" width="862" height="574" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c2303acb-290c-4e54-8cc7-13ed3542089f_862x574.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:574,&quot;width&quot;:862,&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_!gzqg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2303acb-290c-4e54-8cc7-13ed3542089f_862x574.png 424w, https://substackcdn.com/image/fetch/$s_!gzqg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2303acb-290c-4e54-8cc7-13ed3542089f_862x574.png 848w, https://substackcdn.com/image/fetch/$s_!gzqg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2303acb-290c-4e54-8cc7-13ed3542089f_862x574.png 1272w, https://substackcdn.com/image/fetch/$s_!gzqg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2303acb-290c-4e54-8cc7-13ed3542089f_862x574.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>Spring Modulith 2.0 GA</strong></h3><p>Lots of Spring today&#8230; but what can I do when the whole ecosystem is modernizing at once &#129335;.</p><p>With the dawn of the Spring Boot 4 era, <strong><a href="https://spring.io/blog/2025/11/21/spring-modulith-2-0-ga-1-4-5-and-1-3-11-released">Spring Modulith has reached version 2.0</a></strong>. The main changes include adapting to the new bean lifecycle in Spring Framework 7 and native support for <strong>JSpecify</strong>, which enables better null-safety verification inside application modules. This release also introduces the &#8220;Module Canvas&#8221; &#8211; an interactive tool for visualizing dependencies between domains, generated directly from your code.</p><p>The update also puts a strong emphasis on event handling. Spring Modulith 2.0 automates the &#8220;event externalization&#8221; process with even greater precision, now natively supporting newer versions of brokers such as Kafka 4.0 and RabbitMQ. Thanks to this, developers can focus on the business logic inside a module, knowing that asynchronous communication with the rest of the system (or other microservices, if you later extract them) is safe, transactional, and aligned with the agreed architectural rules.</p><h3><strong>jMolecules 2.0</strong></h3><p>Staying with architecture: <strong><a href="https://odrotbohm.de/2025/11/jmolecules-2.0-stereotypical/">jMolecules 2.0</a></strong> is another step toward &#8220;architecture visible in code.&#8221; The library provides annotations and models that let you express DDD concepts (like @Entity, @Repository, @AggregateRoot) and other architectural stereotypes directly in code, not just in diagrams. The new release cleans up the package structure, better separating the stereotypes themselves from their implementations (for example, the ByteBuddy-based one), and also strengthens support for the just-mentioned Spring Modulith.</p><p>PS: Oliver Drotbohm is the author and main creator of both jMolecules and Spring Modulith, which is why the two projects complement each other so well. jMolecules provides the DDD semantics (aggregates, entities, events), and Spring Modulith uses that semantics to build and enforce modular architecture in Spring applications.</p><h3><strong>Quarkus 3.30</strong></h3><p><strong><a href="https://quarkus.io/blog/quarkus-3-30-released/">Quarkus 3.30</a></strong> is a classic &#8220;small but mighty&#8221; release &#8211; short changelog, but all very practical building blocks for everyday backend work.</p><p>You get <em>@JsonView</em> support on the REST Client side (until now it was server-only), so you can use a single set of views to control what you send to and receive from external services, instead of gluing together separate DTOs for every case. On top of that, Hibernate Validator is bumped to 9.1 with solid performance improvements, and there&#8217;s a new <em>config decrypt</em> CLI command that decrypts secrets previously encrypted with <em>quarkus config encrypt </em>- finally a clean, official secret-management flow for configuration, without custom scripts.</p><h3><strong>MongoDB Extension for Hibernate ORM</strong></h3><p>The <strong><a href="https://www.mongodb.com/company/blog/product-release-announcements/introducing-mongodb-extension-for-hibernate-orm-public-preview">new extension from MongoDB</a></strong> lets you use <strong>Hibernate ORM</strong> directly with MongoDB, translating familiar annotations and entity lifecycle concepts into operations on BSON documents. This makes migrations from relational databases (RDBMS) to Mongo significantly less painful, and developers don&#8217;t have to learn a completely new API to start working with documents.</p><p>The solution, currently in Public Preview, supports key Hibernate features such as <em>lazy loading</em>, first- and second-level <em>caching</em>, and multi-document transaction management. Although the impedance mismatch between the relational and document models (which, to be fair, is just as present in SQL/code itself) still exists, the extension tries to minimize it, offering a pragmatic bridge for enterprise applications that want to combine MongoDB&#8217;s schema flexibility with the maturity of the Hibernate ecosystem.</p><h3><strong>Apache Fory 0.13.0</strong></h3><p>Apache Fory (in incubation) continues its mission to be the fastest serialization framework on the JVM, and <strong><a href="https://fory.apache.org/blog/fory_0_13_0_release/">version 0.13.0</a></strong> brings further performance optimizations thanks to better use of the <strong>Foreign Function &amp; Memory (FFM)</strong> API. The new version drastically speeds up the serialization of objects that do not implement the Serializable interface, using real-time (JIT) code generation in an even more aggressive yet memory-safe manner than before.</p><p>A key highlight is improved compatibility with <strong>GraalVM Native Image</strong>. Earlier versions required a complex reflection configuration, whereas 0.13.0 introduces automated metadata generation, making Fury an ideal choice for serverless applications where every millisecond of startup time and payload deserialization counts. This release cements Fury&#8217;s position as a modern alternative to standard Java serialization or Kryo &#8211; I use it, highly recommend it.</p><h3><strong>Infinispan 16.0</strong></h3><p>The sixteenth release of this distributed cache and data grid focuses on full integration with the AI ecosystem and <strong>Vector Search</strong>. <strong><a href="https://infinispan.org/blog/2025/11/10/infinispan-16-0">Infinispan 16.0</a></strong> can now store and index vectors (embeddings) directly in memory, enabling lightning-fast similarity search queries in RAG (Retrieval-Augmented Generation) applications without having to reach out to external vector databases. That&#8217;s a huge convenience for Java systems built with LLMs in mind.</p><p>From an operational perspective, version 16.0 brings a revamped admin console and native support for <strong>Virtual Threads</strong>. There are also improvements in the Hot Rod protocol that reduce latency in Cross-Site Replication topologies, which is crucial for globally distributed systems.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6g6r!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ab475d3-4129-4270-bdb2-364c7db9fa31_744x347.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6g6r!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ab475d3-4129-4270-bdb2-364c7db9fa31_744x347.png 424w, https://substackcdn.com/image/fetch/$s_!6g6r!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ab475d3-4129-4270-bdb2-364c7db9fa31_744x347.png 848w, https://substackcdn.com/image/fetch/$s_!6g6r!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ab475d3-4129-4270-bdb2-364c7db9fa31_744x347.png 1272w, https://substackcdn.com/image/fetch/$s_!6g6r!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ab475d3-4129-4270-bdb2-364c7db9fa31_744x347.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6g6r!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ab475d3-4129-4270-bdb2-364c7db9fa31_744x347.png" width="744" height="347" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2ab475d3-4129-4270-bdb2-364c7db9fa31_744x347.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:347,&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_!6g6r!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ab475d3-4129-4270-bdb2-364c7db9fa31_744x347.png 424w, https://substackcdn.com/image/fetch/$s_!6g6r!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ab475d3-4129-4270-bdb2-364c7db9fa31_744x347.png 848w, https://substackcdn.com/image/fetch/$s_!6g6r!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ab475d3-4129-4270-bdb2-364c7db9fa31_744x347.png 1272w, https://substackcdn.com/image/fetch/$s_!6g6r!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ab475d3-4129-4270-bdb2-364c7db9fa31_744x347.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>Reactor 2025.0.0</strong></h3><p>Project Reactor has released a fresh release train, 2025.0.0 &#8211; under this umbrella we get, among others, Reactor Core 3.8.0, Reactor Netty 1.3.0 and refreshed reactor-kotlin-extensions 1.3.0, while reactor-netty5, reactor-kafka and the reactive-streams artifact officially step off the train (the API itself still lives on in Flux/Mono; it&#8217;s just no longer managed by the BOM). In Core itself, the most important change is the switch to JSpecify for describing null-safety, which improves IDE and Kotlin integration, plus moving RepeatSpec from addons into core, bumping Micrometer and Context Propagation, and a few sensible contract tightenings (e.g. no longer letting map pass through null).</p><p>Reactor 2025 is a signal that Reactive Streams isn&#8217;t dying but evolving toward a hybrid concurrency model &#8211; I wish them the best of luck &#128522;</p><p>Personal note: <strong><a href="https://annals-csis.org/Volume_5/pliks/117.pdf">the only scientific paper of my career</a></strong> was actually about Reactive Streams.</p><h3><strong>JobRunr 8.2 and 8.3</strong></h3><p>JobRunr is an easy-to-use Java library by Roland for durable background jobs &#8211; from fire-and-forget, through delayed jobs, to recurring CRONs &#8211; built on plain Java methods and your existing database. In November they shipped two new releases!</p><p>In the <strong><a href="https://www.jobrunr.io/en/blog/jobrunr-v8.2.1/">8.2 branch</a></strong>, the team mainly reinforces the foundations: full support for Kotlin 2.2.20, updates for newer framework versions (including Quarkus), simplified metrics configuration via the new useMetrics() API instead of the deprecated useMicroMeter(), and a heavy hardening of dashboard security &#8211; including CSP headers, disabling CORS from the browser, and a mechanism for defining allowed origins in Pro. JobRunr Pro 8.2 adds observability for rate limiters (a dedicated tab in the dashboard, automatic cleanup of unused limiters) and a range of workflow improvements.</p><p><strong><a href="https://www.jobrunr.io/en/blog/jobrunr-v8.3/">Version 8.3</a></strong> is more clearly &#8220;pushing forward&#8221; the tech stack: it adds support for Spring Boot 4 and Jackson 3 (which seems to be the main theme of this whole edition), while still staying compatible with Spring Boot 3 and Jackson 2 thanks to being published as a Multi-Release JAR (separate classes for Java 8 and Java 17+). Along the way, the dashboard got a major refresh (dark mode, a new &#8220;Control Center&#8221; for settings, better responsiveness on small screens), Error Prone was enabled in the pipeline, and the multi-release JAR is treated as a strategic step that in future releases should ease the move to the Java Class File API from JDK 24 and ultimately remove the dependency on ASM.</p><h3><strong>Apache NetBeans 28</strong></h3><p>The latest release of this classic IDE primarily brings full support for <strong>JDK 25</strong>, which has just seen the light of day. NetBeans 28 integrates the new language features, such as compact source files and module imports, offering full support for them in code completion and refactoring. The team also focused on improving application startup performance and reducing memory usage, in response to growing competition from lighter editors.</p><p>Another important part of this update is the refreshed integration with build systems. Support for Gradle 9.0 and Maven 4 has been improved, ensuring smoother synchronization of multi-module projects. NetBeans 28 also introduces new tools for debugging cloud and containerized applications, making it a more attractive choice for developers working in Cloud Native environments who don&#8217;t want to move to paid solutions.</p><p>Old but gold &#128513; It always amazes me how much life there still is in this old-timer.</p><h3><strong>Amper November Update</strong></h3><p>Amper, an experimental project configuration tool from JetBrains, in its <strong><a href="https://blog.jetbrains.com/amper/2025/11/amper-update-november-2025/">November 2025 update</a></strong> is entering a new phase. The team focused on going beyond the Kotlin Multiplatform ecosystem, wanting to turn Amper into a real alternative to Gradle also for typical Java/Spring backend projects. The new version introduces an advanced build caching system and improved integration with IntelliJ IDEA, where YAML configuration files get support on a level similar to what we&#8217;re used to from the Kotlin DSL.</p><p>This update also brings &#8220;Amper Modules&#8221; &#8211; a simplified way of defining dependencies between modules that automatically resolves version conflicts without having to write complex scripts. Although Amper is still fighting for its place in a market dominated by Maven and Gradle, the November release shows that JetBrains is serious about creating a tool that favors declarativity and simplicity over infinite configurability. We&#8217;ll see how that plays out.</p><h3><strong>Compose Hot Reload v1.0.0 by JetBrains</strong></h3><p>And finally, for everyone working with Compose Multiplatform, <strong><a href="https://github.com/JetBrains/compose-hot-reload">Compose Hot Reload 1.0.0</a></strong> is a small milestone. The tool lets you make changes to UI code and see the effect almost in real time, without a full rebuild and app restart &#8211; JetBrains Runtime &#8220;intelligently&#8221; reloads the changed code, which makes UI iteration much faster.</p><p>Compose Hot Reload is said to particularly shine in larger projects, where the classic &#8220;build &#8594; run &#8594; click to the right screen&#8221; cycle costs minutes instead of seconds.</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_!g0uj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5517f0e8-0f3c-421f-a2c4-5292fc288f06_861x571.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!g0uj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5517f0e8-0f3c-421f-a2c4-5292fc288f06_861x571.png 424w, https://substackcdn.com/image/fetch/$s_!g0uj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5517f0e8-0f3c-421f-a2c4-5292fc288f06_861x571.png 848w, https://substackcdn.com/image/fetch/$s_!g0uj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5517f0e8-0f3c-421f-a2c4-5292fc288f06_861x571.png 1272w, https://substackcdn.com/image/fetch/$s_!g0uj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5517f0e8-0f3c-421f-a2c4-5292fc288f06_861x571.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!g0uj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5517f0e8-0f3c-421f-a2c4-5292fc288f06_861x571.png" width="861" height="571" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5517f0e8-0f3c-421f-a2c4-5292fc288f06_861x571.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:571,&quot;width&quot;:861,&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_!g0uj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5517f0e8-0f3c-421f-a2c4-5292fc288f06_861x571.png 424w, https://substackcdn.com/image/fetch/$s_!g0uj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5517f0e8-0f3c-421f-a2c4-5292fc288f06_861x571.png 848w, https://substackcdn.com/image/fetch/$s_!g0uj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5517f0e8-0f3c-421f-a2c4-5292fc288f06_861x571.png 1272w, https://substackcdn.com/image/fetch/$s_!g0uj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5517f0e8-0f3c-421f-a2c4-5292fc288f06_861x571.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>Clique</strong></h3><p>If you build CLI tools and you&#8217;re tired of fighting with ANSI codes or heavy dependencies, <strong><a href="https://github.com/kusoroadeolu/Clique">Clique</a></strong> can be a breath of fresh air. It&#8217;s an ultra-lightweight, dependency-free library for styling console output in Java &#8211; focused on a simple API for coloring and formatting text without hand-writing ANSI escape sequences.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!y445!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3b5a8f3-5521-475c-afa3-93a427672f5f_1124x684.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!y445!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3b5a8f3-5521-475c-afa3-93a427672f5f_1124x684.png 424w, https://substackcdn.com/image/fetch/$s_!y445!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3b5a8f3-5521-475c-afa3-93a427672f5f_1124x684.png 848w, https://substackcdn.com/image/fetch/$s_!y445!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3b5a8f3-5521-475c-afa3-93a427672f5f_1124x684.png 1272w, https://substackcdn.com/image/fetch/$s_!y445!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3b5a8f3-5521-475c-afa3-93a427672f5f_1124x684.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!y445!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3b5a8f3-5521-475c-afa3-93a427672f5f_1124x684.png" width="1124" height="684" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b3b5a8f3-5521-475c-afa3-93a427672f5f_1124x684.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:684,&quot;width&quot;:1124,&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_!y445!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3b5a8f3-5521-475c-afa3-93a427672f5f_1124x684.png 424w, https://substackcdn.com/image/fetch/$s_!y445!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3b5a8f3-5521-475c-afa3-93a427672f5f_1124x684.png 848w, https://substackcdn.com/image/fetch/$s_!y445!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3b5a8f3-5521-475c-afa3-93a427672f5f_1124x684.png 1272w, https://substackcdn.com/image/fetch/$s_!y445!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3b5a8f3-5521-475c-afa3-93a427672f5f_1124x684.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 nice when tools built by developers for developers are not only functional but also aesthetic. Clique is a great fit for small utility scripts or installers where you want nice-looking logs without pulling in big frameworks like <strong><a href="https://github.com/jline/jline3">JLine</a></strong> or <strong><a href="https://github.com/mabe02/lanterna">Lanterna</a></strong>.</p><h3><strong>Lanat</strong></h3><p>The Java CLI argument parser space is already crowded, but <strong><a href="https://github.com/darvil82/lanat">Lanat</a></strong> is trying to carve out its place by focusing on modern design and a highly configurable user experience. It&#8217;s a Java 17 argument parser with annotations, auto-generated help, and a very polished error-message system that&#8217;s clear and user-friendly.</p><pre><code><code>public static void main(String[] args) {
 &#9;// example: david +a20
 &#9;var myProgram = ArgumentParser.parseFromInto(MyProgram.class, args);
 &#9;
 &#9;System.out.printf(
 &#9;&#9;&#8220;Welcome %s! You are %d years old.%n&#8221;,
 &#9;&#9;myProgram.name, myProgram.age
 &#9;);

 &#9;// if no surname was specified, we&#8217;ll show &#8220;none&#8221; instead
 &#9;System.out.printf(&#8221;The surname of the user is %s.%n&#8221;, myProgram.surname.orElse(&#8221;none&#8221;));
 }

</code></code></pre><p>The library lets you define complex commands and subcommands, custom argument types, and rich, colorful descriptions and messages in the terminal. If you want your CLI to look modern, provide sensible feedback to users, and at the same time leverage Java types instead of plain Strings, Lanat is worth a try.</p><h3><strong>Fray by CMU Pasta Lab</strong></h3><p><strong><a href="https://github.com/cmu-pasta/fray">Fray</a></strong> targets one of the hardest areas of our daily work &#8211; concurrency. It&#8217;s a research tool from <strong><a href="https://www.linkedin.com/article/edit/7399390725668245505/#">Carnegie Mellon University</a></strong> for controlled testing of multithreaded code on the JVM, helping detect race conditions, deadlocks, and other &#8220;heisenbugs&#8221; that usually show up only 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_!NUef!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6506b2e1-941b-4ae8-909c-4f9abeb097ff_998x972.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NUef!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6506b2e1-941b-4ae8-909c-4f9abeb097ff_998x972.png 424w, https://substackcdn.com/image/fetch/$s_!NUef!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6506b2e1-941b-4ae8-909c-4f9abeb097ff_998x972.png 848w, https://substackcdn.com/image/fetch/$s_!NUef!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6506b2e1-941b-4ae8-909c-4f9abeb097ff_998x972.png 1272w, https://substackcdn.com/image/fetch/$s_!NUef!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6506b2e1-941b-4ae8-909c-4f9abeb097ff_998x972.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NUef!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6506b2e1-941b-4ae8-909c-4f9abeb097ff_998x972.png" width="998" height="972" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6506b2e1-941b-4ae8-909c-4f9abeb097ff_998x972.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:972,&quot;width&quot;:998,&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_!NUef!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6506b2e1-941b-4ae8-909c-4f9abeb097ff_998x972.png 424w, https://substackcdn.com/image/fetch/$s_!NUef!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6506b2e1-941b-4ae8-909c-4f9abeb097ff_998x972.png 848w, https://substackcdn.com/image/fetch/$s_!NUef!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6506b2e1-941b-4ae8-909c-4f9abeb097ff_998x972.png 1272w, https://substackcdn.com/image/fetch/$s_!NUef!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6506b2e1-941b-4ae8-909c-4f9abeb097ff_998x972.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>Fray takes control over thread interleaving, using modern concurrency-testing techniques and enabling deterministic replay of specific scenarios. It integrates with JUnit 5, so you can mark a test as concurrent via an annotation instead of building your own stress-testing infrastructure.</p><h3><strong>JedisExtraUtils</strong></h3><p>I think for many developers Jedis is the lightweight, default Redis client, but its fairly &#8220;bare&#8221; API forces you to write a lot of boilerplate. <strong><a href="https://github.com/oscar-besga-panel/JedisExtraUtils">JedisExtraUtils</a></strong> is a set of utilities that wrap Jedis into ready-made patterns: iterators for scanning keys and structures, a simple read-through/write-through cache, a distributed RateLimiter, and a messaging system based on streams.</p><p>The project was born out of the need to simplify code in applications that don&#8217;t use heavier frameworks (like Spring Data Redis), want to retain control over the connection, but at the same time avoid copy-pasting the same utilities between repositories.</p><p>Bonus point: the author also supports Valkey, so you&#8217;re not welded to a single key-value server.</p><h3><strong>JBLIS</strong></h3><p>In the AI ecosystem, efficient linear algebra is a critical topic. <strong><a href="https://github.com/boulder-on/jblis">JBLIS</a></strong> is a Java wrapper around the BLIS library (BLAS-like Library Instantiation Software), built on top of the Foreign Function &amp; Memory (FFM) API. This lets you use native, highly optimized linear algebra from plain old Java code &#8211; without having to touch FFM yourself.</p><p>The library targets High-Performance Computing scenarios and compute-heavy backends: matrix and vector operations are performed with performance close to C/Fortran code, while you still stay in the JVM world. It can be a useful building block for projects that want to write logic in Java but don&#8217;t want to give up the performance of native numerical libraries.</p><h3><strong>rockpaperscissors-java25</strong></h3><p><strong><a href="https://www.linkedin.com/in/brunocborges/">Bruno Borges</a></strong> created the repo <strong><a href="https://github.com/brunoborges/rockpaperscissors-java25">rockpaperscissors-java25</a></strong>, which is more than just a simple game. It&#8217;s a small, self-contained demonstration of how lean and modern Java 25 can be: minimal boilerplate, concise syntax, and a reminder that Java is suitable not only for giant enterprise machines, but also for small scripts and educational examples.</p><p>The code is a great starting point if you want to quickly show someone what modern Java looks like &#8211; without historical noise and using the latest language constructs.</p><h3><strong>Cajun</strong></h3><p><strong><a href="https://github.com/CajunSystems/cajun">Cajun</a></strong> is a lightweight actor framework for Java, designed for JDK 21+ and modern concurrency paradigms (including virtual threads). The goal is to simplify building distributed, actor-based systems while focusing on a simple API, high performance, and easy integration with existing infrastructure (e.g., different communication backends).</p><p>It&#8217;s an interesting alternative to heavier reactive frameworks when you need a light actor layer but don&#8217;t want to go all-in on full-blown, &#8220;does-everything&#8221; platforms. Not every project will meaningfully benefit from something as large as Akka.</p><p>BTW: The <strong><a href="https://github.com/CajunSystems/cajun">README</a></strong> is a great introduction to the actor concept, but it&#8217;s also <em>really</em> long &#8211; it even made me wonder how much of it was generated by an LLM.</p><h3><strong>K-Random</strong></h3><p><strong><a href="https://github.com/k-random/k-random">K-Random</a></strong> is a library for generating random objects in Java and Kotlin &#8211; a fork of <strong><a href="https://github.com/j-easy/easy-random">Easy Random</a></strong>, further developed with newer Java versions in mind and additional extensions (e.g., bean validation modules).</p><pre><code><code>KRandom kRandom = new KRandom();
MyObject obj = kRandom.nextObject(MyObject.class);

</code></code></pre><p>With a single call, the library can create fully populated instances of domain classes, DTOs, or entities, filled with random data. It&#8217;s highly configurable &#8211; you can set generation rules for specific fields, types, or ranges, and plug in your own randomizers. It also has Kotlin support.</p><h3><strong>Querity by QuerityLib</strong></h3><p><strong><a href="https://github.com/queritylib/querity">Querity</a></strong> is an ambitious project aiming to solve the age-old problem of dynamic queries: how to accept a rich set of filters, sorting, and pagination from an API and then translate it consistently into SQL and NoSQL.</p><pre><code><code>Query query = Querity.query()
        // customize filters, pagination, sorting...
        .filter(
            not(and(
                filterBy(&#8221;lastName&#8221;, EQUALS, &#8220;Skywalker&#8221;),
                filterBy(&#8221;firstName&#8221;, EQUALS, &#8220;Luke&#8221;)
            ))
        )
        .sort(sortBy(&#8221;lastName&#8221;), sortBy(&#8221;birthDate&#8221;, DESC))
        .pagination(1, 10)
        .build();

</code></code></pre><p>The library provides an abstract API and its own query language that you can expose in a REST interface and then map to specific dialects (JPA, MongoDB, etc.).</p><pre><code><code>curl &#8216;http://localhost:8080/people?q={&#8221;filter&#8221;:{&#8221;and&#8221;:[{&#8221;propertyName&#8221;:&#8221;lastName&#8221;,&#8221;operator&#8221;:&#8221;EQUALS&#8221;,&#8221;value&#8221;:&#8221;Skywalker&#8221;},{&#8221;propertyName&#8221;:&#8221;lastName&#8221;,&#8221;operator&#8221;:&#8221;EQUALS&#8221;,&#8221;value&#8221;:&#8221;Luke&#8221;}]}}&#8217;

</code></code></pre><p>For backend and API-layer developers, Querity can be a lifesaver: it removes the need to write custom code for each new filtering requirement, promotes clean architecture, and separates domain logic from persistence details. With add-ons (like integration with Spring Web/Spring Data) it drops nicely into existing projects. I&#8217;ll admit that out of all the projects mentioned today, this one has the highest chance of ending up in my own dependencies.</p><div><hr></div><p>PS: This is probably the last &#8220;Rest of the Story&#8221; this year. December is going to come with a slightly unusual schedule &#128513;.</p><p>PS1: Happy Thanksgiving for the US readers!</p><p>PS2: Greetings from Amsterdam and <strong><a href="https://kotlindevday.com/">Kotlin Dev Days</a></strong> &#128522;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BSge!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4be0899b-bab4-495c-8799-03540fba2fa3_1333x1000.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BSge!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4be0899b-bab4-495c-8799-03540fba2fa3_1333x1000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!BSge!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4be0899b-bab4-495c-8799-03540fba2fa3_1333x1000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!BSge!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4be0899b-bab4-495c-8799-03540fba2fa3_1333x1000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!BSge!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4be0899b-bab4-495c-8799-03540fba2fa3_1333x1000.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BSge!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4be0899b-bab4-495c-8799-03540fba2fa3_1333x1000.jpeg" width="1333" height="1000" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4be0899b-bab4-495c-8799-03540fba2fa3_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_!BSge!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4be0899b-bab4-495c-8799-03540fba2fa3_1333x1000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!BSge!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4be0899b-bab4-495c-8799-03540fba2fa3_1333x1000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!BSge!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4be0899b-bab4-495c-8799-03540fba2fa3_1333x1000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!BSge!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4be0899b-bab4-495c-8799-03540fba2fa3_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><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[Spring Framework 7 and Spring Boot 4: The tastiest bites - JVM Weekly vol. 153]]></title><description><![CDATA[What new Spring brings to the table!]]></description><link>https://www.jvm-weekly.com/p/spring-framework-7-and-spring-boot</link><guid isPermaLink="false">https://www.jvm-weekly.com/p/spring-framework-7-and-spring-boot</guid><dc:creator><![CDATA[Artur Skowronski]]></dc:creator><pubDate>Thu, 20 Nov 2025 14:03:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FEIk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1a2de0b-a90b-48e5-b09b-17bf8d36683e_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_!FEIk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1a2de0b-a90b-48e5-b09b-17bf8d36683e_1456x1048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FEIk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1a2de0b-a90b-48e5-b09b-17bf8d36683e_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!FEIk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1a2de0b-a90b-48e5-b09b-17bf8d36683e_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!FEIk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1a2de0b-a90b-48e5-b09b-17bf8d36683e_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!FEIk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1a2de0b-a90b-48e5-b09b-17bf8d36683e_1456x1048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FEIk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1a2de0b-a90b-48e5-b09b-17bf8d36683e_1456x1048.png" width="1456" height="1048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a1a2de0b-a90b-48e5-b09b-17bf8d36683e_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;:2027732,&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/179445148?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1a2de0b-a90b-48e5-b09b-17bf8d36683e_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_!FEIk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1a2de0b-a90b-48e5-b09b-17bf8d36683e_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!FEIk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1a2de0b-a90b-48e5-b09b-17bf8d36683e_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!FEIk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1a2de0b-a90b-48e5-b09b-17bf8d36683e_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!FEIk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1a2de0b-a90b-48e5-b09b-17bf8d36683e_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>I know I usually don&#8217;t write about new releases outside of &#8220;Rest of the Story&#8221;, but hey - this is a major Spring release, so&#8230;</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_!wiZK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fb8e0b-bde2-483d-9f69-b1810f74683e_644x462.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wiZK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fb8e0b-bde2-483d-9f69-b1810f74683e_644x462.png 424w, https://substackcdn.com/image/fetch/$s_!wiZK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fb8e0b-bde2-483d-9f69-b1810f74683e_644x462.png 848w, https://substackcdn.com/image/fetch/$s_!wiZK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fb8e0b-bde2-483d-9f69-b1810f74683e_644x462.png 1272w, https://substackcdn.com/image/fetch/$s_!wiZK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fb8e0b-bde2-483d-9f69-b1810f74683e_644x462.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wiZK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fb8e0b-bde2-483d-9f69-b1810f74683e_644x462.png" width="644" height="462" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f4fb8e0b-bde2-483d-9f69-b1810f74683e_644x462.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:462,&quot;width&quot;:644,&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_!wiZK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fb8e0b-bde2-483d-9f69-b1810f74683e_644x462.png 424w, https://substackcdn.com/image/fetch/$s_!wiZK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fb8e0b-bde2-483d-9f69-b1810f74683e_644x462.png 848w, https://substackcdn.com/image/fetch/$s_!wiZK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fb8e0b-bde2-483d-9f69-b1810f74683e_644x462.png 1272w, https://substackcdn.com/image/fetch/$s_!wiZK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4fb8e0b-bde2-483d-9f69-b1810f74683e_644x462.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>This week, Spring (<strong><a href="https://calendar.spring.io/">according to their calendar</a></strong>) released a new generation of practically all its flagship projects: <strong><a href="https://spring.io/blog/2024/09/03/spring-framework-7-roadmap-and-timeline">Spring Framework 7</a></strong>, Spring Boot 4, Spring Data 2025.1, and a release for Spring AI 1.1 for the Boot 3.5 line (while actively developing 2.x for Spring Boot 4).</p><p>Let&#8217;s be honest - major version bumps like these don&#8217;t just happen &#8220;by the way.&#8221; They usually mark the end of an era rather than just another patch. New Spring fits into a much broader shift across the entire ecosystem. Java has racked up new LTS releases, Jakarta EE has finally closed the book on the <em>javax</em> to <em>jakarta</em> migration, GraalVM stopped being just a &#8220;conference talk curiosity,&#8221; and AI has moved from hackathons straight into budgets, roadmaps, and KPIs.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AnYE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcff8867-e29a-40c0-919c-d852acf3905b_1055x668.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AnYE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcff8867-e29a-40c0-919c-d852acf3905b_1055x668.png 424w, https://substackcdn.com/image/fetch/$s_!AnYE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcff8867-e29a-40c0-919c-d852acf3905b_1055x668.png 848w, https://substackcdn.com/image/fetch/$s_!AnYE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcff8867-e29a-40c0-919c-d852acf3905b_1055x668.png 1272w, https://substackcdn.com/image/fetch/$s_!AnYE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcff8867-e29a-40c0-919c-d852acf3905b_1055x668.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AnYE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcff8867-e29a-40c0-919c-d852acf3905b_1055x668.png" width="1055" height="668" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fcff8867-e29a-40c0-919c-d852acf3905b_1055x668.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:668,&quot;width&quot;:1055,&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_!AnYE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcff8867-e29a-40c0-919c-d852acf3905b_1055x668.png 424w, https://substackcdn.com/image/fetch/$s_!AnYE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcff8867-e29a-40c0-919c-d852acf3905b_1055x668.png 848w, https://substackcdn.com/image/fetch/$s_!AnYE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcff8867-e29a-40c0-919c-d852acf3905b_1055x668.png 1272w, https://substackcdn.com/image/fetch/$s_!AnYE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcff8867-e29a-40c0-919c-d852acf3905b_1055x668.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>But here&#8217;s the thing: Spring isn&#8217;t just trying to keep up - it clearly wants to co-define this movement.</p><p>That&#8217;s why, instead of throwing in yet another &#8220;compatibility flag&#8221; or one more section in application.yml, the team decided to go for a coordinated, one-time &#8220;Big Bang.&#8221; In this release, the foundations have been aligned with new standards, a massive chunk of technical debt has been paid off, and the platform has been positioned for the AI-driven years ahead. From the outside, it looks like a version migration. From the inside? It looks like a redesign of Spring&#8217;s entire mental model.</p><h3><strong>The foundation: goodbye javax</strong></h3><p>At the fundamental level, the changes are very concrete. The world of javax officially disappears from the main path. Annotations like <em>@Resource</em>, <em>@PostConstruct</em>, or <em>@Inject</em> - present in almost every project for years - need to be migrated to the new path.</p><pre><code><code>import javax.annotation.PostConstruct;
import javax.persistence.Entity;

@Entity
public class LegacyUser {
    @PostConstruct
    private void init() { ... }
}</code></code></pre><p>They are now moved to a consistent, Jakarta-native world compliant with <strong><a href="https://jakarta.ee/specifications/platform/11/">Jakarta EE 11.</a></strong></p><pre><code><code>import jakarta.annotation.PostConstruct;
import jakarta.persistence.Entity;

@Entity
public class ModernUser {
    @PostConstruct
    private void init() { ... }
}</code></code></pre><p>But there is another <strong><a href="https://spring.io/blog/2025/10/07/introducing-jackson-3-support-in-spring">&#8220;hidden landmine&#8221; in the plumbing: Jackson 3</a></strong>. Just like the Jakarta migration, the new <strong><a href="https://github.com/FasterXML/jackson-core">Jackson version changes</a></strong> package names. Spring Framework 7 is doing some heavy lifting to support a mix of Jackson 2 and 3 for now, but the signal is clear: the old JSON backend is on its way out, and we are looking at another ecosystem-wide shift.</p><p>At the same time, <strong><a href="https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-7.0-Release-Notes">the entire stack gets a lift</a></strong>: newer Servlet, JPA, Bean Validation, plus new generations of Tomcat and Jetty. Some well-known servers, like <strong><a href="https://github.com/undertow-io/undertow">Undertow</a></strong>, simply didn&#8217;t make the cut for the new standard and have dropped out of the Spring ecosystem. It hurts (I remember using Undertow regularly back in my Clojure days), but it closes a chapter. This leap had to happen - the only question was whether it would be a single, planned surgical cut, or a &#8220;death by a thousand cuts&#8221; via endless, frustrating compatibility fractures. Spring chose option one.</p><h3><strong>The Billion Dollar Mistake and other improvements for sanity sake</strong></h3><p>The second axis of change concerns the daily developer experience. It starts with something we all know a little too well: nulls. Spring Framework 7 and the new generation of libraries around it (Spring Data, Spring Security, Spring Vault) adopt <strong><a href="https://jspecify.dev/">JSpecify</a></strong>.</p><p>To understand why this is huge, you have to remember the absolute mess we&#8217;ve lived in for the last 15 years. We had <em>javax.annotation.Nullable</em>, <em>org.jetbrains.annotations.Nullable</em>, <em>edu.umd.cs.findbugs.annotations.Nullable</em>, and <em><strong><a href="http://android.support/">android.support</a></strong>.annotation.Nullable</em>. It was the Wild West, where tools (IDEs, Sonar) often ignored each other&#8217;s annotations.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jvmU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8ddde77-420f-4219-9e15-386d52d2395e_744x267.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jvmU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8ddde77-420f-4219-9e15-386d52d2395e_744x267.png 424w, https://substackcdn.com/image/fetch/$s_!jvmU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8ddde77-420f-4219-9e15-386d52d2395e_744x267.png 848w, https://substackcdn.com/image/fetch/$s_!jvmU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8ddde77-420f-4219-9e15-386d52d2395e_744x267.png 1272w, https://substackcdn.com/image/fetch/$s_!jvmU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8ddde77-420f-4219-9e15-386d52d2395e_744x267.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jvmU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8ddde77-420f-4219-9e15-386d52d2395e_744x267.png" width="744" height="267" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a8ddde77-420f-4219-9e15-386d52d2395e_744x267.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:267,&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_!jvmU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8ddde77-420f-4219-9e15-386d52d2395e_744x267.png 424w, https://substackcdn.com/image/fetch/$s_!jvmU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8ddde77-420f-4219-9e15-386d52d2395e_744x267.png 848w, https://substackcdn.com/image/fetch/$s_!jvmU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8ddde77-420f-4219-9e15-386d52d2395e_744x267.png 1272w, https://substackcdn.com/image/fetch/$s_!jvmU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8ddde77-420f-4219-9e15-386d52d2395e_744x267.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://jspecify.dev/">JSpecify</a></strong> is the peace treaty. It is a standard agreed upon by the giants (Google, JetBrains, Oracle, and others) to finally speak one common language about nullability.</p><p>In Spring Framework 7, <strong><a href="https://spring.io/blog/2025/03/10/null-safety-in-spring-apps-with-jspecify-and-null-away">this manifests as a massive &#8220;Inversion of Control&#8221; for nulls</a></strong>. Thanks to the <em>@NullMarked</em> annotation applied at the package level, Spring stops being &#8220;everything can be null&#8221; by default. instead, it sends a clear signal: non-null is the normal case. You no longer have to clutter your code with @NonNull on every parameter. You only explicitly mark the exceptions with <em>@Nullable</em>.</p><pre><code><code>@org.jspecify.annotations.NullMarked
package com.example.billing;

public class BillingService {

    // The compiler knows &#8216;invoice&#8217; cannot be null.
    public Receipt processPayment(Invoice invoice) {
        return new Receipt(invoice.getId());
    }

    public @Nullable Transaction findHistory(@Nullable String transactionId) {
        return transactionId != null ? repo.find(transactionId) : null;
    }
}</code></code></pre><div><hr></div><p>We can expect stop of the &#8220;hacky workarounds&#8221; we&#8217;ve been doing for a decade.</p><p>First, API Versioning is finally a first-class citizen. No more writing custom interceptors or dragging in external libraries just to version your REST endpoints. Whether you prefer path-based, header-based, or query-param versioning, it is now supported natively by standard annotations.</p><pre><code><code>@RestController
@RequestMapping(&#8221;/orders&#8221;)
public class OrderController {

    // Native API Versioning support (Header, Path, or Param)
    // No more custom interceptors needed
    @GetMapping
    @ApiVersion(value = &#8220;1.0&#8221;, strategy = VersionStrategy.HEADER)
    public List&lt;Order&gt; getOrdersLegacy() {
        return repository.findAll();
    }

    // Resilience patterns moved directly into Core
    // No extra &#8216;spring-retry&#8217; dependency required
    @Retryable(maxAttempts = 3, backoff = @Backoff(delay = 500))
    @GetMapping
    @ApiVersion(value = &#8220;2.0&#8221;, strategy = VersionStrategy.HEADER)
    public List&lt;Order&gt; getOrdersResilient() {
        return service.fetchOrdersWithRateLimit();
    }
}</code></code></pre><p>Second, Resilience patterns (<em>Retries</em>, <em>Circuit Breakers</em>, <em>Rate Limiters</em>) are being moved/promoted directly into spring-core and the main framework. Features like <em>@Retryable</em> and Rate Limiting have moved directly into spring-core. You no longer need to pull in extra dependencies or rely solely on external tools like <strong><a href="https://github.com/resilience4j/resilience4j">Resilience4j</a></strong> for basic robustness. In distributed system failures are a default state (I hope everybody internalized that knowledge by now) and the framework finally treats them that way &#8220;out of the box.&#8221;</p><h3><strong>Less magic, more build-time actions</strong></h3><p>The third axis is Spring&#8217;s relationship with the compiler and the build process. For years, Spring was the master of &#8220;runtime magic&#8221;: classpath scanning, dynamic configuration, reflection, proxies. This gave us incredible flexibility, but it came with consequences. On one hand, we always dealt with technology indistinguishable from magic (cheers to Arthur C. Clarke), but on the other, in the era of containers, cold starts, and native images, it started to hurt.</p><p>The new Spring - following the current fashion in the ecosystem - consistently shifts the workload to <strong>build time</strong>. Instead of doing &#8220;everything&#8221; at startup, it tries to know and generate as much as possible beforehand.</p><p><strong><a href="https://spring.io/blog/2025/10/28/modularizing-spring-boot">You can see this best in</a></strong> <strong><a href="https://spring.io/blog/2025/10/28/modularizing-spring-boot">Spring Boot 4</a></strong>. The existing <strong><a href="https://docs.spring.io/spring-boot/reference/using/auto-configuration.html">spring-boot-autoconfigure</a></strong>, which bloated over the years, has been broken down into a neat set of smaller modules. Suddenly, your IDE stops flooding you with suggestions for classes and configuration properties that aren&#8217;t even on your classpath. And this is exactly where the Spring AOT world meets what&#8217;s happening inside the Virtual Machine itself within <strong><a href="https://openjdk.org/projects/leyden/">Project Leyden</a></strong>.</p><p>Leyden in OpenJDK has the exact same goal, just a level lower: improve startup time, time-to-peak performance, and application footprint by shifting as much work as possible from execution time to an earlier stage. <strong>JDK 24</strong> brought the first installment of this philosophy with <strong><a href="https://openjdk.org/jeps/483">JEP 483: Ahead-of-Time Class Loading &amp; Linking</a></strong>, which can load and link classes during a &#8220;training&#8221; run and save the result in a special cache.</p><p>So when you combine this with modular Boot 4 and Spring AOT, the puzzle starts to come together. By slicing up autoconfiguration and moving &#8220;magic&#8221; parts to code generated at build time, Spring practically reduces the scope that the JVM needs to warm up at start. Leyden, with its AOT cache, no longer operates on a chaotic clump of classes, but on a predictable, slimmed-down graph that Spring has already cleaned and materialized.</p><p>No wonder early experiments show synergy: even before Leyden, Spring AOT optimizations alone gave about a 15% startup boost on the classic JVM, and &#8220;pre-main&#8221; improvements from <strong><a href="https://devops.com/crac-vs-leyden-comparison-of-two-approaches-to-remove-slow-startup-in-java/">Leyden can boost this effect even further</a></strong>. In practice, this means that Java - the same Java we got used to calling &#8220;heavy&#8221; - is starting to behave more and more like an ecosystem with built-in, hybrid AOT: part of the work is done by the framework, part by the JVM. The container rises faster, eats less RAM, and depends less on dynamic generation happening at startup. <strong><a href="https://docs.spring.io/spring-boot/docs/current/reference/html/native-image.html">Native builds have less matter to analyze</a></strong>, and AOT gets small, well-described blocks to work with instead of one mega-jar.</p><p>Interestingly, we can add to this <strong>Spring Data 2025.1</strong> with repositories prepared Ahead-of-Time. Methods like <em>findByEmailAndStatus</em> stop being mysterious spells interpreted at application startup and become regular, generated code, compiled along with the rest of the system. Startup is faster, fewer things happen &#8220;in the background,&#8221; and behavior in native images stops being a lottery.</p><h3><strong>A Tale of Two AI Streams</strong></h3><p>However, a no less interesting part of this puzzle concerns AI. <strong>Spring AI</strong> is clearly diverging into two development lines.</p><p>The <strong><a href="https://spring.io/projects/spring-ai">1.1 branch</a></strong> closes the Spring Boot 3.5 era: it&#8217;s a &#8220;broadening&#8221; release, not a table-flipper. In practice, this means you can already build sensible agentic workflows in the 3.5 ecosystem: you pick up the Spring AI starter, configure a provider, define a few tools, and the rest &#8211; from the MCP skeleton, through JSON mapping, to integration with ChatClient &#8211; is delivered by the framework. Spring AI 1.1 is &#8220;AI for today&#8217;s projects&#8221; &#8211; maximally compatible with existing Boot, focused on stability, use-case coverage, and integration with what you already have in your monoliths and microservices.</p><p>Simultaneously, ream is currently working on the <strong><a href="https://github.com/spring-projects/spring-ai/milestone/24">2.x line</a></strong> deliberately breaks this compromise and is designed in tandem with Spring Boot 4. Here, the theme is redesign, not just expansion: full compatibility with Boot 4, a new API shape, separation of reactive and imperative <em>ChatClient</em>, preparation for JSpecify and null-safe contracts (which Spring officially announces as a goal for 2.0), and better embedding of MCP and AOT in the very heart of the architecture. For the developer, the difference comes down to direction: 1.1 is the fast track to add AI to an existing 3.5 architecture, but 2.x is a conscious decision that you are building a system where LLMs, MCP agents, and classic Spring services create one, coherent, first-class stack.</p><pre><code><code>@Service
public class BookingAgent {

    private final ChatClient chatClient;

    public BookingAgent(ChatClient.Builder builder) {
        this.chatClient = builder
            .defaultSystem(&#8221;You are a booking assistant.&#8221;)
            .defaultTools(&#8221;bookingTools&#8221;) // References a bean, not just a function
            .build();
    }

    // Defined once, used by Agents and LLMs &#8220;automagically&#8221;
    @Tool(description = &#8220;Check room availability for a given date range&#8221;)
    public boolean checkAvailability(@NonNull LocalDate from, @NonNull LocalDate to) {
        return bookingService.hasSlots(from, to);
    }
}</code></code></pre><p>And I suspect the difference in capabilities will only widen - if only to motivate people to migrate to new versions &#128521;.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FUFO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3141483-f21a-4bd4-8fd4-c183f9db77bd_683x875.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FUFO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3141483-f21a-4bd4-8fd4-c183f9db77bd_683x875.png 424w, https://substackcdn.com/image/fetch/$s_!FUFO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3141483-f21a-4bd4-8fd4-c183f9db77bd_683x875.png 848w, https://substackcdn.com/image/fetch/$s_!FUFO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3141483-f21a-4bd4-8fd4-c183f9db77bd_683x875.png 1272w, https://substackcdn.com/image/fetch/$s_!FUFO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3141483-f21a-4bd4-8fd4-c183f9db77bd_683x875.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FUFO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3141483-f21a-4bd4-8fd4-c183f9db77bd_683x875.png" width="683" height="875" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e3141483-f21a-4bd4-8fd4-c183f9db77bd_683x875.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:875,&quot;width&quot;:683,&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_!FUFO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3141483-f21a-4bd4-8fd4-c183f9db77bd_683x875.png 424w, https://substackcdn.com/image/fetch/$s_!FUFO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3141483-f21a-4bd4-8fd4-c183f9db77bd_683x875.png 848w, https://substackcdn.com/image/fetch/$s_!FUFO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3141483-f21a-4bd4-8fd4-c183f9db77bd_683x875.png 1272w, https://substackcdn.com/image/fetch/$s_!FUFO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3141483-f21a-4bd4-8fd4-c183f9db77bd_683x875.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>To sum it up - it&#8217;s very clear that Spring has drawn two parallel realities.</p><p><strong>Spring 6 + Boot 3</strong> is now the stable set &#8211; stable, known, ideal for systems entering the maintenance phase that just need to work, not chase every novelty.</p><p>On the other side, we have the new baseline: <strong>Spring Frameworks 7, Spring Boot 4,</strong> fresh<strong> Spring Data, </strong>and<strong> Spring AI 2.x.</strong> This is where Jakarta EE 11, JSpecify, AOT, vector search, MCP agents, and lightweight runtimes for AI originating from Spring Boot 4.0 await.</p><p>Honestly? The scope of changes is large enough that I expect a lot of serious projects on Spring 6 will simply stay there &#8211; at least for a few years. It will be a very comfortable haven: support is there, everything is familiar, business is happy. But that&#8217;s exactly why the question is no longer &#8220;is it worth upgrading.&#8221; The real question is: <strong>in which world do you want your system to live in five years</strong> - in the safe, tamed 6/3, or on the new, wilder, but also much more promising 7/4 terrain?</p><p>I have my suspicions where the most ambitious teams will end up - or those who want to migrate gradually, without a major Big Bang when support ends... but we&#8217;ll see.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eCdz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48d3890f-edd8-4f49-aae8-efa903db39f9_1018x810.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eCdz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48d3890f-edd8-4f49-aae8-efa903db39f9_1018x810.png 424w, https://substackcdn.com/image/fetch/$s_!eCdz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48d3890f-edd8-4f49-aae8-efa903db39f9_1018x810.png 848w, https://substackcdn.com/image/fetch/$s_!eCdz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48d3890f-edd8-4f49-aae8-efa903db39f9_1018x810.png 1272w, https://substackcdn.com/image/fetch/$s_!eCdz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48d3890f-edd8-4f49-aae8-efa903db39f9_1018x810.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eCdz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48d3890f-edd8-4f49-aae8-efa903db39f9_1018x810.png" width="1018" height="810" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/48d3890f-edd8-4f49-aae8-efa903db39f9_1018x810.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:810,&quot;width&quot;:1018,&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_!eCdz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48d3890f-edd8-4f49-aae8-efa903db39f9_1018x810.png 424w, https://substackcdn.com/image/fetch/$s_!eCdz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48d3890f-edd8-4f49-aae8-efa903db39f9_1018x810.png 848w, https://substackcdn.com/image/fetch/$s_!eCdz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48d3890f-edd8-4f49-aae8-efa903db39f9_1018x810.png 1272w, https://substackcdn.com/image/fetch/$s_!eCdz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48d3890f-edd8-4f49-aae8-efa903db39f9_1018x810.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>PS: There was no edition last week as I was recently traveling, with opportunity to make up some bucket list TV Shows on plane. And as a pre-Disney Star Wars fan... OMFG.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aGfB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b64e868-d70e-4ffb-bb7b-5635710ce8e7_591x417.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aGfB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b64e868-d70e-4ffb-bb7b-5635710ce8e7_591x417.png 424w, https://substackcdn.com/image/fetch/$s_!aGfB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b64e868-d70e-4ffb-bb7b-5635710ce8e7_591x417.png 848w, https://substackcdn.com/image/fetch/$s_!aGfB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b64e868-d70e-4ffb-bb7b-5635710ce8e7_591x417.png 1272w, https://substackcdn.com/image/fetch/$s_!aGfB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b64e868-d70e-4ffb-bb7b-5635710ce8e7_591x417.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aGfB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b64e868-d70e-4ffb-bb7b-5635710ce8e7_591x417.png" width="591" height="417" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2b64e868-d70e-4ffb-bb7b-5635710ce8e7_591x417.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:417,&quot;width&quot;:591,&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_!aGfB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b64e868-d70e-4ffb-bb7b-5635710ce8e7_591x417.png 424w, https://substackcdn.com/image/fetch/$s_!aGfB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b64e868-d70e-4ffb-bb7b-5635710ce8e7_591x417.png 848w, https://substackcdn.com/image/fetch/$s_!aGfB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b64e868-d70e-4ffb-bb7b-5635710ce8e7_591x417.png 1272w, https://substackcdn.com/image/fetch/$s_!aGfB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b64e868-d70e-4ffb-bb7b-5635710ce8e7_591x417.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>PS2: Next week I&#8217;ll be speaking at <strong><a href="https://www.linkedin.com/search/results/all/?keywords=%23kotlindevday&amp;origin=HASH_TAG_FROM_FEED">#KotlinDevDay</a></strong> in Amsterdam! See you there &#128522;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!30bK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f7321e8-335a-4c43-b9ad-3534184bba49_527x373.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!30bK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f7321e8-335a-4c43-b9ad-3534184bba49_527x373.png 424w, https://substackcdn.com/image/fetch/$s_!30bK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f7321e8-335a-4c43-b9ad-3534184bba49_527x373.png 848w, https://substackcdn.com/image/fetch/$s_!30bK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f7321e8-335a-4c43-b9ad-3534184bba49_527x373.png 1272w, https://substackcdn.com/image/fetch/$s_!30bK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f7321e8-335a-4c43-b9ad-3534184bba49_527x373.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!30bK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f7321e8-335a-4c43-b9ad-3534184bba49_527x373.png" width="527" height="373" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3f7321e8-335a-4c43-b9ad-3534184bba49_527x373.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:373,&quot;width&quot;:527,&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_!30bK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f7321e8-335a-4c43-b9ad-3534184bba49_527x373.png 424w, https://substackcdn.com/image/fetch/$s_!30bK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f7321e8-335a-4c43-b9ad-3534184bba49_527x373.png 848w, https://substackcdn.com/image/fetch/$s_!30bK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f7321e8-335a-4c43-b9ad-3534184bba49_527x373.png 1272w, https://substackcdn.com/image/fetch/$s_!30bK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f7321e8-335a-4c43-b9ad-3534184bba49_527x373.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></channel></rss>