<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Friends Of OpenJDK Today on foojay.io - Friends Of OpenJDK</title><link>https://foojay.io/today/</link><description>Recent content in Friends Of OpenJDK Today on foojay.io - Friends Of OpenJDK</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Fri, 23 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://foojay.io/today/index.xml" rel="self" type="application/rss+xml"/><item><title>How to Secure a Spring Boot Application with OpenID Connect and pac4j</title><link>https://foojay.io/today/how-to-secure-a-spring-boot-application-with-openid-connect-and-pac4j/</link><pubDate>Fri, 23 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/how-to-secure-a-spring-boot-application-with-openid-connect-and-pac4j/</guid><description>&lt;p&gt;&lt;a href="https://www.pac4j.org/" target="_blank" rel="noopener noreferrer"&gt;pac4j&lt;/a&gt; is an open-source Java security library for authentication and authorization. It supports protocols such as OpenID Connect, OAuth 2.0, SAML and CAS, with integrations for multiple Java web frameworks. I am Jérôme LELEU, the maintainer of pac4j. In this tutorial, we will use its OpenID Connect client with Spring Boot.&lt;/p&gt;&#10;&lt;p&gt;You want users to sign in to your Java application with Keycloak, Google, Microsoft Entra ID, Okta, Auth0 or even a CAS server. They already have an account there, so your application should not ask them for another password.&lt;/p&gt;</description></item><item><title>OWASP Java Security Libraries: Please Update!</title><link>https://foojay.io/today/owasp-java-security-libraries-please-update/</link><pubDate>Fri, 23 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/owasp-java-security-libraries-please-update/</guid><description>&lt;p&gt;Hello Foojay!&lt;/p&gt;&#10;&lt;p&gt;I&amp;rsquo;ve been working hard on bringing two Java security libraries up to date: &lt;strong&gt;OWASP Java Encoder&lt;/strong&gt; and &lt;strong&gt;OWASP Java HTML Sanitizer&lt;/strong&gt;. These libraries are still used in a lot of applications and security products around the world. Both have fresh releases, and I&amp;rsquo;d love to get more Java developers looking at them again.&lt;/p&gt;&#10;&lt;p&gt;My request is pretty simple: &lt;strong&gt;please update if you use these!&lt;/strong&gt; And if they matter to your application, I&amp;rsquo;d love your feedback.&lt;/p&gt;</description></item><item><title>Android on iOS, Web &amp; Desktop Efficiently and for Free</title><link>https://foojay.io/today/android-apps-beyond-android/</link><pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/android-apps-beyond-android/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/android-apps-beyond-android/android-apps-beyond-android-d1d17778d9.jpg" alt="Android application screens reach phones, desktop and the browser" width="1024" height="512" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;We are not the first to bring Android to iOS. Earlier projects brought Android&amp;rsquo;s runtime along with the application. Dalvik was built for Android, including a just-in-time compiler (JIT) that ordinary iOS apps are &lt;a href="https://support.apple.com/guide/security/security-of-runtime-process-sec15bfe098e/web" target="_blank" rel="noopener noreferrer"&gt;not permitted to use&lt;/a&gt;. Disabling it removes an important source of &lt;a href="https://android-developers.googleblog.com/2010/05/android-22-and-developers-goodies.html" target="_blank" rel="noopener noreferrer"&gt;Dalvik&amp;rsquo;s performance&lt;/a&gt;. Dalvik was designed around interpretation and JIT compilation, not ahead-of-time compilation (AOT), so taking away the JIT leaves an interpreter rather than an optimized native app.&lt;/p&gt;</description></item><item><title>Exact Prices in Java: Decimal Strings and BigDecimal Traps</title><link>https://foojay.io/today/exact-prices-in-java/</link><pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/exact-prices-in-java/</guid><description>&lt;p&gt;Prices look like the simplest data there is: a number with a few decimals. Then a crypto price arrives with fifteen decimal places, a token trades at &lt;code&gt;0.000012341873905&lt;/code&gt;, and the numbers on screen stop adding up. This article walks through what goes wrong between the JSON and the screen, and how to keep every digit with &lt;code&gt;BigDecimal&lt;/code&gt; and Jackson. For the wider trade-offs between the number types, see &lt;a href="https://foojay.io/today/double-bigdecimal-or-fixed-point-precision-performance-and-sane-choices-for-numbers-in-java/"&gt;double, BigDecimal, or Fixed-Point? on foojay&lt;/a&gt;; this article follows one price from the JSON to the screen.&lt;/p&gt;</description></item><item><title>BoxLang 1.18.0 Released: Every Cloud, Every Node, Every Agent</title><link>https://foojay.io/today/boxlang-1-18-0-released-every-cloud-every-node-every-agent/</link><pubDate>Wed, 21 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/boxlang-1-18-0-released-every-cloud-every-node-every-agent/</guid><description>&lt;p&gt;&lt;strong&gt;Azure joins the serverless family. Scheduled tasks become cluster-safe. And the whole platform gets documentation and skills built for developers and AI agents working side by side.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;If you run a technology organization, you are being asked to do three things at once: ship faster, keep the estate you already have running, and make AI part of how your teams work. Most stacks make you choose. BoxLang 1.18 is another step toward not having to.&lt;/p&gt;</description></item><item><title>BxPlaywright 1.0: Real Browsers, Fluent BoxLang, Built for AI Agents</title><link>https://foojay.io/today/bxplaywright-10-real-browsers-fluent-boxlang-built-for-ai-agents/</link><pubDate>Wed, 21 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/bxplaywright-10-real-browsers-fluent-boxlang-built-for-ai-agents/</guid><description>&lt;p&gt;&lt;strong&gt;Ortus Solutions today announces the general availability of &lt;a href="https://bxplaywright.boxlang.io" target="_blank" rel="noopener noreferrer"&gt;bx-playwright 1.0&lt;/a&gt;, fluent browser automation and testing for BoxLang, powered by Microsoft Playwright. It ships alongside &lt;a href="https://testbox.ortusbooks.com/readme/release-history/whats-new-with-7.2.0" target="_blank" rel="noopener noreferrer"&gt;TestBox 7.2&lt;/a&gt; and &lt;a href="https://coldbox.ortusbooks.com/release-history/whats-new-with-8.3.0" target="_blank" rel="noopener noreferrer"&gt;ColdBox 8.3&lt;/a&gt;, which bring real-browser testing straight into your specs. Drive Chromium, Firefox and WebKit, test full user journeys, render PDFs and images, and give your AI agents a real browser to verify the BoxLang applications they build.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;&#10;&#9;&#9;&#9;&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/8pixcv2P3sU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;&#10;&#9;&#9;&lt;/div&gt;&#10;&#10;&lt;pre class="EnlighterJSRAW" data-enlighter-language="javascript"&gt;playwright().browse( ( page ) =&amp;gt; {&#10;&#9;page.visit( &amp;#34;/login&amp;#34; )&#10;&#9;&#9;.fill( &amp;#34;Email&amp;#34;, &amp;#34;luis@ortus.com&amp;#34; )&#10;&#9;&#9;.fill( &amp;#34;Password&amp;#34;, &amp;#34;secret&amp;#34; )&#10;&#9;&#9;.click( &amp;#34;Sign in&amp;#34; )&#10;&#9;&#9;.assertPathIs( &amp;#34;/dashboard&amp;#34; )&#10;&#9;&#9;.assertSee( &amp;#34;Welcome back&amp;#34; )&#10;&#9;&#9;.screenshot( &amp;#34;dashboard.png&amp;#34; )&#10;} )&lt;/pre&gt;&lt;p&gt;That&amp;rsquo;s a full login check. It reads like the steps you&amp;rsquo;d write on a sticky note, and every line runs in a real browser. 🚀&lt;/p&gt;</description></item><item><title>Java Stream Gatherers: From Built-in Patterns to Custom Pipeline Mechanics</title><link>https://foojay.io/today/java-stream-gatherers/</link><pubDate>Wed, 21 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/java-stream-gatherers/</guid><description>&lt;h1 id="java-stream-gatherers-from-built-in-patterns-to-custom-pipeline-mechanics"&gt;Java Stream Gatherers: From Built-in Patterns to Custom Pipeline Mechanics&lt;/h1&gt;&#10;&lt;h2 id="table-of-contents"&gt;Table of Contents&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="#1-introduction--context"&gt;1. Introduction &amp;amp; Context&lt;/a&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="#11-the-evolution-of-streams"&gt;1.1 The Evolution of Streams&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#12-the-collector-problem"&gt;1.2 The &amp;ldquo;Collector Problem&amp;rdquo;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#13-what-are-stream-gatherers"&gt;1.3 What are Stream Gatherers?&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#2-getting-started-built-in-gatherers-in-action"&gt;2. Getting Started: Built-In Gatherers in Action&lt;/a&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="#21-understanding-stream-cardinality"&gt;2.1 Understanding Stream Cardinality&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#22-the-five-ready-to-use-gatherers"&gt;2.2 The Five Ready-to-Use Gatherers&lt;/a&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="#221-batching-items-with-windowfixed"&gt;2.2.1 Batching Items with &lt;code&gt;windowFixed&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#222-analyzing-sequences-with-windowsliding"&gt;2.2.2 Analyzing Sequences with &lt;code&gt;windowSliding&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#223-accumulating-values-with-scan"&gt;2.2.3 Accumulating Values with &lt;code&gt;scan&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#224-intermediate-aggregations-with-fold"&gt;2.2.4 Intermediate Aggregations with &lt;code&gt;fold&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#225-bounded-parallelism-with-mapconcurrent"&gt;2.2.5 Bounded Parallelism with &lt;code&gt;mapConcurrent&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#3-leveling-up-from-using-gatherers-to-authoring-your-own"&gt;3. Leveling Up: From Using Gatherers to Authoring Your Own&lt;/a&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="#31-when-should-you-write-a-custom-gatherer"&gt;3.1 When Should You Write a Custom Gatherer?&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#32-pipeline-composition-with-andthen"&gt;3.2 Pipeline Composition with &lt;code&gt;andThen()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#4-under-the-hood-architecture--anatomy-of-custom-gatherers"&gt;4. Under the Hood: Architecture &amp;amp; Anatomy of Custom Gatherers&lt;/a&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="#41-anatomy-of-a-gatherert-a-r"&gt;4.1 Anatomy of a &lt;code&gt;Gatherer&amp;lt;T, A, R&amp;gt;&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#42-the-four-building-blocks-initializer-integrator-combiner-finisher"&gt;4.2 The Four Building Blocks (&lt;code&gt;initializer&lt;/code&gt;, &lt;code&gt;integrator&lt;/code&gt;, &lt;code&gt;combiner&lt;/code&gt;, &lt;code&gt;finisher&lt;/code&gt;)&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#43-concrete-walkthrough-building-a-custom-gatherer"&gt;4.3 Concrete Walkthrough: Building a Custom Gatherer&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#5-production-ready-gatherers-parallelism-state-and-pitfalls"&gt;5. Production-Ready Gatherers: Parallelism, State, and Pitfalls&lt;/a&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="#51-parallel-execution-modes--combiners"&gt;5.1 Parallel Execution Modes &amp;amp; Combiners&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#52-greedy-vs-short-circuiting-integrators"&gt;5.2 Greedy vs. Short-Circuiting Integrators&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#53-state-management--thread-safety"&gt;5.3 State Management &amp;amp; Thread Safety&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#54-gatherer-vs-collector-a-quick-comparison"&gt;5.4 Gatherer vs. Collector: A Quick Comparison&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#6-conclusion"&gt;6. Conclusion&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#references"&gt;References&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;&lt;img src="https://foojay.io/today/java-stream-gatherers/StreamGatherers.jpg" alt="Stream Gatherers" title="Stream Gatherers" width="1024" height="559" loading="lazy" decoding="async"&gt;&lt;/p&gt;</description></item><item><title>Upgrading from Java 21 to 25: What Actually Breaks</title><link>https://foojay.io/today/upgrading-java-21-to-25-what-actually-breaks/</link><pubDate>Tue, 20 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/upgrading-java-21-to-25-what-actually-breaks/</guid><description>&lt;p&gt;Most &amp;ldquo;what&amp;rsquo;s new in Java 25&amp;rdquo; articles are about what you gain: Scoped Values, flexible constructor bodies, compact source files, Stream Gatherers. This one is about the other side of an LTS-to-LTS upgrade, the things that stop working.&lt;/p&gt;&#10;&lt;p&gt;Four years of releases sit between Java 21 and Java 25, and some of what was deprecated in 21 has been removed by 25. Some of it fails loudly, at startup. Some of it fails silently, which is worse: the build is green, the app starts, and the bug shows up a week later.&lt;/p&gt;</description></item><item><title>Foojay Podcast #103: Killing Reflection at Build Time with Dmitry Moskalyuk and Shai Almog</title><link>https://foojay.io/today/foojay-podcast-103/</link><pubDate>Mon, 19 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/foojay-podcast-103/</guid><description>&lt;p&gt;Runtime reflection is one of those quiet taxes on the JVM: it is flexible, it is everywhere, and it is easy to stop noticing it until you go looking for where your CPU is actually going. In this episode, two teams from completely different corners of the ecosystem explain how they went looking and ended up at the same answer: push the work to build time.&lt;/p&gt;&#10;&lt;p&gt;Dmitry Moskalyuk is a new author on Foojay. His article &amp;ldquo;&lt;a href="https://foojay.io/today/reflection-free-serialization-on-the-jvm-four-formats-in-avro-out/"&gt;Reflection-Free Serialization on the JVM: Four Formats In, Avro Out&lt;/a&gt;&amp;rdquo; describes a model layer that ingests JSON, XML, YAML and TOML and converts everything to Avro, and the choice between Jackson and kotlinx.serialization that came down to where the reflection cost hides, and where it does not. Shai Almog has been &lt;a href="https://foojay.io/today/author/shai-almog/"&gt;writing on Foojay since 2021&lt;/a&gt; and works on a build-time code generation pipeline for Codename One, with the goal of &amp;ldquo;no reflection, no service loader, no Class.forName&amp;rdquo;.&lt;/p&gt;</description></item><item><title>Lottie4J 1.2.7: A Performance Release</title><link>https://foojay.io/today/lottie4j-1-2-7-a-performance-release/</link><pubDate>Sun, 18 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/lottie4j-1-2-7-a-performance-release/</guid><description>&lt;div class="paragraph"&gt;&#10;&lt;p&gt;A new version of &lt;a href="https://lottie4j.com/"&gt;Lottie4J&lt;/a&gt;, the Java and JavaFX library to render Lottie animations, is available. &lt;a href="https://lottie4j.com/status/2026/20261014-release-1.2.7/"&gt;Release 1.2.7&lt;/a&gt; doesn’t bring new features, but focuses fully on performance.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="admonitionblock important"&gt;&#10;&lt;table&gt;&#10;&lt;tbody&gt;&lt;tr&gt;&#10;&lt;td class="icon"&gt;&#10;&lt;div class="title"&gt;Important&lt;/div&gt;&#10;&lt;/td&gt;&#10;&lt;td class="content"&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;&lt;strong&gt;USE 1.2.8&lt;/strong&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;The reuse of snapshot images in the matte renderer introduced a regression: animations with track mattes of different sizes could show horizontal streaks during playback (&lt;a href="https://github.com/lottie4j/lottie4j/issues/12"&gt;issue #12&lt;/a&gt;). This is fixed in &lt;a href="https://lottie4j.com/releases/#2026-10-15-128"&gt;Lottie4J 1.2.8&lt;/a&gt;, so please use that version instead of 1.2.7.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;/tbody&gt;&lt;/table&gt;&#10;&lt;/div&gt;</description></item><item><title>Pi4J V5.0.0: Work in Progress</title><link>https://foojay.io/today/pi4j-v5-work-in-progress/</link><pubDate>Sat, 17 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/pi4j-v5-work-in-progress/</guid><description>&lt;h2 id="what-is-pi4j"&gt;What is Pi4J?&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://www.pi4j.com/" target="_blank" rel="noopener noreferrer"&gt;Pi4J&lt;/a&gt; is an open-source Java library that gives your Java application access to the hardware pins of a Raspberry Pi and other single-board computers. With it, you can blink an LED, read a button, or talk to sensors, displays, and motor controllers over GPIO, PWM, I2C, SPI, and serial, all from plain Java code and without writing any C. The project started more than ten years ago, is now part of the &lt;a href="https://www.pi4j.com/blog/2026/20260227-pi4j-commonhaus/" target="_blank" rel="noopener noreferrer"&gt;Commonhaus Foundation&lt;/a&gt;, and is maintained by a small team of volunteers.&lt;/p&gt;</description></item><item><title>A Smaller, Faster Java Server with a Spring-Style API</title><link>https://foojay.io/today/java-server-work-before-startup/</link><pubDate>Fri, 16 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/java-server-work-before-startup/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/java-server-work-before-startup/java-server-work-before-startup-d9b84f58b7.jpg" alt="Java server wiring moves from startup into the build" width="1024" height="512" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;What do you pay for Spring and Java&amp;rsquo;s dynamic architecture? Can you deliver the same API without the same runtime cost?&lt;/p&gt;&#10;&lt;aside style="border-left: 4px solid #007aff; padding: 14px 18px; margin: 24px 0; border-radius: 4px; font-size: 0.95em;"&gt;&lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/"&gt;codenameone.com&lt;/a&gt;.&lt;/aside&gt;&#10;&lt;p&gt;For a small service, you might want dependency injection, transactions and scheduled jobs without a long startup or a large deployment. That is the case our native Java backend is trying to make. Write a controller and a service, compile their wiring into the application, then deploy a native executable.&lt;/p&gt;</description></item><item><title>Apple Shouldn't Dictate Your App's Redesign Schedule</title><link>https://foojay.io/today/who-decides-your-app-redesign/</link><pubDate>Fri, 16 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/who-decides-your-app-redesign/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/who-decides-your-app-redesign/who-decides-your-app-redesign-e9b18f15b8.jpg" alt="Apple designs iOS; you choose your redesign schedule" width="1024" height="512" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;Apple&amp;rsquo;s design team doesn&amp;rsquo;t know what&amp;rsquo;s on your backlog. A new iOS appearance might be exactly what you want for your next release. It might also arrive halfway through a customer rollout, when changing the navigation is the last thing you need.&lt;/p&gt;&#10;&lt;aside style="border-left: 4px solid #007aff; padding: 14px 18px; margin: 24px 0; border-radius: 4px; font-size: 0.95em;"&gt;&lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/"&gt;codenameone.com&lt;/a&gt;.&lt;/aside&gt;&#10;&lt;p&gt;We want to support the new SDK without making that decision for you. This week, you can select Xcode 27 on our build servers with the returning &lt;code&gt;ios.xcode_version&lt;/code&gt; hint. Local builds and CI also support Xcode 27, and our iOS 27 theme gets more detailed Liquid Glass effects. You choose when to adopt that appearance. Codename One renders most controls itself, so the theme ships with your app. Updating the SDK can leave that theme and your application CSS in place.&lt;/p&gt;</description></item><item><title>Build Your First SaaS with MongoDB Ephemeral Clusters</title><link>https://foojay.io/today/build-your-first-saas-with-mongodb-ephemeral-clusters/</link><pubDate>Fri, 16 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/build-your-first-saas-with-mongodb-ephemeral-clusters/</guid><description>&lt;p&gt;It&amp;rsquo;s a new world. A prototype that once meant hours or days of setup can now be up and running in minutes. With one API call, an AI agent can create a MongoDB Atlas cluster from your IDE, so you can start building without stopping to navigate account setup, cloud choices, regions, or cluster configuration.&lt;/p&gt;&#10;&lt;p&gt;In this tutorial, you will use an &lt;a href="https://www.mongodb.com/products/tools/atlas-ephemeral-clusters/" target="_blank" rel="noopener noreferrer"&gt;Atlas Ephemeral Cluster&lt;/a&gt; to build a polished job-application tracker: a small SaaS where a user manages applications on a Kanban board. The application is deliberately simple. The point is the workflow: give an agent a real database immediately, validate an idea quickly, and claim the cluster only when the prototype is worth keeping.&lt;/p&gt;</description></item><item><title>Lightweight Spring Boot Monitoring Without Prometheus and Grafana</title><link>https://foojay.io/today/lightweight-spring-boot-monitoring/</link><pubDate>Thu, 15 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/lightweight-spring-boot-monitoring/</guid><description>&lt;p&gt;Running one Spring Boot application or a handful of them on a VPS still calls for basic operational visibility. You need to know whether an application is reachable, whether errors are rising, and whether it restarted. You may not need a complete monitoring platform to answer those questions.&lt;/p&gt;&#10;&lt;p&gt;Spring Boot Actuator already exposes much of that information through its health endpoint and Micrometer metrics. &lt;a href="https://github.com/PVRLabs/statlite" target="_blank" rel="noopener noreferrer"&gt;StatLite&lt;/a&gt; turns it into a focused dashboard for health, requests, errors, latency, memory, uptime, and restarts. It runs as one Go binary and stores its history in SQLite.&lt;/p&gt;</description></item><item><title>Scraping websites and bot-protection</title><link>https://foojay.io/today/bypass-bot-protection/</link><pubDate>Thu, 15 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/bypass-bot-protection/</guid><description>&lt;p&gt;While searching for my ancestors, I had to access data from many different websites. I noticed there were different levels of protection against automated access depending on the site. In this post, I&amp;rsquo;ll list them and mention countermeasures you can take to bypass them anyway.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; As a private person using the data for my own personal use, I have no qualms about bypassing the protection. It can be considered fair use. However, I don&amp;rsquo;t know about your context, and I&amp;rsquo;m not saying you should. Scrape responsibly.&lt;/p&gt;</description></item><item><title>One Embedding per Job, or Two? Measuring Semantic Search in a Spring Boot Job Portal</title><link>https://foojay.io/today/embedding-strategies-job-search/</link><pubDate>Wed, 14 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/embedding-strategies-job-search/</guid><description>&lt;p&gt;This job portal started as a practice project. I built it after college, mostly so I&amp;rsquo;d have something to put on my resume. Recently I picked it up again. I was job hunting myself, looking for a switch, and it struck me that I should develop it properly, and maybe even launch it someday.&lt;/p&gt;&#10;&lt;p&gt;The first thing that bothered me was search. The results just weren&amp;rsquo;t good, so I started reading about how to make them better.&lt;/p&gt;</description></item><item><title>What I Learned Building an AI Code Reviewer with Java and Spring Boot</title><link>https://foojay.io/today/what-i-learned-building-an-ai-code-reviewer-with-java-spring-boot/</link><pubDate>Wed, 14 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/what-i-learned-building-an-ai-code-reviewer-with-java-spring-boot/</guid><description>&lt;p&gt;AI-assisted coding has changed how quickly developers can write software.&lt;/p&gt;&#10;&lt;p&gt;But that creates another question:&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;How do you review all that generated code effectively?&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;That question led me to build CodeGuard AI, a self-hosted AI code-review application for GitHub Pull Requests using Java and Spring Boot.&lt;/p&gt;&#10;&lt;p&gt;At first, the architecture seemed simple:&lt;/p&gt;&#10;&lt;pre class="EnlighterJSRAW" data-enlighter-language="generic"&gt;GitHub Pull Request&#10; ↓&#10; LLM&#10; ↓&#10; Review&lt;/pre&gt;&lt;p&gt;In practice, that wasn&amp;rsquo;t enough.&#10;The interesting engineering work was everything around the model: collecting useful Pull Request context, defining review instructions, structuring the model response, assessing findings, and integrating the result back into the GitHub workflow.&#10;This article explains what I learned while building that workflow.&lt;/p&gt;</description></item><item><title>What's New In The October 2026 Azul Payara Release?</title><link>https://foojay.io/today/whats-new-in-the-october-2026-azul-payara-release/</link><pubDate>Wed, 14 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/whats-new-in-the-october-2026-azul-payara-release/</guid><description>&lt;p&gt;The October 2026 release brings Payara Community 7.2026.10, as well as Azul Payara Server &amp;amp; Micro 7.5.0, 6.43.0, 5.92.0 &amp;amp; 4.1.2.191.60.&lt;/p&gt;&#10;&lt;p&gt;The headline for Payara Community is day-to-day operations. SSH nodes no longer require elevated permissions, two new commands, delete-jvm-option and delete-system-properties, make configuration easier to manage from the command line, and a run of fixes resolves problems that show up in real deployments, from applications failing to deploy after a domain restart to concurrent deployments failing. Three of the changes in this release were contributed by the community (thank you!).&lt;/p&gt;</description></item><item><title>Introduction to Error Prone: How to Catch Bugs at Compile Time</title><link>https://foojay.io/today/introduction-to-error-prone-how-to-catch-bugs-at-compile-time/</link><pubDate>Tue, 13 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/introduction-to-error-prone-how-to-catch-bugs-at-compile-time/</guid><description>&lt;p&gt;The Java compiler&amp;rsquo;s job is to check whether code follows the rules of the language. Trying to remove an element from a collection that can never contain it, or using the wrong letter in a date pattern, does not break those rules, so nothing stops the code from compiling. In short, any code that follows the rules compiles, even when it does not do what its author intended.&lt;/p&gt;&#10;&lt;h2 id="what-is-error-prone"&gt;What is Error Prone?&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://errorprone.info/" target="_blank" rel="noopener noreferrer"&gt;Error Prone&lt;/a&gt; is an open source static analysis tool that Google built to fill this gap. Unlike most static analysis tools, it does not run as a separate step; it plugs into &lt;code&gt;javac&lt;/code&gt; as a plugin. Using the information the compiler produces while analyzing the code, it looks for patterns that follow the rules of the language but are most likely wrong, and reports them as compiler warnings or errors.&lt;/p&gt;</description></item><item><title>Testing Jakarta EE: Three Layers, Three Tools</title><link>https://foojay.io/today/testing-jakarta-ee-three-layers-three-tools/</link><pubDate>Mon, 12 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/testing-jakarta-ee-three-layers-three-tools/</guid><description>&lt;p&gt;Testing a Jakarta EE application is awkward because the behaviour you care about often doesn&amp;rsquo;t exist until a container assembles it. Mock everything and your tests pass while proving very little. Deploy everything and you get slow scenarios nobody runs during development.&lt;/p&gt;&#10;&lt;p&gt;A recent three-part series by Simon Laden, &lt;em&gt;Testing Jakarta EE: Three Layers, Three Tools&lt;/em&gt;, shows how WeldInitiator, Arquillian and Testcontainers each answer a different question. All three parts run on the same example project, &lt;a href="https://github.com/payara/Payara-Examples/tree/main/ecosystem/testcontainers-example" target="_blank" rel="noopener noreferrer"&gt;testcontainers-example&lt;/a&gt;, a small library management system running on Azul Payara Micro. Here is a quick guide to the series.&lt;/p&gt;</description></item><item><title>Your agents don't need an LLM to negotiate</title><link>https://foojay.io/today/your-agents-dont-need-an-llm-to-negotiate/</link><pubDate>Mon, 12 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/your-agents-dont-need-an-llm-to-negotiate/</guid><description>&lt;p&gt;In agents that negotiate, the negotiating usually ends up inside a language model. You describe&#10;the situation in a prompt, the model answers, and you parse what comes back. It works, and it&#10;costs a network round trip and a line on a bill for every decision.&lt;/p&gt;&#10;&lt;p&gt;For the narrow case of handing work to whoever should do it, there&amp;rsquo;s a protocol that predates&#10;all of this. It&amp;rsquo;s called Contract Net, and it&amp;rsquo;s small enough to read in an afternoon.&#10;&lt;a href="https://github.com/mauro-mura/agenor" target="_blank" rel="noopener noreferrer"&gt;Agenor&lt;/a&gt; ships it. The example below has a manager hand a job to one of three workers in a single JVM, and its imports&#10;contain nothing from any model provider.&lt;/p&gt;</description></item><item><title>Media Partner for OCX27 and jChampions Conference 2027</title><link>https://foojay.io/today/media-partner-for-ocx27-and-jchampions-conference/</link><pubDate>Sun, 11 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/media-partner-for-ocx27-and-jchampions-conference/</guid><description>&lt;p&gt;Foojay is proud to be a media partner for two very different, but equally&#10;great, events coming up: &lt;strong&gt;OCX 2027&lt;/strong&gt; in Brussels and the fully online&#10;&lt;strong&gt;jChampions Conference 2027&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;h2 id="ocx-2027"&gt;OCX 2027&lt;/h2&gt;&#10;&lt;p&gt;We&amp;rsquo;re excited to be a media partner of &lt;a href="https://ocxconf.org/" target="_blank" rel="noopener noreferrer"&gt;Open Community Experience&#10;(OCX) 2027&lt;/a&gt;. From &lt;strong&gt;13–15 April 2027&lt;/strong&gt;, developers,&#10;maintainers, researchers, engineering leaders, and open source communities&#10;from around the world will meet at &lt;strong&gt;Tour &amp;amp; Taxis&lt;/strong&gt; in Brussels, Belgium.&lt;/p&gt;</description></item><item><title>Keep WordPress If You're Looking for Trouble... Or Read This!</title><link>https://foojay.io/today/keep-wordpress-if-youre-looking-for-trouble/</link><pubDate>Sat, 10 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/keep-wordpress-if-youre-looking-for-trouble/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;&lt;em&gt;I wrote this article by hand. AI was used to review grammar, style, and fact-check the data.&lt;/em&gt;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;WordPress made it easy for anyone to build a website. So easy that &lt;a href="https://w3techs.com/technologies/details/cm-wordpress" target="_blank" rel="noopener noreferrer"&gt;43% of the web&lt;/a&gt; runs on it. Twenty years later, it&amp;rsquo;s just as easy for anyone to break into one. If that sounds dramatic, keep reading. You can also &lt;a href="https://foojay.io/today/foojay-podcast-102/"&gt;listen to our podcast&lt;/a&gt; on the topic.&lt;/p&gt;&#10;&lt;p&gt;11K plugin vulnerabilities in 2025/26 (+42% YoY), exploit time on critical vulnerabilities: 5 hours (&lt;a href="https://patchstack.com/whitepaper/state-of-wordpress-security-in-2026/" target="_blank" rel="noopener noreferrer"&gt;source&lt;/a&gt;). The question is not if they can pwn your website, it is when.&lt;/p&gt;</description></item><item><title>How to Create Agent Skills: Tools, Testing, and Installation</title><link>https://foojay.io/today/how-to-create-test-install-agent-skills/</link><pubDate>Fri, 09 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/how-to-create-test-install-agent-skills/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;In short.&lt;/strong&gt; Start with a task that keeps coming up and turn it into a Skill with &lt;code&gt;superpowers:writing-skills&lt;/code&gt;. While creating it, test scenarios with and without the Skill, and validate the structure of &lt;code&gt;SKILL.md&lt;/code&gt;. Then use the Skill on several real tasks. If it consistently helps, share it with your team through a Skills repository or a Plugin.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Creating your first Agent Skill is easy. Make a folder, put a &lt;code&gt;SKILL.md&lt;/code&gt; file in it, and write a few instructions.&lt;/p&gt;</description></item><item><title>Introducing cbGenesis: The AI-Native ColdBox Starter for BoxLang</title><link>https://foojay.io/today/introducing-cbgenesis-ai-native-coldbox-starter-for-boxlang/</link><pubDate>Fri, 09 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/introducing-cbgenesis-ai-native-coldbox-starter-for-boxlang/</guid><description>&lt;p&gt;&lt;strong&gt;Ortus Solutions today announces the general availability of &lt;a href="https://cbgenesis.coldbox.org" target="_blank" rel="noopener noreferrer"&gt;cbGenesis 1.0&lt;/a&gt;, a production-ready ColdBox HMVC starter template for BoxLang, and the first one designed from day one to be built &lt;em&gt;with&lt;/em&gt; an AI coding agent, not just &lt;em&gt;by&lt;/em&gt; one.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;&#10;&#9;&#9;&#9;&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/wbiZTAPrYQs?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="Introducing cbGenesis"&gt;&lt;/iframe&gt;&#10;&#9;&#9;&lt;/div&gt;&#10;&#10;&lt;p&gt;For twenty years, &lt;strong&gt;ColdBox&lt;/strong&gt; has been one of the most battle-tested HMVC frameworks in the CFML and BoxLang world. &lt;strong&gt;cbGenesis&lt;/strong&gt; takes that foundation and ships the part every team rebuilds by hand: authentication, permissions, security hardening, an admin panel, tests, and the guidance an AI agent needs to extend all of it correctly.&lt;/p&gt;</description></item><item><title>We Didn't Want to Build Another Java Server</title><link>https://foojay.io/today/why-another-java-server/</link><pubDate>Fri, 09 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/why-another-java-server/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/why-another-java-server/why-another-java-server-f8959ffdf0.jpg" alt="Small servers, one Java stack" width="1024" height="512" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;h2 id="why-build-another-java-server"&gt;Why Build Another Java Server?&lt;/h2&gt;&#10;&lt;aside style="border-left: 4px solid #007aff; padding: 14px 18px; margin: 24px 0; border-radius: 4px; font-size: 0.95em;"&gt;&lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/"&gt;codenameone.com&lt;/a&gt;.&lt;/aside&gt;&#10;&lt;p&gt;The last thing we wanted to build was another Java server framework. We have Spring, Micronaut, Quarkus, and enough ways to answer an HTTP request to fill a conference schedule.&lt;/p&gt;</description></item><item><title>Introducing Jenesis: You Already Wrote the Build Script</title><link>https://foojay.io/today/introducing-jenesis/</link><pubDate>Thu, 08 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/introducing-jenesis/</guid><description>&lt;p&gt;Over the last decade, Java has changed considerably. The language gained modules, records and virtual threads, and the platform moved to a release every six months. The way we build Java applications, however, has barely changed. A &lt;code&gt;pom.xml&lt;/code&gt; or a &lt;code&gt;build.gradle.kts&lt;/code&gt; still restates what the code already declares, such as the project&amp;rsquo;s name, its dependencies and its main class. On top of that, every step beyond the defaults adds a block of configuration and typically another plugin, until the build has become a second program that needs to be maintained beside the first. And before a single line of code is compiled, a wrapper first downloads the build tool itself, which in the case of Gradle are 152 MB. This article introduces Jenesis, a build tool that I have written to approach this problem from a different angle.&lt;/p&gt;</description></item><item><title>try.boxlang.io Now Runs Every BoxLang Version, With or Without CFML</title><link>https://foojay.io/today/tryboxlang/</link><pubDate>Thu, 08 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/tryboxlang/</guid><description>&lt;p&gt;The &lt;a href="https://try.boxlang.io/" target="_blank" rel="noopener noreferrer"&gt;BoxLang playground&lt;/a&gt; now lets you choose among released BoxLang versions and switch CFML compatibility on or off without installing a runtime or setting up containers. Choose a version, enter a snippet, and run it in the browser.&lt;/p&gt;&#10;&lt;p&gt;Behind the editor is a serverless implementation on AWS Lambda. Each combination of BoxLang version and compatibility mode is built from one repository and deployed as an isolated function. Here&amp;rsquo;s what changed and how that arrangement works.&lt;/p&gt;</description></item><item><title>Adding RAG to a Jakarta EE 11 App With Only the JDK and Jakarta Specs</title><link>https://foojay.io/today/adding-rag-to-jakarta-ee-11-app/</link><pubDate>Wed, 07 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/adding-rag-to-jakarta-ee-11-app/</guid><description>&lt;p&gt;The standard story about AI in the enterprise goes something like this. Your app needs AI, so you spin up a Python service. You add a vector database like Pinecone or Weaviate. You pick an orchestration framework. You now have two deployment pipelines, two languages, and two teams. The original Java monolith that handled your business logic just fine becomes one half of a distributed system that exists mostly to connect to the other half.&lt;/p&gt;</description></item></channel></rss>