NEventStore for .NET Event Sourcing
A persistence agnostic Event Store for .NET
At a glance
- What is it?
- NEventStore is a C# library for .NET applications built around event sourcing, DDD, and CQRS. It separates event-store abstractions from persistence choices and provides JSON, BSON, MessagePack, and polling packages.
- Who is it for?
- NEventStore suits .NET teams designing DDD or CQRS systems that need event persistence behind a common abstraction. It is less suitable for applications that only need CRUD persistence or a complete hosting platform.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 93 days ago.
- What is it written in?
- Mainly C#, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.
Editorial analysis
NEventStore's role in event-sourced .NET applications
NEventStore addresses the storage side of event sourcing. In an event-sourced application, changes to domain state are represented as events, and those events must be stored and retrieved so that application state can be reconstructed. The README describes NEventStore as a persistence library that abstracts different storage implementations. That abstraction is useful when a .NET application follows Domain-Driven Design or Command Query Responsibility Segregation, because domain code can work with an event-store abstraction while persistence technology remains a separate concern.
The intended audience is developers building .NET applications with an event-sourcing storage mechanism, especially teams whose domain model is organized around DDD or CQRS. It is not presented as a general-purpose database, web framework, or application server. The README lists NEventStore as the core library and separately identifies serialization and polling packages. The repository therefore supplies infrastructure for persisting and working with events, while the application remains responsible for its domain model, command handling, query side, and deployment.
This boundary makes the project useful when historical changes matter to the application design. It also means NEventStore is not a substitute for deciding how commands, queries, aggregates, projections, or domain events should be modeled. The library addresses persistence abstraction. The business model still belongs to the application using it.
Core abstractions and serialization boundaries
The repository layout and README indicate that persistence is not fixed to one engine by the core library. NEventStore is intended to abstract storage implementations, and the documentation points to a wiki for setup and further information. The package list includes `NEventStore`, `NEventStore.Serialization.Json`, `NEventStore.Serialization.Bson`, `NEventStore.Serialization.MsgPack`, and `NEventStore.PollingClient`. This structure separates the event-store core from serialization choices and from polling behavior.
The README does not enumerate the concrete persistence packages or document interface names, connection strings, migrations, transaction behavior, or query syntax. A team should not assume that a particular database is supported by NEventStore 10.2.0 without checking the project documentation or source tree. The core design point is still concrete: applications can avoid binding domain code directly to one storage implementation, but choosing and configuring the actual persistence backend remains part of integration work.
The separate serializers expose an operational decision. JSON, BSON, and MessagePack are offered as implementations of `IDocumentSerializer`, not as interchangeable commands with identical storage semantics. A team should verify which serializer its chosen persistence package expects and how existing event payloads behave when the serializer or event schema changes. The README does not document event schema evolution or migration procedures, so those details require checking the linked documentation and source.
The `NEventStore.PollingClient` package also indicates a polling-based integration option. The README does not describe its polling interval, retry policy, ordering rules, or failure handling. Those are material concerns for applications that depend on receiving changes reliably.
Building NEventStore from the repository on Windows
The README gives a Windows build procedure, but it does not provide a NuGet installation command or a complete first-application example. To build the repository on a Windows machine, open a PowerShell console in Administrative mode and run the build script named `build.ps1` from the repository root. The script handles the local build.
build.ps1The README states that the build script updates `AssemblyInfo.cs` before the build starts and obtains the version from repository tags using `gitversion`. It also says not to update version numbers manually and not to commit generated `AssemblyInfo.cs` files. That version process matters when NEventStore is used as a submodule in another project, because the README says the library needs its own version number when building those projects.
The listed CI references are GitHub Actions workflows for the `master` and `develop` branches. The repository default branch is `develop`. The README also links `Changelog.md`, which is the relevant place to inspect release-specific changes before selecting a version. For getting started with library usage, the README directs readers to the documentation and wiki rather than showing an application example.
Runtime support and versioning considerations
The compatibility statement is specific but limited. NEventStore currently supports `.net standard 2.0` and `.net framework 4.6.2`. That matters for teams targeting older .NET Framework applications or .NET Standard consumers, because the library must fit the application's supported runtime set. The README does not list later .NET runtime targets, so a team should not infer support for them from the repository name or release number.
The README says that, starting with version 6.0.0, NEventStore uses Semantic Versioning. It does not provide a compatibility matrix for individual persistence packages or serializers. That omission matters in an event store. Event payload compatibility can be more consequential than a simple assembly upgrade because stored events may outlive the process that wrote them. The README does not document compatibility guarantees for changing serializers, renaming events, or changing event property types.
The latest listed release is 10.2.0, dated 2026-06-15. Earlier listed releases include 10.1.1 and 10.1.0, both dated 2025-05-15. The repository is not archived, and the last push was on 2026-07-22. Those facts show recent repository activity, but the README does not provide a support policy for older releases or a documented upgrade path for existing event streams. Upgrade planning must therefore account for serialized data that may already exist in the selected persistence implementation.
Limitations visible in NEventStore's documentation
The main limitation visible in the README is incomplete integration documentation. It names the core package and several companion packages, but it does not show how to register a persistence implementation, create a stream, append an event, subscribe to changes, or configure a serializer. The wiki is linked for getting started, so the README is an entry point rather than a complete API guide.
NEventStore may also be the wrong tool when the application does not need an event-sourcing storage mechanism. A conventional CRUD system that stores current records directly does not need the event stream model described here. The project's focus on DDD and CQRS is a meaningful scope boundary. Likewise, a team seeking a hosted database, a migration console, or a complete operational platform will not find those responsibilities described in this repository.
The README does not document rollback, snapshotting, concurrency conflicts, retention, projections, delivery guarantees, or backup procedures. Those omissions prevent a firm claim about operational behavior. The presence of `NEventStore.PollingClient` indicates a polling option, but the README does not describe how consumers recover after interruption or whether polling is appropriate for a particular workload.
Event-sourced applications also need stable event contracts. The repository description does not say how NEventStore handles schema changes, so application teams must make that decision themselves and verify that stored payloads remain readable after upgrades. This is an architectural responsibility rather than a convenience supplied by the package.
A direct database approach as the main alternative
A conventional repository layer backed by a relational or document database is the main alternative for teams whose requirements are record-oriented rather than event-oriented. That approach stores current state and updates records directly, so it does not introduce an event stream and its associated replay or projection decisions. It can align more directly with ordinary CRUD screens when the application does not need historical domain events as its source of truth.
The difference is architectural, not merely a choice of driver. NEventStore keeps event persistence behind a library abstraction and offers serialization packages, while a direct database integration usually exposes a database client or ORM to application code. An event-sourced design can make domain history explicit and keep persistence replaceable, but the application still needs event contracts and reconstruction logic. A direct database design may be simpler when history is not part of the domain model.
The README does not provide a benchmark or migration comparison, so neither approach should be described as faster or cheaper based on this repository text alone. The relevant first decision is whether the domain requires event history and replay. If it does not, the event-store model may add design work without supplying a required capability. If it does, the team must confirm that the persistence implementation and serialization format meet the application's durability and recovery requirements.
Editorial conclusion
NEventStore suits .NET teams designing DDD or CQRS systems that need event persistence behind a common abstraction. It is less suitable for applications that only need CRUD persistence or a complete hosting platform. Verify the target storage implementation, serializer behavior, supported runtime, and documented persistence path before adoption. The repository was last pushed on 2026-07-22, and its latest listed release is 10.2.0 from 2026-06-15.
Frequently asked questions
What is NEventStore used for?
NEventStore is a persistence library for .NET applications that use event sourcing as their storage mechanism. The repository focuses on abstraction across storage implementations and on DDD and CQRS applications.
Which .NET runtimes does NEventStore support?
The README lists `.net standard 2.0` and `.net framework 4.6.2` as supported targets. It does not list other runtime versions.
Which serialization packages are available?
The README lists `NEventStore.Serialization.Json`, `NEventStore.Serialization.Bson`, and `NEventStore.Serialization.MsgPack`. These packages provide serialization for use with an `IDocumentSerializer`.
How is NEventStore built on Windows?
The README instructs Windows developers to open a PowerShell console in Administrative mode and run `build.ps1` from the repository root. It does not provide a separate install command for the library packages.
Does NEventStore have a documented polling option?
Yes. The README lists `NEventStore.PollingClient` as a package that provides an implementation for a `PollingClient`. The README does not describe its configuration or failure behavior.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/neventstore-neventstore)Was this useful?