Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,4 @@ RUN mkdir /site/
WORKDIR /site/
EXPOSE 4000
# Note --incremental mode is ineffective on the Mac owing to https://github.com/containers/podman/issues/22343. Use force_regenerate.sh to trigger the incremental reload after changing the file on the host.
CMD [ "bash", "-c", "eval \"$(rbenv init -)\" && cp -r /css/_sass/bootstrap /site/_sass/ && bundle exec jekyll serve --host ${JEKYLL_SERVE_BIND} --incremental --disable-disk-cache --destination /tmp/site"]
CMD [ "bash", "-c", "eval \"$(rbenv init -)\" && cp -r /css/_sass/bootstrap /site/_sass/ && bundle exec jekyll serve ${JEKYLL_SERVE_ARGS} --host ${JEKYLL_SERVE_BIND} --incremental --disable-disk-cache --destination /tmp/site"]
51 changes: 51 additions & 0 deletions _posts/2026-04-01-release-0_20_0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
---
layout: post
title: "Kroxylicious release 0.20.0"
date: 2026-04-01 00:00:00 +0000
author: "Rob Young"
author_url: "https://github.com/robobario"
# noinspection YAMLSchemaValidation
categories: blog kroxylicious-proxy releases
tags: [ "releases", "kroxylicious-proxy" ]
---

We're excited to announce the release of [Kroxylicious 0.20.0](https://github.com/kroxylicious/kroxylicious/releases/tag/v0.20.0)! There's been a lot of action, check out the full [Changelog](https://github.com/kroxylicious/kroxylicious/blob/main/CHANGELOG.md#0200) for everything including deprecations, changes, and removals.

Here are the highlights:

### Connection Expiration Filter

Thanks to the work of [May-Abo](https://github.com/May-Abo), a new filter joins the family! The Connection Expiration filter closes client connections after a configurable maximum age. This is perfect for dynamic environments like Kubernetes where you want to rebalance connections across proxy instances as pods scale up or down.

### Entity Isolation Filter

Multi-tenancy gets even better with the Entity Isolation filter. Initially supporting `groupId` and `transactionalId` entity types, this filter helps you enforce isolation boundaries between tenants sharing a cluster.

### Record Validation Filter - Apicurio v3 Upgrade

- Record validation just got a major upgrade with Apicurio v3. The default schema identification has changed from `globalId` to `contentId` for better interoperability with Confluent-based Kafka clients. To support migrations, you can still use the old behavior by setting `wireFormatVersion` to `V2`, though this mode is deprecated and will be removed in a future release.
- The schema validation filter can now connect to a schema registry protected by internally signed TLS certificates. One less obstacle for air-gapped or enterprise environments.

### Kubernetes Operator Enhancements

Two improvements for Kubernetes users:
- **OpenShift Route Support**: Enable external access to Virtual Clusters via OpenShift Routes using `KafkaProxyIngress.spec.openShiftRoute`. Off-cluster client access is now a breeze on OpenShift.
- **Server-Side Apply**: The operator now uses Server-Side Apply for all dependent resources. Existing deployments are unaffected, and externally-applied patches (like annotations from observability tooling) will now survive operator reconciles.

### Javadocs on the Website

Public API Javadocs are now published alongside version-specific documentation on [kroxylicious.io](https://kroxylicious.io/documentation/0.20.0/javadoc/index.html), making it easier to explore our APIs without leaving your browser.

### Configuration Improvements

- **Configurable Netty shutdown**: New `shutdownQuietPeriod` and `shutdownTimeout` fields give you fine-grained control over Netty shutdown behavior with Go-style durations.
- **Duration serialization**: Filter Config classes can now use `Duration` types that automatically serialize to/from Go-style strings (e.g., "1h") without any annotations.

### Artefacts

Binary distributions and container images are available on the [download](https://kroxylicious.io/download/0.20.0/) page.

### Feedback

We'd love to hear from you! Whether you're kicking the tyres, running Kroxylicious in production, or just find the project interesting — drop by and say hello.
You can reach us through [Slack](https://kroxylicious.slack.com), [GitHub](https://github.com/kroxylicious/kroxylicious/issues) or even [bsky](https://bsky.app/profile/kroxylicious.io)), or tell us in person on one of our upcoming [community calls]({% link join-us/community-call/index.md %}).
1 change: 1 addition & 0 deletions run-snapshot.sh
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,5 @@ cd ${KROXYLICIOUS_DIR}
mvn -P dist clean package -pl :kroxylicious-docs
cp -r kroxylicious-docs/target/web/* ${SCRIPT_DIR}
cd ${SCRIPT_DIR}
export JEKYLL_SERVE_ARGS=--future
exec ./run.sh
6 changes: 5 additions & 1 deletion run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,16 @@ else
RUN_ARGS+=(--net host)
fi

if [ -n "${JEKYLL_SERVE_ARGS}" ]; then
RUN_ARGS+=(--env JEKYLL_SERVE_ARGS="${JEKYLL_SERVE_ARGS}")
fi

if [ "$CONTAINER_ENGINE" = 'podman' ]; then
RUN_ARGS+=(-v $(pwd):/site/:Z)
fi

RUN_ARGS+=(--rm --name jekll_serve -it kroxylicious-website)

${CONTAINER_ENGINE} build . -t kroxylicious-website
${CONTAINER_ENGINE} build . -t kroxylicious-website

${CONTAINER_ENGINE} run "${RUN_ARGS[@]}"
Loading