Roadmap

Halyx 1.1.0 is on Maven Central. This page lists what has been delivered, what is left over, and what comes next, in priority order. Work that is planned but waiting for demand, and ideas that were dropped, are at the end.

Status#

Stage Work
Released 1.1.0, with Kotlin coroutines, function invocation and rotated keys, on 2 November 2026; 1.0.2, a patch release, on 25 October 2026; 1.0.1, a patch release, and 1.0.0, the first release, both on 23 October 2026; all on Maven Central
Coming next Planned additions: R2DBC through the Cloud SQL connector, and more real-cloud test runs
Delivered 19 milestones: every service on AWS, Azure and Google Cloud, Spring Boot 3.5 and 4, reactive and asynchronous APIs, Kotlin coroutines, function invocation, rotated keys and passwords, a portable microservice on EKS, GKE and AKS, and cloud logins across clouds

Released#

Release 1.1.0#

A minor release, on 2 November 2026, compatible with 1.0: japicmp checks every published module against 1.0.0. See the release notes.

Addition What it brings
Kotlin coroutines suspend fun listeners, coroutine repositories with Flow results, and coroutines over the reactive services
Function invocation AWS Lambda functions, Azure Functions and Cloud Run functions invoked by name, with each cloud's login, the same exceptions everywhere, and what a failed function reported kept whole
Rotated keys and passwords Keys and passwords read from a parameter store as they're used, so a rotation takes effect without a restart
API compatibility checks mvn verify fails on an incompatible change to the public API or the provider SPI

Before the release, every real-cloud tier on AWS, Google Cloud and Azure passed, with Spring Boot 3.5 and 4, and the portable orders service on EKS, GKE and AKS: see Cloud testing.

Release 1.0.2#

A patch release, on 25 October 2026. See the release notes.

Fix Who it affects
The JSON cache codec prefers Jackson 3 whenever it's present Spring Boot 4 applications with halyx.cache-manager.codec=json and Jackson 2 on the classpath too, as halyx-azure brings it, where caching a value with an Instant failed
A started ReactiveHalyx call runs to completion when it's cancelled, and its result is dropped, instead of having its thread interrupted Code that cancels reactive calls, by timeout() for example, on the default virtual-thread scheduler or boundedElastic

It also adds a plain Java quickstart sample, without Spring, contributed in #8.

Release 1.0.1#

A patch release, on 23 October 2026. See the release notes.

Fix Who it affects
halyx-kafka excludes the unpatched org.lz4:lz4-java that kafka-clients brings, leaving only the patched at.yawk.lz4 one Gradle builds on Spring Boot 3.5 with halyx-aws, halyx-azure or halyx-gcp, which failed to resolve
ReactiveBlobStore.getBody closes the blob before the completion or error reaches the subscriber Code that checks the blob is closed as soon as the Flux completes

Release 1.0.0#

The first release on Maven Central, on 23 October 2026.

Task Status
Apache-2.0 license, with headers on every source file Done
The dev.halyx group id Done
A full build and test pass, on emulators and on real clouds Done
Project metadata: URL, SCM and developers Done
Source and javadoc jars, signing, and the Central publishing plugin (mvn -Prelease deploy) Done
Java module names: an Automatic-Module-Name in each published jar, such as dev.halyx for halyx-core and dev.halyx.aws for halyx-aws, checked together on the module path Done
Continuous integration: unit and emulator tests on every push, and the documentation site Done
A security policy (SECURITY.md) and release notes Done
A public repository, and the documentation at halyx.dev Done
The release: version 1.0.0, a v1.0.0 tag, the upload to Maven Central, and a GitHub release Done
module-info.java descriptors Later: most of the cloud SDKs ship without them
API compatibility checks with japicmp: each published module against the last release, in mvn verify Done

Coming next#

Additions planned on top of 1.1.0.

Item Area Today
R2DBC through the Cloud SQL connector R2DBC R2DBC connects to Cloud SQL directly, with IAM login; JDBC also works through the connector
A real-cloud run on MSK Serverless with IAM, including transactions Streams Tested on Kafka 3.9 and 4.2.1 brokers, and on real Event Hubs and Managed Kafka. The run is ready (AWS tier 4) and needs an AWS account plan that includes MSK
A real-cloud run on Azure Database for MySQL with Entra ID SQL databases The run needs a directory-level grant in the test tenant
Fully non-blocking I/O for Google Cloud Storage, Service Bus receives, and Cosmos DB and Firestore read-then-write calls Asynchronous I/O These calls work and run on virtual threads, so they hold no platform thread while they wait; they become non-blocking when the SDKs allow it

Delivered#

# Milestone What it delivered Guide
1 Core and object storage The portable API, provider SPI, error model and interceptors; blob storage on S3, Azure Blob Storage and Cloud Storage; conformance kits and emulator tests Storage
2 Caches One Redis and Valkey driver with cloud logins: ElastiCache IAM, Entra ID, Memorystore IAM Caches
3 SQL databases A pooled DataSource with cloud IAM login and token refresh: RDS IAM, Entra ID, Cloud SQL, and the Cloud SQL connector SQL
4 Parameters and secrets SSM Parameter Store, Secrets Manager, App Configuration, Key Vault, Parameter Manager, Secret Manager and HashiCorp Vault; Spring configuration import with reload Parameters
5 NoSQL documents DynamoDB, Cosmos DB and Firestore NoSQL
6 Spring Boot The starter, properties, auto-configuration, health and Micrometer, on Boot 3.5 and 4 Spring Boot
7 Messaging SNS and SQS, Service Bus, Pub/Sub; listeners, claim checks, tracing Messaging
8 Production gaps NoSQL secondary indexes and transactions, batched acks, Service Bus sessions
9 Real-cloud testing The conformance kits on real AWS, Google Cloud and Azure, in tiers, on throwaway infrastructure Results
10 Spring Data repositories Repositories over DynamoDB, Cosmos DB and Firestore: records as entities, derived queries on keys and indexes, optimistic locking and keyset scrolling; on the emulators and all three clouds Repositories
11 Streams (managed Kafka) StreamProducer and StreamConsumer on Amazon MSK (IAM), Event Hubs' Kafka endpoint (Entra ID) and Managed Service for Apache Kafka (Google IAM). Order per partition, consumer groups, listeners with retries and dead letters, manual commits, idempotent and transactional producers, claim checks; Spring for Apache Kafka with Halyx' cloud login; tested on Kafka 3.9 and 4.2.1 brokers. Real clouds: Event Hubs 24/25 (1 skipped as expected), Managed Kafka 25/25 Streams
12 Event services CloudEvents 1.0 and EventPublisher, publishing to EventBridge, Event Grid namespace topics and Eventarc Advanced, and receiving through each router's queue, including Event Grid pull subscriptions; on the memory provider, emulators and real clouds, with Spring Boot 3 and 4 Events
13 R2DBC with cloud IAM login halyx-r2dbc: a pooled R2DBC ConnectionFactory for PostgreSQL and MySQL whose new connections log in with RDS IAM, Entra ID or Cloud SQL IAM tokens, or a rotating password; Spring Data R2DBC on Boot 3.5 and 4; real-cloud runs on RDS, Azure Database for PostgreSQL and Cloud SQL. SQL Server stays password-only, because its R2DBC driver takes no access tokens R2DBC
14 Reactive and asynchronous APIs halyx-reactor: Mono and Flux for every service with back-pressure and context propagation, reactive repositories, WebFlux and reactive @Cacheable, and interoperability with RxJava, Mutiny, Flow and CompletableFuture. async() views of every service, non-blocking where the SDK's async client does it well: S3, Azure Blob Storage, DynamoDB, Cosmos DB, Firestore, SNS, SQS, Service Bus and Pub/Sub publishing, EventBridge, Event Grid, Eventarc, SQS, Pub/Sub and Event Grid receives, Redis and Valkey, Kafka producers, and every parameter backend. The adapters add about 5 µs per call Reactive and async
15 Portable Spring Boot microservices halyx-samples/portable-orders, an orders service on every Halyx API, built once as one image that runs unchanged on every cloud: the cloud is chosen by Spring profile, and optional features cover services a deployment can't offer. One Helm chart deploys the same image digests on EKS (Pod Identity), GKE (Workload Identity Federation) and AKS (Entra Workload ID), with no stored keys. One end-to-end suite runs in memory, on each cloud's emulators, against the image and on the three clusters, on Boot 4 and 3.5: EKS 8/10 (no MSK), GKE and AKS 9/10 Portable microservice
16 Cloud logins Credentials.impersonate(target): an AWS IAM role through STS, with an external ID, a session name and a lifetime, or an impersonated Google service account, for every client and for SQL, cache and Kafka logins. Credentials.servicePrincipal(...): an Entra ID application with a client secret, a certificate or a federated token file, for every Azure service. STS, SSO and SSO OIDC in halyx-aws for web identity (EKS) and SSO logins. Spring Boot credentials.type: impersonate and service-principal. Real clouds (tier 5): an assumed role with an external ID, an impersonated service account, and a service principal with a secret and with a federated Google ID token, on Boot 3.5 and 4. The certificate login is tested with unit tests only Provider configuration
17 Kotlin coroutines suspend fun @HalyxListener methods for subscriptions and stream consumers; coroutine repositories with suspend CRUD and queries and Flow results, on @JvmRecord entities; awaitSingle and asFlow over the reactive services, with back-pressure and context. Tested on Boot 3.5 (Kotlin 1.9) and Boot 4 (Kotlin 2.3), in memory and on Kafka, SQS and DynamoDB emulators. In 1.1.0 Kotlin coroutines
18 Function invocation FunctionInvoker: AWS Lambda functions, Azure Functions and Cloud Run functions invoked by name with a payload and headers, with each cloud's login (IAM, Entra ID tokens or function keys, Google ID tokens) and the same exceptions on all three. Configured timeouts and headers, retries only for functions marked idempotent, fire-and-forget trigger on Lambda, async() and ReactiveFunctionInvoker views, trace context into the function, and Spring Boot halyx.functions. A failed invocation keeps what the function reported, whole, as a FunctionError cause. A function conformance kit on the memory provider, Floci's Lambda, the Azure Functions host and Google's Functions Framework. Real clouds (tier 1): Lambda 11/12, Cloud Run functions and Azure Functions 10/12 each, the skips expected; Spring 4/4 on each. In 1.1.0 Functions
19 Rotated keys and passwords Keys and passwords read from a parameter store as they're used, so a rotation takes effect without a restart: Azure function keys on every call, Cosmos DB and Event Grid keys every azure.key-refresh-interval, and cache and Kafka passwords at each login, as SQL passwords already were. Spring Boot secrets on providers, event buses, subscriptions and functions, and auth.secret on caches and stream clusters; a missing secret, or a halyx.* placeholder that didn't resolve, fails the start. The store can be on another cloud. Service Bus and App Configuration connection strings stay read once, as their SDKs copy the key: Entra ID login rotates instead. Emulators: a rotated key on the Azure Functions host, rotated passwords on Valkey and on Kafka 3.9 and 4.2. Real cloud (Azure tier 1): a function key, a Cosmos DB key and an Event Grid key rotated in Key Vault while the clients stay open, 3/3, and the function key through Spring Boot secrets on Boot 3.5 and 4. Cache and Kafka password rotation is tested on the emulators, as the clouds' caches and Kafka endpoints in the tests use Entra ID or IAM. In 1.1.0 Keys for other services

On demand#

Planned, and prioritised by demand:

Feature What it adds
Aurora fast failover Faster failover through the AWS Advanced JDBC Wrapper
Nested field paths Updates to fields inside nested NoSQL documents
Cross-instance cache stampede protection One load per key across all instances; getOrLoad already shares loads within an instance
Object storage extras Archive restore, KMS encryption, versioning, tags and retention

Not planned#

Considered and dropped, because they already work another way or don't justify the added complexity:

Idea Why not
Cache endpoint discovery through cloud APIs You configure the endpoint; discovery adds permissions and failure modes
Push notifications for parameter changes Polling watch and configuration reload cover it
SSM and Secret Manager labels Rarely needed; unwrap covers them
GCS parallel composite uploads and the AWS CRT client The parallel transfer engines already cover large objects
RDS Proxy support Nothing to add: point host at the proxy endpoint, with IAM login if it requires it