I built Urich after getting tired of hand-wiring DDD/CQRS on top of Starlette: routers, command handlers, OpenAPI, and DI scattered everywhere.
The idea: one object per bounded context. You define a DomainModule (aggregate, repository, commands, queries, event handlers), call app.register(orders_module), and get routes like POST /orders/commands/create_order and GET /orders/queries/get_order plus OpenAPI from your dataclasses. Event bus, discovery, and RPC are separate modules; you plug in your adapters (Redis, Consul, etc.) or use in-memory defaults. Core stays small and protocol-based so you’re not locked in.
Python 3.12+, Starlette, Pydantic. CLI for scaffolding (urich create-app, add-context, add-aggregate). Docs and an ecommerce example are in the repo.
Would love feedback from anyone building microservices with DDD/CQRS — what’s missing, what would break in your setup, or what you’d want next (e.g. more adapters, patterns).