Comparison
Protean and the alternatives
Serious frameworks for domain-driven, CQRS, and event-sourced systems have existed for years, in other languages. Java has Axon. .NET has Marten, Eventuous, and Wolverine. PHP has Ecotone. Python has had no equivalent, and that gap is the one Protean fills.
| ProteanPython | AxonJava | Marten.NET | Eventuous.NET | EcotonePHP | |
|---|---|---|---|---|---|
| Domain model as data (IR) | Yes | No | No | No | No |
| Always-valid invariants | Automatic, four layers | Manual | Manual | Manual | Manual |
| Progressive DDD to CQRS to ES | Full, additive | CQRS and ES first | Document and ES | ES-focused | CQRS and ES |
| Built-in async server | Yes, open source | Commercial (Axon Server) | No | No | Partial |
| Startup validation | Comprehensive | Partial | Minimal | Minimal | Minimal |
| Commercial dependency for core | None | Axon Server | None | None | None |
Where the others lead
Axon and Marten are mature and battle-tested, with years of production use and large ecosystems around them. Protean is younger and pre-1.0. If your system runs on the JVM or on .NET, those are strong, proven choices, and the honest answer is to use them. Protean does not compete on the JVM or in .NET, and it does not try to.
What Protean does differently
- The domain compiler. Protean parses your model into a structured Intermediate Representation, so docs, API specs, and contracts are derived from the model. No other framework here captures the whole domain as data.
- Always-valid by construction. The others let you validate; Protean enforces it automatically on every change, across four layers, so invalid state cannot exist.
- One additive path. Start with plain DDD and grow into CQRS and event sourcing per aggregate, in the same codebase, with no rewrite.
- A built-in server with no commercial gate. Axon's server-side strengths live in the commercial Axon Server. Protean's async engine, priority lanes, outbox, and DLQ are in the open-source core.
- It is Python. Your model is ordinary, typed Python, and it runs where Python runs.