Been building a couple of small Kotlin libraries for doing RAG / LLM work on the JVM. They're independent, but they're the two pieces I kept wishing existed while writing Kotlin instead of Java. Both coroutine-first, both still pre-1.0:
Kdrant — a client for the Qdrant vector database. The official JVM client is really a Java client: calls come back as ListenableFuture, you assemble requests with protobuf builders, and it pulls a whole gRPC/Netty stack onto your classpath (~15-20 MB, the shaded Netty is 9 of that on its own). Kdrant is what you'd actually want to write Kotlin against — suspend functions, a type-safe DSL for collections/points/filters, kotlinx-serialization models, and a REST engine on Ktor so no gRPC/protobuf/Netty (~3-5 MB). gRPC still wins on raw throughput, no pretending otherwise, but for typical search workloads the trade is easy.
github.com/NaCode-Studios/Kdrant
kmemo — a semantic cache for LLM calls that won't hand you the wrong answer. The idea is to reuse the closest prompt you've already answered instead of needing an exact match, but "Convert 100 USD to EUR" and "Convert 250 USD to EUR" sit at ~0.99 similarity, so a naive cache serves the answer for the wrong number and nothing shows up in the logs. kmemo runs the close matches through a set of lexical guards that actually read the text — different numbers, units, entities, negation, a flipped "EUR to USD" — and drops the ones where the answer can't be the same.
github.com/NaCode-Studios/kmemo
Both are bring-your-own-embedder (neither generates embeddings), Apache 2.0. Feedback very welcome, especially on kmemo's guards where there's plenty left to get wrong.