<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Java on foojay.io - Friends Of OpenJDK</title><link>https://foojay.io/today/category/java/</link><description>Recent content in Java 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/category/java/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>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>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>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>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>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>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><item><title>Green Build, Wrong Task: A Working Agreement for Java Teams Using AI Coding Agents</title><link>https://foojay.io/today/green-build-wrong-task-a-working-agreement-for-java-teams-using-ai-coding-agents/</link><pubDate>Wed, 07 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/green-build-wrong-task-a-working-agreement-for-java-teams-using-ai-coding-agents/</guid><description>&lt;p&gt;You open a pull request. &lt;code&gt;./gradlew check&lt;/code&gt; is green, the diff is 400 lines, the description says &amp;ldquo;added tests as requested&amp;rdquo;. You scroll and see a dozen unit tests for one service class. What you asked for, in a two-line Jira comment, was end-to-end coverage of the checkout flow.&lt;/p&gt;&#10;&lt;p&gt;Nobody lied. The agent filled a gap in the request with the most likely reading and got to work. This is the first of three failure modes our team went through in a webinar on September 28. I am writing it up because the fixes turned out to be boring and mechanical, and they work with whatever agent your team has already installed.&lt;/p&gt;</description></item><item><title>Real-Time Fraud Detection in Java with Kafka Streams and Vector Similarity</title><link>https://foojay.io/today/real-time-fraud-detection-kafka-vector-similarity/</link><pubDate>Wed, 07 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/real-time-fraud-detection-kafka-vector-similarity/</guid><description>&lt;p&gt;&lt;em&gt;This content is based on a talk that my colleague Tim Kelly and I presented at &lt;a href="https://devnexus.com/events/real-time-fraud-detection-in-java-with-kafka-streams-vector-similarity" target="_blank" rel="noopener noreferrer"&gt;DevNexus 2026&lt;/a&gt; in Atlanta, one of the largest Java conferences in the world.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;Imagine you&amp;rsquo;re at a supermarket or shopping online. You tap your card or click &amp;ldquo;Buy Now&amp;rdquo;. In that exact moment, your bank has to make a decision: is this transaction legitimate, or is it fraud? And it has to do that in milliseconds, and get it right. If it blocks a real transaction, it frustrates the customer. If it approves a fraudulent one, it leads to financial loss. So the question is: how do banks actually do this? What&amp;rsquo;s happening behind the scenes? In this article, we&amp;rsquo;ll explore a real-world approach to solving this problem using Java, Apache Kafka, Kafka Streams, and vector similarity with MongoDB.&lt;/p&gt;</description></item><item><title>Building a Code Editor Control in JavaFX</title><link>https://foojay.io/today/building-a-javafx-code-editor-control/</link><pubDate>Tue, 06 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/building-a-javafx-code-editor-control/</guid><description>&lt;p&gt;JavaFX doesn&amp;rsquo;t ship with a code-editor control, and &lt;code&gt;TextArea&lt;/code&gt; isn&amp;rsquo;t built to grow into one — no per-character styling, no gutter, no virtualization tuned for thousands of lines. Building a real one means going back to &lt;code&gt;Control&lt;/code&gt; + &lt;code&gt;Skin&lt;/code&gt; and constructing the editor surface yourself. This post walks through several pieces of a custom editor control.&lt;/p&gt;&#10;&lt;h2 id="the-core-idea-two-virtualized-lists-not-one"&gt;The core idea: two virtualized lists, not one&lt;/h2&gt;&#10;&lt;p&gt;The instinctive design is a single &lt;code&gt;ListView&amp;lt;String&amp;gt;&lt;/code&gt;, one row per line, with each row containing both the line number and the code. This approach has a drawback: when the user scrolls horizontally, the line numbers disappear.&lt;/p&gt;</description></item><item><title>Run Java in the Browser with TeaVM</title><link>https://foojay.io/today/java-in-the-browser-with-teavm/</link><pubDate>Tue, 06 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/java-in-the-browser-with-teavm/</guid><description>&lt;p&gt;There’s something satisfying about editing a line of Java on a web page, clicking &lt;strong&gt;Run&lt;/strong&gt;, and seeing the result appear right there in the browser. I use this approach for the live Java snippets at &lt;a href="https://nablatensor.com/learn" target="_blank" rel="noopener noreferrer"&gt;nablatensor.com/learn&lt;/a&gt; and for source code used to bootstrap &lt;a href="https://nablatensor.com/quantlab" target="_blank" rel="noopener noreferrer"&gt;nablatensor.com/quantlab&lt;/a&gt;. In this article, I’ll explain how the pieces fit together and walk you through a React app you can run yourself.&lt;/p&gt;&#10;&lt;h2 id="from-java-source-to-a-result"&gt;From Java source to a result&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://teavm.org/docs/intro/overview.html" target="_blank" rel="noopener noreferrer"&gt;TeaVM&lt;/a&gt; compiles Java bytecode into JavaScript or WebAssembly for the browser. To let readers edit and compile the examples, I use &lt;a href="https://github.com/Vsprocessing/teavm-javac" target="_blank" rel="noopener noreferrer"&gt;teavm-javac&lt;/a&gt;, which brings a Java compiler into the browser as well. &lt;strong&gt;Compilation happens directly in the reader&amp;rsquo;s browser:&lt;/strong&gt; the edited source is sent to a Web Worker in the same tab, without sending a compilation request to a server.&lt;/p&gt;</description></item><item><title>Foojay Podcast #102: Why Foojay Walked Away From WordPress for Static Sites</title><link>https://foojay.io/today/foojay-podcast-102/</link><pubDate>Mon, 05 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/foojay-podcast-102/</guid><description>&lt;p&gt;Foojay.io quietly moved off WordPress and onto Hugo, a static site generator. No more CMS login, no database, no admin panel — just Markdown and AsciiDoc files, built and deployed straight from GitHub. In this episode we dig into why that move happened, and into the bigger question behind it: is a traditional CMS still the right way to run a content site in 2026, or has static tooling caught up? Along the way we go through the real security numbers behind WordPress&amp;rsquo;s plugin ecosystem — more than 10,000 vulnerabilities found in WordPress plugins since 2025 alone — and put very different static site generators head to head: Hugo and Jekyll, the veterans, versus Roq, the Java-and-Quarkus-based newcomer.&lt;/p&gt;</description></item><item><title>Changes Included in Release 26.08 of Azul Zing Builds of OpenJDK</title><link>https://foojay.io/today/changes-included-in-release-26-08-of-azul-zing-builds-of-openjdk/</link><pubDate>Fri, 02 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/changes-included-in-release-26-08-of-azul-zing-builds-of-openjdk/</guid><description>&lt;p&gt;Azul Zing Builds of OpenJDK, the optimized Java runtime within &lt;a href="https://www.azul.com/products/prime" target="_blank" rel="noopener noreferrer"&gt;Azul Platform Prime&lt;/a&gt;, has reached the release of the 26.08 Stable Release line. This Stable Build represents an August 2026 promotion from Stream to Stable status, consolidating six months of Stream Build work into a single, supported release line. The headline addition is &lt;strong&gt;Compilation Streaming&lt;/strong&gt;, which lets a JVM download pre-compiled code from Azul Optimizer Hub at startup instead of waiting on its own JIT compilation queue.&lt;/p&gt;</description></item><item><title>Announcing 'Skinning JavaFX Applications'</title><link>https://foojay.io/today/announcing-skinning-javafx-applications/</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/announcing-skinning-javafx-applications/</guid><description>&lt;p&gt;If you&amp;rsquo;ve ever tried to make a JavaFX application look like Microsoft or JetBrains, you know that CSS is not enough. &lt;em&gt;Skinning JavaFX Applications&lt;/em&gt; is my attempt to close that gap — a practical, code-first book built from years of shipping real desktop business applications.&lt;/p&gt;&#10;&lt;p&gt;The main purpose of this book is to cover the Control-Skin architecture, so you can create your own custom controls and skins. We&amp;rsquo;ll cover how to implement custom window chrome, runtime theme switching, Fluent Design materials like Mica and Acrylic, and a full set of micro-interactions.&lt;/p&gt;</description></item><item><title>Lathe: A Java Language Server That Works Straight From Your Maven Build</title><link>https://foojay.io/today/lathe-a-java-language-server-from-your-maven-build/</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/lathe-a-java-language-server-from-your-maven-build/</guid><description>&lt;p&gt;I have written Java in many editors and IDEs over the years, and they all seem to struggle with the same&#10;thing.&lt;/p&gt;&#10;&lt;p&gt;For me, the hard part of a Java IDE or language server was never the code intelligence. It was getting&#10;the project structure right. The IDE reads your build files and then tries to guess the module&#10;structure from them. And over time, Java&amp;rsquo;s compiler and runtime configuration has become more and more&#10;complex: annotation processors, the module system, and more. So you often end up in a familiar place:&#10;the code compiles and runs in the build, but not in the IDE. Even the best ones tend to break the&#10;project setup after an upgrade.&lt;/p&gt;</description></item><item><title>Durable Execution Is a Property, Not a Product</title><link>https://foojay.io/today/durable-execution-is-a-property-not-a-product/</link><pubDate>Wed, 30 Sep 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/durable-execution-is-a-property-not-a-product/</guid><description>&lt;p&gt;Three method calls. That is my entire workflow: charge a payment, reserve inventory, send a confirmation email.&lt;/p&gt;&#10;&lt;p&gt;Run those three calls on a dedicated workflow engine and here is what happens before your business logic is done: 23 history events are appended, 15 durable state transitions are committed to a database, and 15 gRPC round trips travel between your worker and the orchestration cluster.&lt;/p&gt;&#10;&lt;p&gt;That, in one paragraph, is why I want to talk about durable execution. Not because the engines are bad. They are impressive systems built by serious engineers. I want to talk about it because the Java community is being sold a property as if it were a product, and I think most of us already own the property.&lt;/p&gt;</description></item></channel></rss>