
Emmett is an opinionated yet flexible framework that implements Event Sourcing for Node.js applications. It focuses on composition rather than magic, providing lightweight abstractions and clear patterns that make Event Sourcing accessible and maintainable.
Nowadays, storage is cheap, but the information is priceless.
Event Sourcing, keeps all the facts that happened in our system as events. That provides an observability of the business process and enabling event-driven capabilities like building read models, easier integration between components.
However, implementing Event Sourcing can be challenging due to:
Emmett solves these problems by:
Check Emmett and take your event-driven applications back to the future!
| Feature | Description |
|---|---|
| Event-Centric Modeling | Structured approach to modeling business processes through events |
| Multiple Event Stores | Built-in support for PostgreSQL, EventStoreDB, MongoDB, SQLite, and In-Memory storage |
| Command Handling Patterns | Standardized approach to command processing and event handling |
| Building read models | Built-in projections to build read models from recorded events. |
| Type Safety | First-class TypeScript support with structural typing |
| Express.js Integration | Seamless integration with Express.js, including conventional error handling etc. |
| Comprehensive Testing Support | Tools for unit, integration, and E2E testing with BDD-style syntax |
| Lightweight Design | Focused on composition over replacement, allowing integration with existing systems |
| Docker Testing Integration | Support for TestContainers to simplify database setup in tests |
Read more in documentation, join our Discord Channel and ask any question.
See the video tutorial to learn how to build a full application with it:
Check also my blog articles on Emmett:
What's there is safe to use. I'd like to add more stuff to enhance the production experience, like OpenTelemetry, but users are already using Emmett in their systems.
I like its minimalistic approach and flexibility, plus TypeScript is an excellent language with its shapeshifter capabilities. Plus, I've been asked if I could deliver such a store for Node.js.
We'll see, but for sure, I'd like to have the following:
It is hard to say; my intention is not to compete but to give more options to the community.
There's an open RFC explaining the reasoning and what are the next steps, but TLDR: it'll be (probably)AGPLv3 and/or SSPL and open/core model with paid tools around Emmett. I don't want to do a rug pull later, and I know MIT is too permissive. I want to build Emmett as a community project, but I also don't want my work to be unsustainable and for others to take advantage of it. It'd benefit all if I had a sustainable way to focus on delivering more value in Emmett. I'd be grateful for your comments on the RFC. If you have more detailed questions or concerns, please join our Discord, and I'm happy to clarify them!
💖 If you'd like this project and want us to deliver more and faster, feel invited to join the group of our 👉 Github Sponsors.
By doing so, you're helping to make our work on it sustainable and continuing our efforts so we can support your products.
Emmett is a community project, so once you find something missing or not working, we encourage you to send us a GH issue or Pull Request extending the support or test coverage! Check also Contributing guide
If you think something is missing or want to get some features faster, I'm happy to take sponsoring to prioritise it. Feel free to contact me - we'll find a way to help you!
This project has adopted the code of conduct defined by the Contributor Covenant to clarify expected behavior in our community.
$ claude mcp add emmett \
-- python -m otcore.mcp_server <graph>