Articles
Weekend hack: Kotlin Symbol Processing Maven plugin
KSP only works with Gradle, leaving Maven users out in the cold. I built ksp-maven-plugin to fix that - minimal setup, auto-discovers processors, integrates …

The cookie story: when build failures became sweet accountability
A deceptively simple rule transforms a chaotic development team: break the build, buy cookies. What starts as lighthearted motivation evolves into a …

LLM evaluation testing with promptfoo: a practical guide
This article shows how to implement automated testing for LLM applications using promptfoo with a real application server, addressing the challenge that …

Contract-first vs. code-first development: why API contracts matter from day one
Discover why starting with API contracts first—not code—leads to clearer, more maintainable microservices. Learn the differences between contract-first and …

From monoliths to AI proxies: real-world strategy for testing and evolving LLM integrations
Integrating Large Language Models (LLMs) into production systems presents unique architectural, testing, and operational challenges. This article shares …

Kotlin extensions for LangChain4j
Discover Kotlin extensions for LangChain4j designed to transform the synchronous LangChain4j API into a modern, non-blocking experience with Kotlin Coroutines. …

Keeping your software healthy: the critical role of dependency updates
Discover best practices for effective dependency management in software development and learn strategies to keep your projects secure, efficient, and free of …

Spring Boot starters
This post discusses Spring Boot Starters and their importance to developers, who want to make the setup and configuration of Spring Boot applications a whole …

Code review best practices
Code review is a crucial practice in software development. One can design and write great software, but we are humans after all. And all humans make mistakes, …
Running Testcontainers on dynamic ports
Running integration tests locally with Docker can be challenging when fixed ports are unavailable due to conflicts. This issue is compounded in shared CI …