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 |