<?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>Thu, 24 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://foojay.io/today/index.xml" rel="self" type="application/rss+xml"/><item><title>Diagrams as Code: Mermaid Support on the new Foojay</title><link>https://foojay.io/today/diagrams-as-code-mermaid-support-on-foojay/</link><pubDate>Thu, 24 Sep 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/diagrams-as-code-mermaid-support-on-foojay/</guid><description>&lt;p&gt;Some things are much easier to show than to describe. A request travelling&#10;through three services, a class hierarchy, the states a connection moves&#10;through: a paragraph explaining it takes real effort to write and still leaves&#10;the reader assembling the picture themselves.&lt;/p&gt;&#10;&lt;p&gt;The usual answer is to open a drawing tool, export a PNG, and drop it in the&#10;article folder. That works, and it is what most Foojay articles have done so&#10;far. It also means the diagram is now a binary file that nobody can review,&#10;nobody can correct a typo in, and nobody can update without finding the original&#10;file again, assuming they still have it.&lt;/p&gt;</description></item><item><title>AsciiDoc Support on the new Foojay</title><link>https://foojay.io/today/asciidoc-support-on-foojay/</link><pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/asciidoc-support-on-foojay/</guid><description>&lt;div class="paragraph"&gt;&#10;&lt;p&gt;Markdown is a good default. It is easy to write, everybody already knows it, and for most articles it is exactly enough.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;For some articles it is not. If you have ever wanted to put a caption on a code block, number the interesting lines and explain them underneath, or set a warning apart from the paragraph before it, you have found the limits of Markdown.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="paragraph"&gt;&#10;&lt;p&gt;Large parts of the Java ecosystem document in&#10;&lt;a href="https://asciidoc.org/"&gt;AsciiDoc&lt;/a&gt; for exactly this reason. So posts here on the new Hugo-driven Foojay, can now be written in it too.&#10;Thanks to &lt;a href="https://foojay.io/today/author/brice-dutheil/"&gt;Brice Dutheil&lt;/a&gt; for requesting&#10;this feature, and for naming exactly which parts of it he uses. And of course, &lt;a href="https://github.com/foojayio/website/blob/main/content/posts/2026/09/23/asciidoc-support-on-foojay/index.adoc"&gt;this post is written in AsciiDoc&lt;/a&gt; to show it off!&lt;/p&gt;&#10;&lt;/div&gt;</description></item><item><title>Announcing The New Foojay</title><link>https://foojay.io/today/announcing-the-new-foojay/</link><pubDate>Tue, 22 Sep 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/announcing-the-new-foojay/</guid><description>&lt;p&gt;Foojay has moved, but the address stays exactly where it was, just like every URL you have bookmarked, linked or cited. Everything behind that address is&#10;new. Foojay is now a static site, its entire content lives in a public Git&#10;repository, and publishing an article is a pull request.&lt;/p&gt;&#10;&lt;p&gt;If you only read one paragraph: &lt;strong&gt;nothing you have written has moved, and&#10;nothing you need to do has changed, except if you want to &lt;a href="https://foojay.io/today/how-to-submit-your-next-article-on-foojay-io/"&gt;contribute content&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>World geography gotchas</title><link>https://foojay.io/today/world-geography-gotchas/</link><pubDate>Sun, 20 Sep 2026 05:51:17 +0000</pubDate><guid>https://foojay.io/today/world-geography-gotchas/</guid><description>&lt;p&gt;Years ago, a colleague of mine told me about two pockets of foreign land surrounded by Switzerland: &lt;a href="https://osm.org/go/0Ck2o6xg-" target="_blank" rel="noopener noreferrer"&gt;Campione d&amp;rsquo;Italia&lt;/a&gt; and &lt;a href="https://osm.org/go/0C1ZlDk" target="_blank" rel="noopener noreferrer"&gt;Büsingen am Hochrhein&lt;/a&gt;, respectively Italy and Germany. Both are &lt;em&gt;enclaves&lt;/em&gt; of their respective country in Swiss territory:&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;An enclave is a part of the territory of a state that is enclosed within the territory of another state. To distinguish the parts of a state entirely enclosed in a single other state, they are called true enclaves. A true enclave cannot be reached without passing through the territory of a single other state that surrounds it.&lt;/p&gt;</description></item><item><title>BoxLang 1.17.0 Released: Module Inception, CLI Checker, Jar Loading and much more!</title><link>https://foojay.io/today/boxlang-1-17-0-released-module-inception-cli-checker-jar-loading-and-much-more/</link><pubDate>Thu, 17 Sep 2026 20:20:32 +0000</pubDate><guid>https://foojay.io/today/boxlang-1-17-0-released-module-inception-cli-checker-jar-loading-and-much-more/</guid><description>&lt;p&gt;&lt;strong&gt;BoxLang has always been an extensible language. As of 1.17.0, it is a hierarchically extensible one.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://foojay.io/today/boxlang-1-17-0-released-module-inception-cli-checker-jar-loading-and-much-more/boxlang-v1.17.0-700x467.jpg" alt="" width="700" height="467" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;Modules can now contain other modules; &lt;strong&gt;aka Module Inception&lt;/strong&gt; . Recursively. To any depth. Each nested module gets its own class loader, chained to its parent&amp;rsquo;s, and BoxLang&amp;rsquo;s own &lt;code&gt;ModuleService&lt;/code&gt; discovers, registers, activates, and unloads that entire tree itself. No package manager. No build tool. No install ordering. Drop in one artifact and everything it depends on comes with it, already wired up and already isolated. &lt;strong&gt;Not only that, you can now package modules into a single jar.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>What's New In The September 2026 Azul Payara Release?</title><link>https://foojay.io/today/whats-new-in-the-september-2026-azul-payara-release/</link><pubDate>Wed, 16 Sep 2026 16:46:54 +0000</pubDate><guid>https://foojay.io/today/whats-new-in-the-september-2026-azul-payara-release/</guid><description>&lt;p&gt;The September 2026 release brings Azul Payara Server &amp;amp; Micro 7.4.0, Payara Community 7.2026.9, as well as Azul Payara Server &amp;amp; Micro 6.42.0 5.91.0 &amp;amp; 4.1.2.191.59.&lt;/p&gt;&#10;&lt;p&gt;The headline for Azul Payara is MicroProfile 7.1. It shipped in the Community release last month; this cycle it arrives on both the commercial 7 and 6 lines. That upgrade brings one change that needs reading before you upgrade: MicroProfile OpenTracing has been removed, and the specification defines no automatic migration path.&lt;/p&gt;</description></item><item><title>Can You Explain the Diff Your AI Agent Just Wrote?</title><link>https://foojay.io/today/can-you-explain-the-diff-your-ai-agent-just-wrote/</link><pubDate>Tue, 15 Sep 2026 14:12:01 +0000</pubDate><guid>https://foojay.io/today/can-you-explain-the-diff-your-ai-agent-just-wrote/</guid><description>&lt;p&gt;Every Java developer has been in a code review where the question is simple: &amp;ldquo;What does this method do?&amp;rdquo;&lt;/p&gt;&#10;&lt;p&gt;The answer used to tell you something. The developer who wrote it would describe the intent, the edge cases, the trade-off they considered and rejected. The code review was a conversation about the invariant the code protects.&lt;/p&gt;&#10;&lt;p&gt;Now the answer is sometimes: &amp;ldquo;The agent wrote it.&amp;rdquo;&lt;/p&gt;&#10;&lt;p&gt;The code compiles. The tests pass. The linter is clean. Nobody in the review can explain the architecture of the PR, including the person who submitted it.&lt;/p&gt;</description></item><item><title>How I Built an AI Assistant for My Career with Java, Spring AI, and MongoDB</title><link>https://foojay.io/today/how-i-built-an-ai-assistant-for-my-career-with-java-spring-ai-and-mongodb/</link><pubDate>Tue, 15 Sep 2026 11:51:17 +0000</pubDate><guid>https://foojay.io/today/how-i-built-an-ai-assistant-for-my-career-with-java-spring-ai-and-mongodb/</guid><description>&lt;p&gt;The best way to learn a technology is by putting it into practice in a real system.&lt;/p&gt;&#10;&lt;p&gt;A few months ago, I decided to build a virtual assistant that could answer questions about my career, help people learn more about my articles, videos, talks, and projects, and even schedule a call on my calendar.&#10;&lt;img src="https://foojay.io/today/how-i-built-an-ai-assistant-for-my-career-with-java-spring-ai-and-mongodb/unnamed-16-1024x937.png" alt="" width="1024" height="937" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;At first, the idea was simple: give the assistant access to my content and let people ask questions about it. But as the project evolved, I realized that not every question should be handled in the same way. Some questions can be answered with a direct query to the database, while others benefit from semantic search. In other cases, the assistant may need to use a tool or execute multiple steps before reaching an answer.&lt;/p&gt;</description></item><item><title>Hello Java 27! Have You Been Working Out?</title><link>https://foojay.io/today/hello-java-27-have-you-been-working-out/</link><pubDate>Tue, 15 Sep 2026 08:00:00 +0000</pubDate><guid>https://foojay.io/today/hello-java-27-have-you-been-working-out/</guid><description>&lt;p&gt;It&amp;rsquo;s been six months since we saw a new Java release, and this new edition seems to be ready to flex its muscles. With numerous improvements to performance and security, Java 27 is like that friend that you haven&amp;rsquo;t seen all summer, and when you finally see them again it&amp;rsquo;s clear that they spent a lot of time in the gym!&lt;/p&gt;&#10;&lt;p&gt;This post focuses on everything that has been added in this release, giving you a brief introduction to each of the features. Where applicable the differences with Java 26 are highlighted and a few typical use cases are provided, so that you&amp;rsquo;ll be more than ready to start using these features after reading this.&lt;/p&gt;</description></item><item><title>Foojay Podcast #101: Java 27 in Practice: Smaller Heaps, Smarter Defaults, and Valhalla on the Horizon</title><link>https://foojay.io/today/foojay-podcast-101/</link><pubDate>Mon, 14 Sep 2026 06:11:42 +0000</pubDate><guid>https://foojay.io/today/foojay-podcast-101/</guid><description>&lt;p&gt;JDK 27 arrives on 15 September 2026, and it is a feature release rather than a Long-Term Support one. That distinction matters less than it sounds: as Simon Ritter points out, all OpenJDK releases are delivered the same way, and &amp;ldquo;long-term support&amp;rdquo; is a property of the binary distributions you install, not of the platform itself. What JDK 27 does have is two changes that switch on by default and cost you nothing but the upgrade. Compact object headers shrink the per-object header from 64 bits to 32, which the JEP measures at a 22% reduction in heap and 8% in CPU on SPECjbb2015 — and because it is internal to the JVM, a JAR you built years ago benefits without a single line changing. Alongside it, G1 becomes the default garbage collector everywhere, including the small, single-core machines that used to fall back to the serial collector.&lt;/p&gt;</description></item><item><title>Come for Java. Get a Whole Lot More.</title><link>https://foojay.io/today/come-for-java-get-a-whole-lot-more/</link><pubDate>Fri, 11 Sep 2026 09:33:46 +0000</pubDate><guid>https://foojay.io/today/come-for-java-get-a-whole-lot-more/</guid><description>&lt;p&gt;JCON USA returns inside IBM TechXchange 2026 with two rooms of deep Java content, a dedicated community home, and direct access to one of the years biggest technical conferences.&lt;/p&gt;&#10;&lt;h2 id="from-orlando-to-atlanta"&gt;From Orlando to Atlanta&lt;/h2&gt;&#10;&lt;p&gt;Last year, we tried something new. We brought JCON USA into IBM TechXchange and created a Java community conference inside a much larger technology event. The result showed us that these two worlds fit together remarkably well. JCON brought the independent, developer-to-developer spirit of the Java community. TechXchange provided the scale, infrastructure, learning opportunities, and access to experts that only a major international conference can offer.&lt;/p&gt;</description></item><item><title>Reflection-Free Serialization on the JVM: Four Formats In, Avro Out</title><link>https://foojay.io/today/reflection-free-serialization-on-the-jvm-four-formats-in-avro-out/</link><pubDate>Thu, 10 Sep 2026 06:56:00 +0000</pubDate><guid>https://foojay.io/today/reflection-free-serialization-on-the-jvm-four-formats-in-avro-out/</guid><description>&lt;p&gt;I run a model layer that accepts the same business data in JSON, XML, YAML, and TOML and converts it all to Avro. The project was greenfield, so the question was never what to migrate away from. It was a question of which serialization library the layer would be built with: Jackson or kotlinx.serialization. Jackson was the safe answer, with a module for every format we needed and years of production behind it. What pulled me the other way was the assumption that runtime reflection costs real CPU under load. That turned out to be true of one Jackson path and not the other, which I will get to. The reasons the choice held up were not the reasons I made it.&lt;/p&gt;</description></item><item><title>One Base URL, Many Coding Agents: What an OpenAI-Compatible Gateway Looks Like From java.net.http</title><link>https://foojay.io/today/one-base-url-many-coding-agents-what-an-openai-compatible-gateway-looks-like-from-java-net-http/</link><pubDate>Wed, 09 Sep 2026 16:09:53 +0000</pubDate><guid>https://foojay.io/today/one-base-url-many-coding-agents-what-an-openai-compatible-gateway-looks-like-from-java-net-http/</guid><description>&lt;p&gt;Somewhere in every coding agent there is an HTTP client. Claude Code, Codex, Cursor, Cline, OpenCode: strip away the terminal UI or the editor pane and each of them serializes a conversation into JSON, POSTs it to a base URL with an API key in a header, and streams the answer back. The client owns the prompt assembly, the tool loop and the rendering; the model sits on the far side of that socket.&lt;/p&gt;</description></item><item><title>Masking a JVM thread dump without breaking the analysis</title><link>https://foojay.io/today/masking-a-jvm-thread-dump-without-breaking-the-analysis/</link><pubDate>Wed, 09 Sep 2026 07:32:00 +0000</pubDate><guid>https://foojay.io/today/masking-a-jvm-thread-dump-without-breaking-the-analysis/</guid><description>&lt;p&gt;A few weeks ago I posted on r/java about detecting virtual thread pinning from a plain thread dump. The technical discussion was fine. The comment that stuck with me had nothing to do with pinning: &amp;ldquo;the problem isn&amp;rsquo;t taking the dump, it&amp;rsquo;s that uploading a production dump to a third-party site is against policy&amp;rdquo;. Not a preference. Policy. And the person saying it was right.&lt;/p&gt;&#10;&lt;p&gt;I run ThreadMine, a hosted thread dump analyzer, so that comment describes my own product. This article is about what I built in response: a small open-source CLI that rewrites the dump on your machine before it goes anywhere, in a way that keeps the analysis working. It&amp;rsquo;s called &lt;code&gt;tm-anon&lt;/code&gt;, it&amp;rsquo;s MIT, and it works with any analyzer, mine included. The interesting part isn&amp;rsquo;t the tool, it&amp;rsquo;s the constraint: you can&amp;rsquo;t just strip everything, because the analyzer needs most of what&amp;rsquo;s in there.&lt;/p&gt;</description></item><item><title>Debugging Is Invariant Discovery: What One Kafka Session Taught Us About AI Agents</title><link>https://foojay.io/today/debugging-is-invariant-discovery-what-one-kafka-session-taught-us-about-ai-agents/</link><pubDate>Tue, 08 Sep 2026 14:14:36 +0000</pubDate><guid>https://foojay.io/today/debugging-is-invariant-discovery-what-one-kafka-session-taught-us-about-ai-agents/</guid><description>&lt;p&gt;Every Java team has a sentence like this one somewhere:&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Any operation on a TID must go through the single asynchronous path and must not let TMS and EMV drift apart.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;It is the kind of rule that is obvious once said and invisible until then. A terminal ID (TID) in a payments system, an asynchronous pipeline that updates two downstream systems, and the requirement that the two never disagree. Nothing in the type system enforces a rule like that, and no single class owns it. Rules of this kind live between consumers, services and stores.&lt;/p&gt;</description></item><item><title>Community Spotlight: BoxLang Express Brings Node-Style HTTP to the JVM</title><link>https://foojay.io/today/community-spotlight-boxlang-express-brings-node-style-http-to-the-jvm/</link><pubDate>Tue, 08 Sep 2026 11:25:18 +0000</pubDate><guid>https://foojay.io/today/community-spotlight-boxlang-express-brings-node-style-http-to-the-jvm/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/community-spotlight-boxlang-express-brings-node-style-http-to-the-jvm/boxlang-express-700x373.jpg" alt="" width="700" height="373" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;If you&amp;rsquo;ve spent years in Spring Boot, Micronaut, or Jakarta EE, &amp;ldquo;web framework&amp;rdquo; usually means a servlet container, an embedded Tomcat or Netty, a build step, and a fat jar before anything answers a request. What if you could skip all of that and still be on the JVM?&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;BoxLang Express&lt;/strong&gt; , a new community module built entirely by developer &lt;a href="https://kisdigital.com/posts/2026/08/introducing-boxexpress--express-js-ergonomics-for-boxlang" title="Robert Zehnder of KISDigital" target="_blank" rel="noopener noreferrer"&gt;Robert Zehnder of KISDigital&lt;/a&gt;, does exactly that. It&amp;rsquo;s built directly on &lt;code&gt;com.sun.net.httpserver.HttpServer&lt;/code&gt;, a class that&amp;rsquo;s been sitting in the JDK since Java 6, so there&amp;rsquo;s no embedded server to configure and nothing extra on the classpath for the HTTP layer itself. &lt;code&gt;boxlang server.bxs&lt;/code&gt; is the whole deployment story.&lt;/p&gt;</description></item><item><title>“Commit created” — but it isn’t: why the agent’s word needs external verification, and what the mistake costs</title><link>https://foojay.io/today/commit-created-no-no-no-what-the-the-agents-word-needs-external-verification-what-the-mistake-costs/</link><pubDate>Tue, 08 Sep 2026 08:54:03 +0000</pubDate><guid>https://foojay.io/today/commit-created-no-no-no-what-the-the-agents-word-needs-external-verification-what-the-mistake-costs/</guid><description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;A detailed report reads like proof. The agent lists the files it touched, names the branch, quotes a commit hash, adds a test count and closes with &amp;ldquo;done&amp;rdquo;. The work has a shape. The shape looks right. You have six more tickets.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;The report is model output. The commit, if it exists, lives in .git. The file, if it exists, lives on disk. The build result lives in a process exit code and a run log. The chat window is none of those places, and it can only vouch for itself.&lt;/p&gt;</description></item><item><title>From OpenTelemetry to DuckDB</title><link>https://foojay.io/today/from-opentelemetry-to-duckdb/</link><pubDate>Tue, 08 Sep 2026 08:29:37 +0000</pubDate><guid>https://foojay.io/today/from-opentelemetry-to-duckdb/</guid><description>&lt;p&gt;Observability platforms generally expect you to do your analysis inside them, using their query language and their dashboards. That works for the questions you already know you have. It works less well for the ad-hoc ones: &lt;em&gt;&lt;strong&gt;a quick percentile&lt;/strong&gt;&lt;/em&gt; , &lt;em&gt;&lt;strong&gt;a pivot by status code&lt;/strong&gt;&lt;/em&gt; , or &amp;ldquo;&lt;em&gt;&lt;strong&gt;which service is actually eating the latency budget?&lt;/strong&gt;&lt;/em&gt;&amp;rdquo; once the data is in front of you.&lt;/p&gt;&#10;&lt;p&gt;This article describes a small pipeline for that kind of question. On one side is &lt;a href="https://duckdb.org" target="_blank" rel="noopener noreferrer"&gt;DuckDB&lt;/a&gt;, the in-process analytical database that reads CSV, JSON and Parquet directly. On the other is the &lt;a href="https://github.com/dash0hq/dash0-cli" target="_blank" rel="noopener noreferrer"&gt;Dash0 CLI&lt;/a&gt;, which pulls OpenTelemetry spans, logs, metrics and traces out of &lt;a href="https://www.dash0.com" target="_blank" rel="noopener noreferrer"&gt;Dash0&lt;/a&gt; and prints them as CSV or JSON.&lt;/p&gt;</description></item><item><title>Featured Foojay Authors for September 2026: Marit van Dijk and Graeme Robinson</title><link>https://foojay.io/today/featured-foojay-authors-for-september-2026/</link><pubDate>Mon, 07 Sep 2026 08:38:56 +0000</pubDate><guid>https://foojay.io/today/featured-foojay-authors-for-september-2026/</guid><description>&lt;p&gt;Foojay wouldn&amp;rsquo;t exist without the many contributions from its community, whether it&amp;rsquo;s a single post or an ongoing stream of knowledge sharing. That&amp;rsquo;s why we highlight two of them each month as &lt;strong&gt;&lt;a href="https://foojay.io/today/author/"&gt;Featured Authors&lt;/a&gt;&lt;/strong&gt;. After &lt;a href="https://foojay.io/today/author/igor-de-souza/"&gt;Igor&lt;/a&gt; and &lt;a href="https://foojay.io/today/author/steve-poole/"&gt;Steve&lt;/a&gt; in July, and &lt;a href="https://foojay.io/today/author/cristobal-escobar/"&gt;Cristobal&lt;/a&gt; and &lt;a href="https://foojay.io/today/author/shai-almog/"&gt;Shai&lt;/a&gt; in August, September belongs to &lt;strong&gt;&lt;a href="https://foojay.io/today/author/marit-van-dijk/"&gt;Marit van Dijk&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href="https://foojay.io/today/author/graeme-robinson/"&gt;Graeme Robinson&lt;/a&gt;&lt;/strong&gt;. Want to read more from either of them? Click their name to visit their Foojay author page, where you&amp;rsquo;ll find their full list of posts.&lt;/p&gt;</description></item><item><title>Bringing Raspberry Pico to Quarkus with Firmata</title><link>https://foojay.io/today/bringing-raspberry-pico-to-quarkus-with-firmata/</link><pubDate>Mon, 07 Sep 2026 06:06:42 +0000</pubDate><guid>https://foojay.io/today/bringing-raspberry-pico-to-quarkus-with-firmata/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/bringing-raspberry-pico-to-quarkus-with-firmata/pico_top-1024x267.jpg" alt="" width="1024" height="267" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;Java applications are usually associated with APIs, databases, messaging systems, and cloud infrastructure. But Java can also interact with the physical world—reading sensors, controlling LEDs, driving motors, and communicating with microcontrollers.&lt;/p&gt;&#10;&lt;p&gt;That is the goal of &lt;a href="https://github.com/igfasouza/quarkus-firmata" title="Quarkus Firmata" target="_blank" rel="noopener noreferrer"&gt;Quarkus Firmata&lt;/a&gt;, a new Quarkus extension that connects Quarkus applications to Firmata-compatible boards such as the Raspberry Pi Pico.&lt;/p&gt;&#10;&lt;p&gt;The project combines three technologies:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Quarkus for application development and dependency injection&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/kurbatov/firmata4j" title="firmata4j" target="_blank" rel="noopener noreferrer"&gt;firmata4j&lt;/a&gt; as the Java implementation of the Firmata client protocol&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/firmata/ConfigurableFirmata" title="ConfigurableFirmata" target="_blank" rel="noopener noreferrer"&gt;ConfigurableFirmata&lt;/a&gt; running on the microcontroller&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;The initial version focuses on a practical MVP: digital input and output, analog input, PWM output, and USB serial communication with a Raspberry Pi Pico.&lt;/p&gt;</description></item><item><title>Build an AI Agent (From Scratch)</title><link>https://foojay.io/today/build-an-ai-agent-from-scratch/</link><pubDate>Mon, 07 Sep 2026 05:52:13 +0000</pubDate><guid>https://foojay.io/today/build-an-ai-agent-from-scratch/</guid><description>&lt;p&gt;This review is about &lt;a href="https://www.manning.com/books/build-an-ai-agent-from-scratch?utm_source=frankel&amp;amp;utm_medium=affiliate&amp;amp;utm_campaign=affiliate&amp;amp;a_aid=frankel" target="_blank" rel="noopener noreferrer"&gt;Build an AI Agent (From Scratch)&lt;/a&gt; by Jungjun Hur and Younghee Song from Manning.&lt;/p&gt;&#10;&lt;h2 id="facts"&gt;Facts&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;10 chapters&lt;/li&gt;&#10;&lt;li&gt;$29.29 (at the time of this writing)&lt;/li&gt;&#10;&lt;li&gt;315 pages&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="chapters"&gt;Chapters&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Building your first LLM agent&#10;&lt;ol&gt;&#10;&lt;li&gt;What is an AI agent?&lt;/li&gt;&#10;&lt;li&gt;The brain of AI agents: LLMs&lt;/li&gt;&#10;&lt;li&gt;Enabling actions: Tool use&lt;/li&gt;&#10;&lt;li&gt;Implementing a basic ReAct agent&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Developing advanced agent capabilities&#10;&lt;ol&gt;&#10;&lt;li&gt;Building knowledge bases with RAG&lt;/li&gt;&#10;&lt;li&gt;Adding memory to your agent&lt;/li&gt;&#10;&lt;li&gt;Planning and reflection for complex tasks&lt;/li&gt;&#10;&lt;li&gt;Empowering agents with code execution&lt;/li&gt;&#10;&lt;li&gt;Orchestrating multi-agent systems&lt;/li&gt;&#10;&lt;li&gt;Evaluating agents&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="pros-and-cons"&gt;Pros and cons&lt;/h2&gt;&#10;&lt;p&gt;At Manning, I consider the following two books to be references:&lt;/p&gt;</description></item><item><title>From Spec-Driven Development to Living Specifications in Java Projects</title><link>https://foojay.io/today/from-spec-driven-development-to-living-specifications-in-java-projects/</link><pubDate>Fri, 04 Sep 2026 05:51:45 +0000</pubDate><guid>https://foojay.io/today/from-spec-driven-development-to-living-specifications-in-java-projects/</guid><description>&lt;h2 id="from-spec-driven-development-to-living-specifications-in-java-projects"&gt;From Spec-Driven Development to Living Specifications in Java Projects&lt;/h2&gt;&#10;&lt;p&gt;Coding agents have changed the speed at which we can produce software. But producing code faster does not automatically mean producing better software.&lt;/p&gt;&#10;&lt;p&gt;As I started using agents more frequently in real-world software development, one question became increasingly important: &lt;strong&gt;how do we give an agent enough freedom to be useful without losing engineering intent?&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;Trying to control every line of code generated by an agent removes much of the value it can provide. At that point, it might simply be faster to write the code ourselves.&lt;/p&gt;</description></item><item><title>Building an Agentic Warehouse Management System — Part 3: Tools, Decisions, and Actions</title><link>https://foojay.io/today/building-an-agentic-warehouse-management-system-part-3-tools-decisions-and-actions/</link><pubDate>Thu, 03 Sep 2026 16:50:36 +0000</pubDate><guid>https://foojay.io/today/building-an-agentic-warehouse-management-system-part-3-tools-decisions-and-actions/</guid><description>&lt;p&gt;If you haven&amp;rsquo;t read the first two parts yet, I recommend starting with &lt;strong&gt;&lt;a href="https://foojay.io/today/building-an-agentic-warehouse-management-system-part-1-where-ai-agents-add-value/"&gt;Part 1: Where AI Agents Add Value&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href="https://foojay.io/today/building-an-agentic-warehouse-management-system-part-2-java-and-spring-ai/"&gt;Part 2: Designing and Planning the Agent&lt;/a&gt;&lt;/strong&gt;. There, we introduced the WMS scenario, discussed where an AI agent can add value, and built the first stages of the implementation with Java and Spring AI.&lt;/p&gt;&#10;&lt;p&gt;In this third and final part, we will build on the execution plan created in &lt;a href="https://foojay.io/today/building-an-agentic-warehouse-management-system-part-2-java-and-spring-ai/"&gt;Part 2&lt;/a&gt; and focus on the remaining stages of the agent workflow. We will see how each task is executed using controlled tools, how operational and business context is gathered, how the replenishment decision is made, and how the agent acts on that decision when necessary.&lt;/p&gt;</description></item><item><title>Building an Agentic Warehouse Management System — Part 2: Java and Spring AI</title><link>https://foojay.io/today/building-an-agentic-warehouse-management-system-part-2-java-and-spring-ai/</link><pubDate>Thu, 03 Sep 2026 16:39:59 +0000</pubDate><guid>https://foojay.io/today/building-an-agentic-warehouse-management-system-part-2-java-and-spring-ai/</guid><description>&lt;p&gt;If you arrived here without reading the first part, I recommend starting with &lt;strong&gt;&lt;a href="https://foojay.io/today/building-an-agentic-warehouse-management-system-part-1-where-ai-agents-add-value/"&gt;Agentic WMS — Part 1: Where AI Agents Add Value&lt;/a&gt;.&lt;/strong&gt; There, we introduced the WMS scenario, explored the replenishment problem, and discussed where an AI agent can add value without replacing deterministic application logic.&lt;/p&gt;&#10;&lt;p&gt;In this second part, we will move from the design to the first steps of the implementation.&lt;/p&gt;&#10;&lt;p&gt;We will look at how the agent is built with &lt;strong&gt;Java and Spring AI&lt;/strong&gt;, how its capabilities and boundaries are defined, how it is triggered by the WMS, and how the planner turns the agent&amp;rsquo;s goal into an execution plan.&lt;/p&gt;</description></item><item><title>Agentic WMS — Part 1: Where AI Agents Add Value</title><link>https://foojay.io/today/building-an-agentic-warehouse-management-system-part-1-where-ai-agents-add-value/</link><pubDate>Thu, 03 Sep 2026 16:23:14 +0000</pubDate><guid>https://foojay.io/today/building-an-agentic-warehouse-management-system-part-1-where-ai-agents-add-value/</guid><description>&lt;p&gt;I spent a large part of my career working in banking and logistics. In logistics, I spent more than eight years working across different stages of logistics systems, from development to implementation and production support.&lt;/p&gt;&#10;&lt;p&gt;That experience shaped the way I think about technology. Knowing a tool or framework is important, but what interests me most is understanding the business problem behind it and where technology can actually add value.&lt;/p&gt;</description></item><item><title>Did Your AI Agent Ever Run a Debugger? One JVM Bug, Two Agent Runs</title><link>https://foojay.io/today/did-your-ai-agent-run-the-debugger-one-jvm-bug-two-agent-runs/</link><pubDate>Thu, 03 Sep 2026 13:48:32 +0000</pubDate><guid>https://foojay.io/today/did-your-ai-agent-run-the-debugger-one-jvm-bug-two-agent-runs/</guid><description>&lt;p&gt;Java developers reach for the debugger without thinking about it. Set a breakpoint, run the failing test, look at the variables, then decide what to change.&lt;/p&gt;&#10;&lt;p&gt;Most AI coding agents I have watched skip that step. They read the stack trace, read the source, and propose a patch. The reasoning can look excellent and still be a guess about a program nobody ran.&lt;/p&gt;&#10;&lt;p&gt;I wanted to know what that guess costs. So I took one real JVM bug, one model, one prompt, and ran it twice with two debugging workflows. Here is what the two transcripts show.&lt;/p&gt;</description></item><item><title>No Database Operations Found: What Writing a Spring Boot Analyzer Taught Me About Spring</title><link>https://foojay.io/today/no-database-operations-found-what-writing-a-spring-boot-analyzer-taught-me-about-spring/</link><pubDate>Thu, 03 Sep 2026 06:26:00 +0000</pubDate><guid>https://foojay.io/today/no-database-operations-found-what-writing-a-spring-boot-analyzer-taught-me-about-spring/</guid><description>&lt;p&gt;I spent months building a static analyzer that answers one question about a Spring Boot codebase: if I change this endpoint, what does the change reach?&lt;/p&gt;&#10;&lt;p&gt;Every serious bug I found in it had the same shape.&lt;/p&gt;&#10;&lt;p&gt;Not a wrong edge in a graph. Not a missing feature. A &lt;strong&gt;confident absence&lt;/strong&gt; — the tool stating, definitively, that an endpoint touched no database, opened no transaction, published no message, when it did all three.&lt;/p&gt;</description></item><item><title>MongoDB Search Server, improved!</title><link>https://foojay.io/today/mongodb-search-server-improved/</link><pubDate>Wed, 02 Sep 2026 10:00:00 +0000</pubDate><guid>https://foojay.io/today/mongodb-search-server-improved/</guid><description>&lt;p&gt;In this article, we&amp;rsquo;re going to revisit and improve the MongoDB Search Server originally described in the article &lt;a href="https://foojay.io/today/how-to-build-a-search-service-in-java-with-mongodb/"&gt;How to Build a Search Service in Java with MongoDB&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;First, let&amp;rsquo;s remind ourselves why an intermediate search service deserves our attention and effort: Search powers the most important part of your application, getting users to the content they need, fast. The search bar often serves as the main entry point to your services. Search results can be returned with all the information needed to present to the user without querying the source database at all. With search serving this important, heavy load on its own, separating the search service into an independently scalable tier allows us to control, scale, and version the search server as needed. Having a gateway from the application to MongoDB Search also allows us to simplify the interface by passing only the key parameters, without &lt;code&gt;getting entangled&lt;/code&gt; in the specifics of the aggregation pipeline syntax.&lt;/p&gt;</description></item><item><title>Aggregation Optimization in MongoDB: Sorting With Indexes (Part 5)</title><link>https://foojay.io/today/aggregation-optimization-in-mongodb-sorting-with-indexes-part-5/</link><pubDate>Tue, 01 Sep 2026 14:07:36 +0000</pubDate><guid>https://foojay.io/today/aggregation-optimization-in-mongodb-sorting-with-indexes-part-5/</guid><description>&lt;p&gt;&lt;em&gt;And why MongoDB might be a better relational database than you ever realized.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://www.mongodb.com/events/mongodb-schema-design-reviews/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=agg-part5-foojay&amp;amp;utm_term=tony.kim" target="_blank" rel="noopener noreferrer"&gt;&lt;em&gt;Design reviews&lt;/em&gt;&lt;/a&gt;&lt;em&gt;are one-on-one meetings where MongoDB experts deliver advice on data modeling best practices and application design challenges. In this series, we are going to explore common real-life scenarios where design reviews helped developers achieve meaningful success with MongoDB.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://foojay.io/today/aggregation-optimization-in-mongodb-sorting-with-indexes-part-5/fri1-2.png" alt="" width="700" height="307" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;In this series, we&amp;rsquo;ve described our steps to improve the performance of a slow running MongoDB &lt;a href="https://www.mongodb.com/docs/manual/aggregation/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=agg-part5-foojay&amp;amp;utm_term=tony.kim#aggregation-operations" target="_blank" rel="noopener noreferrer"&gt;aggregation pipeline&lt;/a&gt;. The pipeline was part of a fictional video streaming service application, mapping user profiles to the devices those users were using to access the service, and was based on a real use case I&amp;rsquo;d encountered during a recent design review.&lt;/p&gt;</description></item><item><title>Announcing BX-WORD: Native Microsoft Word Automation for BoxLang</title><link>https://foojay.io/today/announcing-bx-word-native-microsoft-word-automation-for-boxlang/</link><pubDate>Tue, 01 Sep 2026 11:31:16 +0000</pubDate><guid>https://foojay.io/today/announcing-bx-word-native-microsoft-word-automation-for-boxlang/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/announcing-bx-word-native-microsoft-word-automation-for-boxlang/bx-word-1-700x373.jpg" alt="" width="700" height="373" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;Every enterprise runs on Word documents. Contracts. RFPs. Proposals. Board reports. Offer letters. HR handbooks. Compliance policies. Invoices. Statements of work. Legal memos. Today, we are incredibly proud to announce &lt;strong&gt;bx-word 1.0.0&lt;/strong&gt;, a first-class, fluent, production-ready module for creating, populating, and transforming Microsoft Word documents natively in BoxLang. This is not a wrapper. This is not a converter. This is a real document builder designed for the way enterprise teams actually work.&lt;/p&gt;</description></item></channel></rss>