For the event-sourcing curious
Event sourcing in Python, only where you need it.
Event sourcing is powerful, and it is usually sold as all-or-nothing, which makes it hard to adopt. Protean lets you turn it on for the one aggregate that needs a full history, and keep the rest as plain models.
Opt in per aggregate
Mark one aggregate as event-sourced, define its events, and add apply-handlers. The other aggregates stay as they are. There is no system-wide rewrite to commit to.
The runtime is included
An event store, an async engine, projections, upcasters for schema evolution, and temporal queries are all in the core, so you are not assembling a runtime from parts.
Start without it
Begin with plain domain-driven design, and adopt event sourcing later, when a real need for audit or history shows up, instead of paying for it on day one.