<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Developer Tools on foojay.io - Friends Of OpenJDK</title><link>https://foojay.io/today/category/developer-tools/</link><description>Recent content in Developer Tools on foojay.io - Friends Of OpenJDK</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Fri, 25 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://foojay.io/today/category/developer-tools/index.xml" rel="self" type="application/rss+xml"/><item><title>BoxLang AI 3.4.0: Gateways, Human-in-the-Loop, and a Full Security Stack</title><link>https://foojay.io/today/boxlang-ai-340-gateways-hitl-security/</link><pubDate>Fri, 25 Sep 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/boxlang-ai-340-gateways-hitl-security/</guid><description>&lt;p&gt;BoxLang AI 3.4.0 is a major release centered on a single theme: &lt;strong&gt;trust&lt;/strong&gt;. AI agents operating in real applications need ways to involve people in consequential decisions and manage potentially untrusted inputs. This release introduces gateways, a restructured Human-in-the-Loop subsystem with durable decisions, layered security controls, batched approvals, normalized provider reasoning, and broader AWS Bedrock support.&lt;/p&gt;&#10;&lt;p&gt;The sections below follow the original &lt;a href="https://www.ortussolutions.com/blog/boxlang-ai-340-gateways-human-in-the-loop-and-a-full-security-stack" target="_blank" rel="noopener noreferrer"&gt;BoxLang AI 3.4.0 release announcement&lt;/a&gt; and preserve &lt;strong&gt;all its code examples&lt;/strong&gt;. For the complete change log, see the &lt;a href="https://ai.ortusbooks.com/readme/release-history/3.4.0" target="_blank" rel="noopener noreferrer"&gt;BoxLang AI 3.4.0 release history&lt;/a&gt;.&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>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>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>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>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>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><item><title>NetBeans DataWrangler: Query, Convert, and Edit Data Analytics Files</title><link>https://foojay.io/today/netbeans-datawrangler-query-convert-and-edit-data-analytics-files/</link><pubDate>Sun, 30 Aug 2026 10:25:43 +0000</pubDate><guid>https://foojay.io/today/netbeans-datawrangler-query-convert-and-edit-data-analytics-files/</guid><description>&lt;p&gt;&lt;a href="https://github.com/geertjanw/Apache-NetBeans-Data-Wrangler" target="_blank" rel="noopener noreferrer"&gt;Apache NetBeans DataWrangler&lt;/a&gt; brings the file formats of data analytics into Apache NetBeans 31: CSV, &lt;a href="https://parquet.apache.org/" target="_blank" rel="noopener noreferrer"&gt;Apache Parquet&lt;/a&gt;, JSON and Excel, the formats exchanged with pandas, Spark, R, dbt, Power BI and Excel itself.&lt;/p&gt;&#10;&lt;p&gt;You can query, convert, inspect, edit and analyze them without leaving the IDE. They open as documents with their own views and you can query them with SQL, join, aggregate and pivot them, convert them between formats, load them into tables and export the results. The SQL editor is enhanced with code completion, documentation, error checking and quick fixes for analytical SQL.&lt;/p&gt;</description></item><item><title>Running DuckDB's JDBC Driver in a GraalVM Native Image</title><link>https://foojay.io/today/running-duckdbs-jdbc-driver-in-a-graalvm-native-image/</link><pubDate>Sat, 29 Aug 2026 16:22:10 +0000</pubDate><guid>https://foojay.io/today/running-duckdbs-jdbc-driver-in-a-graalvm-native-image/</guid><description>&lt;p&gt;&lt;a href="https://duckdb.org/" target="_blank" rel="noopener noreferrer"&gt;DuckDB&lt;/a&gt; is an in-process analytical database. You add one JAR to a Java project and get a SQL engine that reads CSV, Parquet, and JSON files directly, with no server to run.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://www.graalvm.org/jdk25/reference-manual/native-image/" target="_blank" rel="noopener noreferrer"&gt;GraalVM Native Image&lt;/a&gt; compiles a Java program ahead of time into a standalone executable that starts in milliseconds and needs no JVM on the target machine.&lt;/p&gt;&#10;&lt;p&gt;Combining the two produces a data tool that is distributed as a single binary, like a Go or Rust program, while using Java libraries.&lt;/p&gt;</description></item><item><title>BoxLang 1.16.0 Released!</title><link>https://foojay.io/today/boxlang-1-16-0-released/</link><pubDate>Tue, 25 Aug 2026 13:57:47 +0000</pubDate><guid>https://foojay.io/today/boxlang-1-16-0-released/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/boxlang-1-16-0-released/boxlang-v1.16.0-700x467.jpg" alt="" width="700" height="467" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;BoxLang 1.16.0 is here, closing &lt;strong&gt;50 issues&lt;/strong&gt; across new features, improvements, and bug fixes. The theme running through this release is control: control over how HTTP clients are created and reused, control over what happens when a request fails, control over how much data a response is allowed to buffer, control over when Java classpaths reload, and tighter alignment with CFML behavior in the edge cases when doing migrations.&lt;/p&gt;</description></item><item><title>Offline Crypto Address Validation in Java</title><link>https://foojay.io/today/offline-crypto-address-validation-in-java/</link><pubDate>Sat, 22 Aug 2026 08:43:04 +0000</pubDate><guid>https://foojay.io/today/offline-crypto-address-validation-in-java/</guid><description>&lt;p&gt;Backend validation often starts with simple questions.&lt;/p&gt;&#10;&lt;p&gt;Is the input empty? Does it have the expected shape? Can it be parsed? Does it belong to the selected domain?&lt;/p&gt;&#10;&lt;p&gt;Crypto wallet addresses are no different, except the formats vary across chains and simple regular expressions are rarely enough.&lt;/p&gt;&#10;&lt;p&gt;If a Java backend accepts crypto withdrawal addresses, address-book entries, CSV imports, support-tool input, or transaction preflight requests, it should reject clearly invalid addresses before calling RPC nodes, explorers, exchange APIs, or internal money-movement systems.&lt;/p&gt;</description></item><item><title>Introducing BoxLang AI Explorer: A Local Catalog for Every AI Pattern</title><link>https://foojay.io/today/introducing-boxlang-ai-explorer-a-local-catalog-for-every-ai-pattern/</link><pubDate>Tue, 18 Aug 2026 14:15:48 +0000</pubDate><guid>https://foojay.io/today/introducing-boxlang-ai-explorer-a-local-catalog-for-every-ai-pattern/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/introducing-boxlang-ai-explorer-a-local-catalog-for-every-ai-pattern/boxlang-explorer-700x394.png" alt="" width="700" height="394" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;Learning a new AI API usually means jumping between scattered documentation pages, guessing at imports, and copy-pasting code that may or may not still work. We wanted something better for BoxLang AI, so we built the &lt;strong&gt;BoxLang AI Explorer&lt;/strong&gt; : a local, browser-based catalog of runnable BoxLang AI examples, organized by category and difficulty, each with guidance, source code, and sample output. You can also try it online at &lt;a href="https://ai.boxlang.io/explorer/" target="_blank" rel="noopener noreferrer"&gt;https://ai.boxlang.io/explorer/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Build Secure AI Chat Applications with BoxLang, RAG, Ollama, and Amazon Bedrock with Dan Card</title><link>https://foojay.io/today/build-secure-ai-chat-applications-with-boxlang-rag-ollama-and-amazon-bedrock-with-dan-card/</link><pubDate>Thu, 13 Aug 2026 14:52:13 +0000</pubDate><guid>https://foojay.io/today/build-secure-ai-chat-applications-with-boxlang-rag-ollama-and-amazon-bedrock-with-dan-card/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/build-secure-ai-chat-applications-with-boxlang-rag-ollama-and-amazon-bedrock-with-dan-card/dancardWorkshop-700x394.jpg" alt="" width="700" height="394" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;h2 id="build-secure-ai-chat-applications-with-boxlang-rag-ollama-and-amazon-bedrock"&gt;Build Secure AI Chat Applications with BoxLang, RAG, Ollama, and Amazon Bedrock&lt;/h2&gt;&#10;&lt;p&gt;AI demos are everywhere. Building an AI-powered feature that can securely work with your documents, databases, and real application data is a very different challenge.&lt;/p&gt;&#10;&lt;p&gt;How do you give an AI model access to the right information without exposing sensitive data? Should you use a locally hosted model or a cloud service? How do you move beyond a basic chatbot and build something genuinely useful for your users or organization?&lt;/p&gt;</description></item><item><title>BoxLang AWS, Azure, and Google Secrets Manager Module Released</title><link>https://foojay.io/today/boxlang-aws-azure-and-google-secrets-manager-module-released/</link><pubDate>Tue, 21 Jul 2026 11:38:18 +0000</pubDate><guid>https://foojay.io/today/boxlang-aws-azure-and-google-secrets-manager-module-released/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/boxlang-aws-azure-and-google-secrets-manager-module-released/boxlang-secrets-700x467.jpg" alt="" width="700" height="467" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;Every production application carries secrets: database passwords, API tokens, encryption keys. The question is never whether to manage them &amp;ndash; it&amp;rsquo;s how badly the current approach is going to hurt you.&lt;/p&gt;&#10;&lt;p&gt;Hardcoded credentials in config files get committed to repos. Environment variables sprawl across deployment pipelines with no audit trail. Custom integration code for each cloud provider means three different patterns to maintain, test, and rotate. And when a key needs to rotate at 2am? Someone is waking up.&lt;/p&gt;</description></item><item><title>Toward a Durable Spring PetClinic</title><link>https://foojay.io/today/toward-a-durable-spring-petclinic/</link><pubDate>Sun, 19 Jul 2026 18:06:06 +0000</pubDate><guid>https://foojay.io/today/toward-a-durable-spring-petclinic/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Durable Execution&lt;/strong&gt; is a way of running code so that its progress survives failure. A normal program keeps its state in memory: if the process crashes, the machine reboots, or a network call times out halfway through a multi-step operation, that state is gone and the work is left half-done.&lt;/p&gt;&#10;&lt;p&gt;Temporal, the Durable Execution platform, persists every step of a process to its &lt;strong&gt;Event History&lt;/strong&gt; — a durable, append-only log of Events — so that after any failure the work resumes exactly where it left off, as if the crash never happened.&lt;/p&gt;</description></item><item><title>BoxLang 1.15.0 Released: Blazing Fast Strings, Runtime Portability, and much more</title><link>https://foojay.io/today/boxlang-1-15-0-released-blazing-fast-strings-runtime-portability-and-much-more/</link><pubDate>Tue, 14 Jul 2026 17:57:10 +0000</pubDate><guid>https://foojay.io/today/boxlang-1-15-0-released-blazing-fast-strings-runtime-portability-and-much-more/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/boxlang-1-15-0-released-blazing-fast-strings-runtime-portability-and-much-more/boxlang-v1.15.0-700x467.jpg" alt="" width="700" height="467" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;BoxLang 1.15.0&lt;/strong&gt; is a high-impact release with two big headlines and a long tail of hardening. The first headline is a &lt;strong&gt;massive performance upgrade to string handling&lt;/strong&gt; : a new first-class &lt;code&gt;BoxStringBuilder&lt;/code&gt; type, compile-time literal folding, smarter &lt;code&gt;&amp;amp;=&lt;/code&gt; semantics, and a runtime concat strategy that automatically switches to builder-backed accumulation once your expression gets big enough. Your existing string-heavy code just got faster. No rewrites required.&lt;/p&gt;&#10;&lt;p&gt;The second headline is architectural. Every class loader in the BoxLang runtime and module system has been fully abstracted behind a pluggable &lt;code&gt;IClassLoaderFactory&lt;/code&gt; interface. That single seam is what unlocks the &lt;strong&gt;Android runtime&lt;/strong&gt; and &lt;strong&gt;Ahead-of-Time (AOT) compiled runtimes&lt;/strong&gt; such as GraalVM Native Image that we have on the roadmap. The default behavior is unchanged, but the ceiling just got a lot higher.&lt;/p&gt;</description></item><item><title>"This Can't Possibly Work": What I Learned at a Temporal.io Workshop</title><link>https://foojay.io/today/this-cant-possibly-work-what-i-learned-at-a-temporal-io-workshop-on-durable-execution/</link><pubDate>Fri, 10 Jul 2026 08:41:22 +0000</pubDate><guid>https://foojay.io/today/this-cant-possibly-work-what-i-learned-at-a-temporal-io-workshop-on-durable-execution/</guid><description>&lt;p&gt;&lt;strong&gt;When developers first hear about &lt;a href="https://temporal.io/" target="_blank" rel="noopener noreferrer"&gt;Temporal&lt;/a&gt;, they tend to move through a predictable sequence of emotions. First comes disbelief — the claim that your application can crash mid-execution and simply pick up where it left off, variables intact, sounds like nonsense. Then comes irritation that anyone would even say such a thing is possible. Then they try it, discover it actually works, and get very excited. And finally they ask the only question that matters: &lt;em&gt;how?&lt;/em&gt;&lt;/strong&gt;&#10;&lt;img src="https://foojay.io/today/this-cant-possibly-work-what-i-learned-at-a-temporal-io-workshop-on-durable-execution/IMG_2977-1024x768.jpeg" alt="" width="1024" height="768" loading="lazy" decoding="async"&gt;&lt;/p&gt;</description></item><item><title>BoxLang 1.14.0: Sets, Ranges, Inner Classes, and a Runtime That Talks Back</title><link>https://foojay.io/today/boxlang-1-14-0-sets-ranges-inner-classes-and-a-runtime-that-talks-back/</link><pubDate>Thu, 09 Jul 2026 18:02:59 +0000</pubDate><guid>https://foojay.io/today/boxlang-1-14-0-sets-ranges-inner-classes-and-a-runtime-that-talks-back/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/boxlang-1-14-0-sets-ranges-inner-classes-and-a-runtime-that-talks-back/BoxLang-release-1.14.0-4-700x394.jpg" alt="" width="700" height="394" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;BoxLang has never stood still, but 1.14.0 is something different. This is the release where the language stops filling gaps and starts defining what a modern dynamic JVM language looks like on its own terms. Sixty-five issues closed. Four innovative language features. A formatter that has grown up. And a companion module - &lt;code&gt;bx-mcp&lt;/code&gt; - that fundamentally changes how you operate a running BoxLang application with AI.&lt;/p&gt;&#10;&lt;p&gt;This could have easily been a major release for the team. This has been a really amazing effort by everybody at Ortus and all of the amazing feedback from our clients migrating to BoxLang and coming up with such amazing and innovative ideas for this platform. We have only just begun!&lt;/p&gt;</description></item><item><title>BoxLang 1.14.0: Navigate Anything: JSONPath Comes to BoxLang's DataNavigator</title><link>https://foojay.io/today/boxlang-1-14-0-navigate-anything-jsonpath-comes-to-boxlangs-datanavigator/</link><pubDate>Thu, 02 Jul 2026 18:17:16 +0000</pubDate><guid>https://foojay.io/today/boxlang-1-14-0-navigate-anything-jsonpath-comes-to-boxlangs-datanavigator/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/boxlang-1-14-0-navigate-anything-jsonpath-comes-to-boxlangs-datanavigator/BoxLang-release-1.14.0-3-700x394.jpg" alt="" width="700" height="394" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;Every application eventually has to deal with deeply nested data. JSON API responses with payloads six levels deep. Configuration files where the key you need is buried inside an array of objects, one of which has a &lt;code&gt;null&lt;/code&gt; for the field you thought was required. Module metadata structures that nobody wrote a schema for. Runtime introspection data shaped like a tree that grew without a plan.&lt;/p&gt;&#10;&lt;p&gt;BoxLang introduced DataNavigators in version 1 so you can use &lt;code&gt;dataNavigate()&lt;/code&gt;, call &lt;code&gt;.from()&lt;/code&gt; to scope down, chain your &lt;code&gt;.get()&lt;/code&gt; calls, provide defaults everywhere. Clean and safe. But even with the fluent API, extracting a specific slice of a complex payload still required multiple navigator hops, or a loop, or defensive key-exists checks stacked three levels deep.&lt;/p&gt;</description></item><item><title>AI-Assisted Unused &amp; Dead Code Removal</title><link>https://foojay.io/today/ai-assisted-unused-dead-code-removal/</link><pubDate>Sun, 28 Jun 2026 07:19:42 +0000</pubDate><guid>https://foojay.io/today/ai-assisted-unused-dead-code-removal/</guid><description>&lt;h2 id="why-your-codebase-is-forcing-ai-to-underperform-and-what-to-do-about-it"&gt;Why Your Codebase Is Forcing AI to Underperform, and What to Do About It&lt;/h2&gt;&#10;&lt;figure class="alignleft size-large is-resized"&gt;&#10; &lt;img src="https://foojay.io/today/ai-assisted-unused-dead-code-removal/ai-assisted-dead-code-removal-1024x576.avif" alt="" width="1024" height="576" style="width:250px" loading="lazy" class="is-zoomable"&gt;&lt;/figure&gt;&#10;&#10;&lt;p&gt;Your AI coding assistant is only as good as the codebase it works on. If your Java application carries years of dead &amp;amp; unused code, and most do, the AI spends its reasoning budget on code that nobody runs. The result is more hallucinations, worse suggestions, and higher token costs. Here&amp;rsquo;s what to do about it.&lt;/p&gt;</description></item><item><title>BoxLang 1.14.0: Query Transformers - Take Full Control of Your Query Results</title><link>https://foojay.io/today/boxlang-1-14-0-query-transformers-take-full-control-of-your-query-results/</link><pubDate>Wed, 24 Jun 2026 10:46:13 +0000</pubDate><guid>https://foojay.io/today/boxlang-1-14-0-query-transformers-take-full-control-of-your-query-results/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/boxlang-1-14-0-query-transformers-take-full-control-of-your-query-results/BoxLang-release-1.14.0-2-700x394.jpg" alt="" width="700" height="394" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;BoxLang 1.14.0 ships a lot of exciting features &amp;ndash; Dynamic Sets, Ranges, Inner Classes, JSONPath navigation &amp;ndash; but one quietly powerful addition will change the way you think about every database call in your application: &lt;strong&gt;Query Transformers&lt;/strong&gt;, and this is just the start, we have plans for a whole lot more cool query features.&lt;/p&gt;&#10;&lt;p&gt;If you have ever executed a query and then immediately written a loop to reshape the result into what you actually needed, this feature is for you.&lt;/p&gt;</description></item><item><title>Quarkus Unpacked: Insights from the Foojay Podcast</title><link>https://foojay.io/today/quarkus-unpacked-insights-from-the-foojay-podcast/</link><pubDate>Tue, 23 Jun 2026 12:36:54 +0000</pubDate><guid>https://foojay.io/today/quarkus-unpacked-insights-from-the-foojay-podcast/</guid><description>&lt;figure class="alignleft is-resized"&gt;&#10; &lt;img src="https://foojay.io/today/quarkus-unpacked-insights-from-the-foojay-podcast/3-Quarkus-Unpacked-2-2.jpeg" alt="Quarkus: A Runtime and Framework for Cloud-Native Java" style="width:300px" loading="lazy" class="is-zoomable"&gt;&lt;/figure&gt;&#10;&#10;&lt;p&gt;I recently had the pleasure of joining the &lt;a href="https://www.youtube.com/watch?v=_nJCTTrnZkE" target="_blank" rel="noopener noreferrer"&gt;Foojay podcast&lt;/a&gt; to talk about Quarkus in depth. The conversation covered a lot of ground, from what makes Quarkus different to the practical trade-offs between JVM and native mode. This post captures the key questions and answers from that discussion, lightly edited for readability.&lt;/p&gt;&#10;&lt;p&gt;If you have been following this blog series, note that the third installment on building your own stack with Quarkus is coming next. Consider this a bonus entry that distills the podcast conversation into a format you can read, reference, and share.&lt;/p&gt;</description></item><item><title>Where production policy belongs: building Eliya in public</title><link>https://foojay.io/today/where-production-policy-belongs-building-eliya-in-public/</link><pubDate>Fri, 19 Jun 2026 08:15:28 +0000</pubDate><guid>https://foojay.io/today/where-production-policy-belongs-building-eliya-in-public/</guid><description>&lt;p&gt;This is an argument about where production intent belongs in a managed runtime, and the OpenJDK distribution we built to act on it - Eliya, an opinionated, compliance-conscious OpenJDK distribution. This is the first article in a series. The later parts are engineering: reproducible builds, the glibc floor, release signing, the one source patch we shipped. This part is the thesis they all serve.&#10;&lt;img src="https://foojay.io/today/where-production-policy-belongs-building-eliya-in-public/jvm-behaviour-space-8d14d74a.png" alt="" width="813" height="375" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;Every configurable system has two spaces. The configuration space: every behaviour you can reach by setting the knobs the system already exposes. And there&amp;rsquo;s the implementation space: behaviour that only exists if someone goes in and changes the internals.&lt;/p&gt;</description></item><item><title>BoxLang 1.14.0: BoxSet is Here, BoxLang's New First-Class Set Type</title><link>https://foojay.io/today/boxlang-1-14-0-boxset-is-here-boxlangs-new-first-class-set-type/</link><pubDate>Wed, 17 Jun 2026 10:36:28 +0000</pubDate><guid>https://foojay.io/today/boxlang-1-14-0-boxset-is-here-boxlangs-new-first-class-set-type/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/boxlang-1-14-0-boxset-is-here-boxlangs-new-first-class-set-type/BoxLang-release-1.14.0-1-700x394.jpg" alt="" width="700" height="394" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;BoxLang 1.14.0 ships with a new &lt;strong&gt;dynamic first-class Set type&lt;/strong&gt; baked directly into the language. Not a wrapper you reach for manually, not a &lt;code&gt;createObject( &amp;quot;java&amp;quot;, &amp;quot;java.util.HashSet&amp;quot; )&lt;/code&gt; incantation you paste from a Stack Overflow answer years ago. A real &lt;code&gt;BoxSet&lt;/code&gt; with literal syntax, operator overloads, a full functional pipeline, change listeners, JSON serialization, and deep Java interop.&lt;/p&gt;&#10;&lt;p&gt;If you have ever deduplicated an array with a loop, compared two collections element by element, or modeled a permission system on top of a struct &amp;ndash; Sets are the tool you were missing. Let&amp;rsquo;s dig in.&lt;/p&gt;</description></item><item><title>Observing Apache NetBeans with OpenTelemetry and Dash0</title><link>https://foojay.io/today/observing-apache-netbeans-with-opentelemetry-and-dash0/</link><pubDate>Sun, 14 Jun 2026 22:03:09 +0000</pubDate><guid>https://foojay.io/today/observing-apache-netbeans-with-opentelemetry-and-dash0/</guid><description>&lt;p&gt;&lt;em&gt;What happens when you point an observability agent at your IDE rather than your application?&lt;/em&gt;&lt;/p&gt;&#10;&lt;h2 id="the-question-nobody-thinks-to-ask"&gt;The question nobody thinks to ask&lt;/h2&gt;&#10;&lt;p&gt;Observability is something we do to our applications. We instrument services, add trace context to HTTP requests, collect JVM heap metrics, ship logs to a backend. The IDE we use to write that instrumentation is — by convention — invisible. It just runs. When it is slow, we assume it is busy. When it crashes, we restart it. We have no data.&lt;/p&gt;</description></item><item><title>BoxLang 1.14.0: Introducing Inner Classes</title><link>https://foojay.io/today/boxlang-1-14-0-introducing-inner-classes/</link><pubDate>Thu, 11 Jun 2026 10:29:32 +0000</pubDate><guid>https://foojay.io/today/boxlang-1-14-0-introducing-inner-classes/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/boxlang-1-14-0-introducing-inner-classes/BoxLang-release-1.14.0-700x394.jpg" alt="" width="700" height="394" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;BoxLang has always embraced a simple truth: the way you organize code shapes the way you think about problems. For a long time, if you needed a helper class, you needed a file. One class, one &lt;code&gt;.bx&lt;/code&gt; file, no exceptions. This also stemmed from the CFML days. That&amp;rsquo;s clean and predictable, but it creates real friction when a class is tightly coupled to exactly one caller and has no business existing anywhere else.&lt;/p&gt;</description></item><item><title>Context Is Code: A Tour of APM and AgentRC</title><link>https://foojay.io/today/context-is-code-a-tour-of-apm-and-agentrc/</link><pubDate>Fri, 05 Jun 2026 08:35:05 +0000</pubDate><guid>https://foojay.io/today/context-is-code-a-tour-of-apm-and-agentrc/</guid><description>&lt;h2 id="context-is-code-a-tour-of-apm-and-agentrc"&gt;Context Is Code: A Tour of APM and AgentRC&lt;/h2&gt;&#10;&lt;p&gt;If you&amp;rsquo;ve shipped an AI agent into a real codebase in the last twelve months, you&amp;rsquo;ve felt this: every agent, every developer, every machine — different setup. A README that says &amp;ldquo;install these extensions.&amp;rdquo; A &lt;code&gt;copilot-instructions.md&lt;/code&gt; somebody copy-pasted from another repo. MCP server configs in three different files. The same skills duplicated for Copilot, Claude, Cursor, and Codex.&lt;/p&gt;&#10;&lt;p&gt;No version pinning.&lt;/p&gt;</description></item><item><title>BoxLang AI 3.2.0 — Image Generation, Web Search, Fluent Audio, Agent Registry &amp; MCP Observability</title><link>https://foojay.io/today/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability/</link><pubDate>Tue, 02 Jun 2026 12:27:07 +0000</pubDate><guid>https://foojay.io/today/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability/BoxLangAI-3.2-700x394.jpg" alt="" width="700" height="394" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;BoxLang AI 3.2.0 is here, and it&amp;rsquo;s a landmark release. We&amp;rsquo;re shipping five major features: image generation, web search, a fluent audio builder API, a centralized agent registry, and deep MCP observability along with a suite of analytics improvements and a critical bug fix. Let&amp;rsquo;s dig in. 🎉&lt;/p&gt;&#10;&lt;p&gt;🖼️ Image Generation — aiImage()&lt;/p&gt;&#10;&lt;p&gt;You can now generate images directly from BoxLang using any provider that supports text-to-image generation. The aiImage() BIF follows the same fluent, chainable philosophy as the rest of bx-ai then act on the result with expressive method calls.&lt;/p&gt;</description></item><item><title>Enterprise Java quality gates in the age of AI</title><link>https://foojay.io/today/enterprise-java-quality-gates-ai/</link><pubDate>Fri, 29 May 2026 07:00:00 +0000</pubDate><guid>https://foojay.io/today/enterprise-java-quality-gates-ai/</guid><description>&lt;figure class="size-medium"&gt;&#10; &lt;img src="https://foojay.io/today/enterprise-java-quality-gates-ai/ChatGPT-Image-May-26-2026-04_44_09-PM-700x394.jpg" alt="Illustration of human developers and an AI assistant writing code together, with the code passing through an enterprise quality gate before reaching a trusted repository." width="100%" loading="lazy" class="is-zoomable"&gt;&lt;/figure&gt;&#10;&#10;&lt;p&gt;People and AI can write code together, but enterprise repositories still need deterministic quality gates to protect code quality.&lt;/p&gt;&#10;&lt;h2 id="enterprise-quality-is-a-scaling-problem"&gt;Enterprise quality is a scaling problem&lt;/h2&gt;&#10;&lt;p&gt;Enterprise Java development is not only about writing correct code. It is about keeping a large, long-lived codebase understandable, reviewable and safe to change while many people and many tools touch it over time.&lt;/p&gt;</description></item><item><title>Intro to the BoxLang Formatter</title><link>https://foojay.io/today/intro-to-the-boxlang-formatter/</link><pubDate>Thu, 28 May 2026 17:45:09 +0000</pubDate><guid>https://foojay.io/today/intro-to-the-boxlang-formatter/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/intro-to-the-boxlang-formatter/boxlang-formatter-700x394.jpg" alt="" width="700" height="394" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;You know the drill. Someone opens a PR and half the review comments are about tabs vs spaces, where braces go, or why that one function has its arguments formatted differently from everything else. It&amp;rsquo;s noise. And it&amp;rsquo;s over.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;The BoxLang Formatter is here, and it handles all of that for you.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;You can find the docs here: &lt;a href="https://boxlang.ortusbooks.com/getting-started/ide-tooling/boxlang-formatter" target="_blank" rel="noopener noreferrer"&gt;https://boxlang.ortusbooks.com/getting-started/ide-tooling/boxlang-formatter&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="what-is-it"&gt;What Is It?&lt;/h2&gt;&#10;&lt;p&gt;The BoxLang Formatter is a built-in code formatting tool that ships with BoxLang. It enforces consistent style across &lt;code&gt;.bx&lt;/code&gt;, &lt;code&gt;.bxs&lt;/code&gt;, &lt;code&gt;.bxm&lt;/code&gt;, &lt;code&gt;.cfm&lt;/code&gt;, &lt;code&gt;.cfc&lt;/code&gt;, and &lt;code&gt;.cfs&lt;/code&gt; files — automatically.&lt;/p&gt;</description></item></channel></rss>