Why Benzene
Choosing a framework is a bet on cost, risk, and longevity, not just ergonomics. Benzene's is straightforward: your business logic is the asset, and the cloud, the transport, and the host are details that should be cheap to change.
Lower the cost of change
Requirements move. A new event source, a queue in front of an API, a service split in two. In most stacks each of those is a rewrite; in Benzene it's wiring.
The handler doesn't change
Your logic is a plain C# message handler against a topic. Reaching it over a new transport, whether HTTP, a queue, a topic, or an event bus, is a line in the host wiring. The code you already wrote and tested stays untouched.
Fewer moving parts to run
One function can serve HTTP alongside several queues and topics at once, so a service is a single deployable rather than a sprawl of single-purpose functions. That's less to deploy, monitor, and pay for.
Evolve without a rewrite
Put a queue in front of a synchronous endpoint, or promote a response into a published event, by adding middleware. Normally that kind of change means re-plumbing a service.
Reduce lock-in and risk
The expensive lock-in isn't the cloud you're on; it's how deeply your code is tangled into one vendor's event model. Benzene keeps that boundary thin.
Transport- and vendor-agnostic
Handlers, middleware, and topics don't know whether they run behind Lambda, Azure Functions, a self-hosted worker, or ASP.NET Core. Moving between them is a hosting change, and the SDK is still there when you need it.
Plain C#, no proprietary runtime
It's the .NET, dependency injection, and async your team already knows, with no bespoke DSL or engine to learn. Onboarding a Benzene service is onboarding a normal C# codebase.
Open, and yours to fork
MIT-licensed and open source. There's no per-seat fee, no telemetry calling home, and no vendor roadmap you're hostage to.
Quality and reliability you can point to
Two of the biggest long-run costs are defects that reach production and incidents no one can diagnose. Benzene is built to keep both down.
Test-first, without the cloud
Every transport ships a test host and helpers, so a handler is exercised exactly as SQS, Lambda, or HTTP would invoke it, in memory and in a normal unit test with no emulator.
Observable by construction
Correlation IDs, structured logs, metrics, and distributed traces come from composable middleware shared across transports. The Operations page has the full picture.
Reliable under real traffic
Health checks, retries, idempotency, and per-message failure handling are first-class. The Operations page lays out what's in the box and what you supply yourself.
Built to last
A framework you build on should be predictable to upgrade and honest about where it is.
A versioning policy, not surprises
Semantic versioning, with written migration guides for breaking changes, so an upgrade is a planned task rather than archaeology.
Modern .NET, broad reach
Built on .NET 10, with core packages also targeting older runtimes for back-compat. It runs on the hosts your platform team already chose (see Architecture).
Pre-1.0, and candid about it
Benzene is approaching 1.0; packages are published as prerelease (--prerelease) today. The docs mark anything partial or planned as such rather than overselling it.