Releases: fireflyframework/fireflyframework-rust
v26.6.3 — Hexagonal + Ergonomics + Book PDF
v26.6.3 — 2026-06-13
The ergonomics + pluggable-persistence milestone. Two headline wins: a
Spring-Boot-for-Rust developer experience (one firefly dependency, a prelude
glob, and declarative #[derive(...)] / #[...] macros) and a truly hexagonal
data layer (one set of firefly-data ports, real adapters for Postgres / MySQL
/ SQLite / MongoDB). Everything here is additive; the Go-parity wire contract is
unchanged. The workspace grows from 69 to 76 members (66 → 72 framework
crates).
Added
Hexagonal database adapters (a new DB = a new adapter)
firefly-data— aSqlDialectabstraction (PostgresDialect/
MySqlDialect/SqliteDialect) so theFilterDSL andSpecification
render the same query tree for any relational backend
(Filter::to_sql_with/Specification::to_sql_with, with placeholder style
$nvs?, identifier quoting,IN-list shape, and case-insensitiveLIKE
all dialect-correct).Filter::to_sql/Specification::to_sqlstay the
PostgreSQL default for back-compat. AlsoSpecification::to_mongo()/
Filter::to_mongo()lower the same tree to a MongoDB$-operator filter
document, and theAuditorgains aUserProviderhook.firefly-data-sqlx— the relational repository adapter implementing the
firefly-dataports oversqlxfor Postgres, MySQL, and SQLite from one
codebase:SqlxRepository(blocking-value) andSqlxReactiveRepository
(streaming reads as aFlux<T>) pick the rightSqlDialectat runtime from
theDbpool'sBackend, build dialect-awareUPSERTs
(ON CONFLICT … DO UPDATEfor Postgres/SQLite,ON DUPLICATE KEY UPDATEfor
MySQL), and auto-apply auditing + soft-delete. Backend-agnostic row decoding
viaSqlxRowMapper/AnyRow; writes viaColumnValue/RowWriter.firefly-data-mongodb— the document repository adapter over the official
mongodbcrate:MongoRepository<T, ID>implements the same
ReactiveCrudRepository+ReactiveSpecificationRepositoryports as the
relational adapters, loweringSpecification::to_mongo(), with a
BaseDocumentaudit/soft-delete mixin and anAuditedhook, and cursor-based
streaming reads. A service swaps Postgres for Mongo without touching its call
sites. All four backends are tested against real
Postgres/MySQL/SQLite/MongoDB.
Ergonomic declarative layer (one dependency, macros instead of builders)
firefly-macros— aproc-macrocrate of derive/attribute macros (the Rust
answer to Spring annotations / pyfly decorators):#[derive(Command)]/
#[derive(Query)](→impl firefly_cqrs::Message, with#[firefly(validate)]
/#[firefly(cache_ttl = "…")]);#[command_handler]/#[query_handler]
(→ aregister_<fn>(bus)helper);#[derive(Component)]/
#[derive(Service)]/#[derive(Repository)]+ theregister_all!macro
(→ DI-container registration);#[scheduled](→schedule_<fn>(scheduler));
#[rest_controller]+#[get/post/put/delete/patch](→ a
routes(state) -> axum::Router);#[derive(DomainEvent)]/
#[derive(AggregateRoot)]; and#[event_listener]
(→ asubscribe_<fn>(broker)helper).firefly— the one-dependency facade:use firefly::prelude::*;pulls in
the whole framework (Bus,Container,Scheduler,Saga/Step,
Application,Core/CoreConfig,WebResult/WebError/problem_response,
FireflyError/FireflyResult,Mono/Flux) plus every macro. Ships
ergonomic per-crate aliases (firefly::cqrs,firefly::web, …) and a hidden,
stable__rtcontract path that macro-generated code targets — so a service
depends only onfirefly. Heavy adapters (data-sqlx,data-mongodb,
eda-*,cache-*,admin,full) are opt-in cargo features; a default
build pulls in none of them.samples/macro-quickstart—firefly-sample-macro-quickstart, the same
orders behaviour as theorderssample re-expressed declaratively over the
singlefireflyfacade: 376 source lines vs 1022 (−63%), two modules vs
seven, with no hand-writtenimpl Message,bus.register(…),
Router::new().route(…), or scheduler builder.
Distributed session registries
firefly-session-redis—RedisSessionRegistry, a distributed
firefly_session::SessionRegistrybacked by a Redis sorted set (score =
created_at, oldest-first viaZRANGE; slidingEXPIRE), so the
per-principal session-concurrency cap holds cluster-wide rather than only
within one process.firefly-session-postgres—PostgresSessionRegistry, a durable, distributed
SessionRegistryover a Postgres table (idempotentON CONFLICTupsert,
ORDER BY created_at ASColdest-first) for relational-only deployments.
Testkit + CLI
firefly-testkit— aTestClient/TestResponsein-process axum-router
driver (fluentassert_status/assert_json_eq/assert_header/ …),
assert_event_published/assert_event_published_withover theSpyBroker,
and DI testSlice/BuiltSlicehelpers (the pyflyslice_context/
mock_beananalog, with eager fail-fast resolution).firefly-cli—completion(shell-completion scripts),sbom(dependency
SBOM), andlicense(dependency-license report) commands.
Documentation
- The book now renders to offline editions:
docs/book/dist/firefly-rust-by-example.pdfand.epub(pandoc + tectonic),
viamake book-pdf/make book-epub. A new
"Declarative Services with Macros" chapter covers the facade + macros, and the
persistence chapter is extended with the MySQL / SQLite / MongoDB adapters.
Fixed
- Adversarial-review fixes (macros + data adapters):
firefly-data—Op::Like/Op::ILikenow lower to an anchored
MongoDB$regex(^…$, translating SQL%/_, regex-escaping the rest),
so the sameSpecificationmatches identical rows on Mongo, SQL, and
in-memory (an unanchored Mongo$regexwould have madename LIKE 'A%'
silently match"bAr").firefly-data-sqlx—saveresurrects soft-deleted rows (clears
deleted_aton upsert); timestamp coercion is tag-driven, so
RFC3339-looking text is no longer mis-typed as a timestamp.firefly-macros—#[derive(DomainEvent)]JSON-encodes through the facade's
__rt::serde_json(preserving the one-dependency contract);
#[event_listener]preserves the consumergroupwhen given a positional
topic;#[scheduled]rejectscron+initial_delaywith a compile error.
serde_jsonordering wire-parity — linking themongodb/bsoncrate
turned onserde_json/preserve_orderworkspace-wide (Cargo feature
unification), flippingserde_json::Mapfrom sorted-key to insertion-order;
restored deterministic sorted-key wire output where it is contractually
required (config-server,openapi,callbacks).- Stabilized flaky admin SSE timing tests (raised the under-load timeout).
v26.6.2
v26.6.2 — 2026-06-13
The reactive milestone. This release adds a WebFlux-style reactive
core and threads it through the framework, makes every vendor adapter
real (no stubs remain), introduces real-infrastructure Docker testing
and an mdBook documentation site, and ships the firefly developer CLI
and an end-to-end reactive sample. The Go-parity wire contract is
unchanged; everything here is additive.
Added
Reactive core (the keystone)
firefly-reactive— a faithful Project Reactor / WebFlux analog:
Mono<T>(0-or-1 + error) andFlux<T>(0..N + terminal error) over
tokiofutures/streams, fixed tofirefly_kernel::FireflyError. Ships
aScheduler(Immediate/Parallel/BoundedElastic), a
FluxSinkfor imperative emission (Flux::create), aBackoffretry
policy, and the full operator surface — transform (map/flat_map/
concat_map/scan), combine (merge/concat/zip/
combine_latest), reduce/terminal (reduce/collect_list/
collect_map), error (on_error_resume/on_error_continue/
retry/retry_backoff), time (timeout/debounce/sample/
interval), backpressure (on_backpressure_{buffer,drop,latest}/
limit_rate), and windowing (buffer/window/group_by).
Reactive integration across the framework
firefly-web— reactive HTTP responders:MonoJson<T>(renders a
Monoas JSON,Ok(None)→ 404 problem+json,Err→ RFC 7807),
NdJson<T>andSse<T>(stream aFluxasapplication/x-ndjson/
text/event-streamwith true backpressure — never buffered),
andSseEvents(pre-builtfirefly_sse::Eventframes).firefly-data— the reactiveReactiveCrudRepository<T, ID>(with
find_all/find_by_id/save/delete_by_id/countreturning
Mono/Flux), an in-memoryReactiveMemoryRepository, a
ReactiveSpecificationRepository, and a realPostgresReactiveRepository
that streams rows out offind_all()as aFlux<T>over
tokio-postgres(withRowMapper/TableConfig).firefly-client— the reactiveWebClient(WebClientBuilder→
get/post/put/delete/patch→RequestSpec→
retrieve()→ResponseSpec::body_to_mono::<T>()/
body_to_flux::<T>()/exchange()), the Rust analog of WebFlux's
WebClient.firefly-eda— reactive subscription:InMemoryBroker::subscribe_reactive
(and_with_buffer) yields aFlux<Event>with bounded backpressure,
andpublish_monois a cold reactive publish.firefly-cqrs— reactive bus:Bus::send_mono/query_mono(and the
_with_contextvariants) wrap dispatch in a lazyMono<R>, running the
same handler lookup and validation/authorization/caching middleware;
cqrs_error_to_fireflymapsCqrsErroronto the right HTTP status.
Real vendor adapters — zero stubs
- The SendGrid and Resend email channels are now real:
SendGridEmailProvider
POSTs to SendGrid v3/mail/send,ResendEmailProviderPOSTs to Resend
/emails, both overreqwest; their Go-parity envelopeChannels
delegate to the real provider. No notification, IDP, or ECM adapter
ships aNotImplementedsentinel any longer. firefly-cache-postgresis a realcache::Adapter(PostgresCacheAdapter)
backed by a Postgres key/value table with TTL overtokio-postgres
(upsert,set_if_absent,delete_prefix, key scan, health check).firefly-starter-webis a real web-stack starter:WebStacklayers
Corewith CORS, security headers, request metrics, and an access log
by default, with optionalFilterChainsecurity.
Real-infrastructure testing
- A
docker-compose.ymlstack (Postgres, Redis, RabbitMQ, Redpanda,
Keycloak, LocalStack S3, Azurite Blob, MailHog SMTP) plus
make infra-up/make test-integration/make infra-down. The
env-gated integration tests run the cache, EDA, IDP, ECM, notification,
and reactive-Postgres adapters — and the reactive-banking sample —
against the real services, whilecargo test --workspacestays
green offline (each test skips when its connection env var is unset).
Documentation, tooling, and samples
docs/book— an mdBook guide (builds with mdBook) covering why-Firefly,
quickstart, configuration, dependency wiring, the keystone reactive
model, HTTP APIs, persistence, DDD, CQRS, EDA, event sourcing, sagas,
HTTP clients, security, observability, scheduling/notifications,
caching, testing, the CLI, production, and appendices (Spring mapping,
module index, glossary).firefly-cli— thefireflydeveloper binary (new,generate/g,
info,doctor,db,openapi, and remote actuator introspection),
installable viamake cli-install/cargo install --path crates/cli.samples/reactive-banking—firefly-sample-reactive-banking, an
end-to-end reactive service: reactive CQRS, event sourcing, a
saga-backed money transfer, aFlux<AccountEvent>NDJSON/SSE stream,
JWT-securedstarter-web, and aWebClientSDK, running on in-memory
defaults or real Postgres/Kafka.
Changed
- Every source file now carries the Apache 2.0 license header (Firefly
Software Foundation, 2026). - Documentation refreshed end to end (README,
MODULES.md, thedocs/
guides, and the book): the reactive core and integrations are now
prominent, all vendor adapters are documented as real/Full, the
real-infra testing path is described, and the workspace count is
current (66 framework crates; 69 workspace members).
Fixed
- Adversarial-review fixes across the reactive surfaces and adapters
(error mapping, backpressure/termination semantics, and connection
handling), and corrected documentation that previously described
SendGrid/Resend,cache-postgres, andstarter-webas port-pending
stubs.
v26.6.1 — Firefly Framework for Rust
v26.6.1 — 2026-06-12
First public release of the Rust port at
https://github.com/fireflyframework/fireflyframework-rust.
Fourth sibling port of the Java/Spring Boot Firefly Framework, joining
the .NET, Go, and Python (PyFly) ports. Ported with full module parity
against the Go port (the canonical compiled-language reference) plus a
purely additive PyFly-parity layer: one Cargo workspace with 67
members — 65 firefly-* crates under crates/, the cross-crate
integration suite, and the Orders reference sample. Targets Rust 1.85+
(edition 2021) on the tokio + axum + serde stack, with thiserror
errors, async-trait ports, RustCrypto primitives, and tracing
structured logging. Wire-compatible with the sibling ports: RFC 7807
application/problem+json, X-Correlation-Id propagation,
Idempotency-Key semantics, event envelope JSON, HMAC webhook
signatures, Spring-Cloud-Config response shape, and V###__name.sql
migration naming.
The Go-parity core (foundational, platform, starter tiers) is kept
byte-stable on the wire; everything in the PyFly-parity layer below
layers onto the existing crates without changing any established wire
format.
Added
Foundational tier (6 crates)
firefly-kernel— RFC 7807ProblemDetail,FireflyResult<T>,
Clock,FireflyErrorhierarchy, task-local correlation scopesfirefly-utils— try/retry helpers with backoff, slug, AES-256-GCM,
templatesfirefly-validators— IBAN, BIC, Luhn, currency, phone, password,
sort code, VAT, Spanish IDsfirefly-web— problem renderer, correlation, idempotency, PII
masking as composabletowerlayersfirefly-config— typed YAML / env / flag binding with profile
selectionfirefly-i18n— locale-aware message bundles + Accept-Language
resolver
Platform tier (19 crates)
firefly-cache,firefly-observability,firefly-data,
firefly-cqrs,firefly-eda(in-memory broker full; Kafka/RabbitMQ
scaffolds return typed sentinels),firefly-eventsourcing,
firefly-orchestration(Saga / Workflow DAG / TCC),
firefly-rule-engine,firefly-plugins,firefly-lifecycle,
firefly-actuator
(/actuator/{health,info,metrics,env,tasks,version}),
firefly-scheduling,firefly-resilience,firefly-security,
firefly-migrations,firefly-openapi,firefly-sse,
firefly-transactional,firefly-testkit
Adapter tier
- Full:
firefly-client(REST builder; SOAP/gRPC/WS scaffolds),
firefly-config-server,firefly-idp+firefly-idp-internal-db,
firefly-ecm(port + LocalStore),firefly-notifications
(dispatcher + memory channel),firefly-callbacks,
firefly-webhooks - Real vendor adapters (PyFly-parity):
firefly-idp-keycloak
(OIDC + admin REST),firefly-idp-azure-ad(Microsoft Graph + ROPC),
firefly-idp-aws-cognito(JSON API + self-contained SigV4),
firefly-ecm-storage-aws(S3),firefly-ecm-storage-azure
(Blob Storage),firefly-ecm-esignature-docusign(REST v2.1),
firefly-ecm-esignature-adobe-sign(REST v6),
firefly-ecm-esignature-logalty(eIDAS REST),
firefly-notifications-twilio(SMS),firefly-notifications-firebase
(FCM push) — each keeps a Go-parity/back-compat stub alongside the
real provider - Stub (port-asserting, typed not-implemented errors):
firefly-notifications-sendgrid,firefly-notifications-resend
Starter tier (5 crates)
firefly-starter-core(one-callCore::new(CoreConfig)wiring),
firefly-starter-application,firefly-starter-domain,
firefly-starter-data,firefly-backoffice
PyFly-parity layer
New cross-cutting crates (opt-in; the Go-parity core does not depend on
them):
firefly-container— opt-inTypeId-keyed DI container (service
locator):register_factory/resolve/resolve_all/
bind::<dyn Trait>/Scope/Provider<T>/RefreshScope;
explicit factory closures (no reflective autowiring)firefly-aop— Spring-style aspect advice:Pointcutglob matcher,
JoinPoint,Aspect(before / around / after-returning /
after-throwing / after),AspectRegistry,interceptchain executor
with explicit weaving at the call sitefirefly-session— server-side HTTPSession(typed serde
attributes),SessionStore(MemorySessionStore/CacheSessionStore),
SessionLayer(cookie load/save, id rotation, invalidation, HMAC
signing),SessionRegistry+ concurrency controlfirefly-shell— Spring-Shell-style CLI framework:CommandSpec
builder, typedCommandArgs,StdShellparser + REPL,
ApplicationArguments,CommandLineRunner/ApplicationRunner+
RunnerRegistryfirefly-websocket— WebSocket server over axum:WsSession,
WebSocketHandler,ws_route/serve_ws, topicBroadcastHubfirefly-cli— thefireflydeveloper binary:new,generate/g,
info,doctor,actuatorfirefly-admin— Spring-Boot-Admin-style embedded dashboard (SPA +
JSON API overfirefly-actuator+ SSE live streams + instance
registry / client modes;firefly.admin.*config)
Real infrastructure transport / cache adapters (implement the existing
platform ports; pull their backing SDK only when selected):
firefly-cache-redis—cache::Adapterover Redis (RESP viaredis)firefly-eda-kafka—eda::Brokerover Apache Kafka (rdkafka)firefly-eda-rabbitmq—eda::Brokerover RabbitMQ (lapin,
durable direct exchange, publisher confirms)firefly-eda-postgres—eda::Brokeras a Postgres transactional
outbox +LISTEN/NOTIFY(tokio-postgres, advisory-lock drain)firefly-eda-redis—eda::Brokerover Redis Streams consumer groupsfirefly-notifications-smtp— SMTP email channel overlettre
(real MIME, STARTTLS, BCC-not-leaked)
Reserved as port-pending placeholders for the next wave (compile and
carry their locked dependency set; implementation lands without
disturbing the wire contract):
firefly-cache-postgres— Postgres-backed