Built directly on Bun.serve / Bun.file and Web Standard Request / Response. No Node compat layer.
DI is mandatory, not bolted on
Every app is built around a Container. Routes and middleware declare their dependencies; the container validates the full graph at boot.
Named-object route DI
app.get(path, { svc: Service }, (req, { svc }) => ...) — explicit, type-safe, no string-parsing tricks.
Structured errors
Default error responses follow RFC 9457 (Problem+Json), with full type-safe error definitions.
Contract-first (oRPC style)
Define a contract once (zc.get(path).params(s).body(s)...), implement it with full type inference, and derive a type-safe client from the same contract.
Zero-dependency packages
Contracts, clients, and Redis adapters ship with zero runtime dependencies. Types flow from contracts to clients.