Wallaby 1.1.0
dotnet add package Wallaby --version 1.1.0
NuGet\Install-Package Wallaby -Version 1.1.0
<PackageReference Include="Wallaby" Version="1.1.0" />
<PackageVersion Include="Wallaby" Version="1.1.0" />
<PackageReference Include="Wallaby" />
paket add Wallaby --version 1.1.0
#r "nuget: Wallaby, 1.1.0"
#:package Wallaby@1.1.0
#addin nuget:?package=Wallaby&version=1.1.0
#tool nuget:?package=Wallaby&version=1.1.0
Wallaby
Postgres Change Data Capture for .NET, driven by your EF Core model, Marten documents or plain tables.
Keep Meilisearch, Elasticsearch, OpenSearch, Kafka, pgvector or any HTTP/webhook endpoint in sync with Postgres, with no dual writes, no outbox table, no Debezium and no Kafka Connect. Contributions for additional sinks are welcome.
Wallaby streams row changes from Postgres logical replication, materializes them into your mapped EF Core entities, Marten documents or annotated POCOs, lets you transform/enrich them, and routes the resulting documents to pluggable destinations (sinks) with at-least-once delivery. It self-configures the publication and replication slot from your model, supports versioned backfill (initial snapshots and shape-change reindexes), and is cluster-safe via leader election.
Requires Postgres 15+ and .NET 10+.
📖 Full documentation: wallabycdc.net
Packages
| Project | Purpose |
|---|---|
Wallaby |
Core package (provider-agnostic). |
Wallaby.Providers.EntityFrameworkCore |
EF Core storage provider. |
Wallaby.Providers.Marten |
Marten storage provider. |
Wallaby.Providers.Tables |
Plain-table storage provider: annotated POCOs, no ORM. |
Wallaby.Sinks.Http |
HTTP/webhook destination sink. |
Wallaby.Sinks.Elasticsearch |
Elasticsearch destination sink. |
Wallaby.Sinks.Kafka |
Kafka destination sink (keyed messages, tombstone deletes). |
Wallaby.Sinks.Meilisearch |
Meilisearch destination sink. |
Wallaby.Sinks.OpenSearch |
OpenSearch destination sink. |
Wallaby.Sinks.Pgvector |
Postgres pgvector destination sink, with optional sink-side embedding. |
Wallaby.Client |
Standalone remote control plane (suspend/resume, backfills, inspection) via Postgres. |
Wallaby.Testing |
End-to-end pipeline test harness with real logical replication. |
Wallaby.AspNetCore.HealthChecks |
ASP.NET Core liveness health check for Wallaby nodes. |
Quick start
builder.Services.AddDbContextFactory<AppDbContext>(o => o.UseNpgsql(conn));
builder.Services.AddWallaby(cdc =>
{
cdc.UseEntityFrameworkCore<AppDbContext>()
.UseConnectionString(conn)
.ConfigureOptions(o => { o.SlotName = "app_cdc"; o.PublicationName = "app_cdc_pub"; })
.AddMeilisearchSink("meili", m => { m.Endpoint = "http://localhost:7700"; m.ApiKey = key; })
// Mapping = routing only. The transform does the data shaping.
.WithMappings(sink => sink
.Map<Product>()
.ToDestination("products")
.WithBackfillVersion("v1") // bump to force a reindex/backfill
.UsingTransform((db, changes, ct) =>
{
var docs = new Dictionary<DocumentKey, WallabyDocument?>();
foreach (var c in changes)
docs[c.Key] = new WallabyDocument { ["name"] = c.Entity!.Name };
return Task.FromResult<IReadOnlyDictionary<DocumentKey, WallabyDocument?>>(docs);
}));
});
Contributing
Tests
Each package has one test project under tests/ (Wallaby.Tests, Wallaby.Providers.*.Tests,
Wallaby.Sinks.*.Tests) with Unit/ and Integration/ folders inside; namespaces follow the folders.
All test projects use TUnit; shared fixtures (e.g. the Postgres container) live in
tests/Wallaby.TestInfrastructure.
- Everything:
dotnet testor.\build.ps1 Test - One package:
dotnet run -c Release --project tests/Wallaby.Providers.EntityFrameworkCore.Tests - Unit tests only (no Docker): append
-- --treenode-filter "/*/*.Unit*/*/*"
Viewing traces
tests/Wallaby.TraceDemo runs a curated CDC scenario, live
changes with a sink retry, dependent fan-out, whole-table backfill, and exports the resulting traces
and metrics to a local Aspire Dashboard
container:
dotnet run --project tests/Wallaby.TraceDemo
# then open http://localhost:18888/traces
The dashboard keeps running (and accumulates traces across runs); remove it with
docker rm -f wallaby-trace-dashboard.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- DistributedLock.Postgres (>= 1.3.1)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.11)
- Microsoft.Extensions.Hosting (>= 10.0.11)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.11)
- Npgsql (>= 10.0.3)
- Polly.Core (>= 8.7.0)
NuGet packages (11)
Showing the top 5 NuGet packages that depend on Wallaby:
| Package | Downloads |
|---|---|
|
Wallaby.AspNetCore.HealthChecks
ASP.NET Core liveness health check for Wallaby: flags a terminated or crash-looping CDC service on leader and standby nodes, and grades a suspended installation or failing fan-out and backfill as degraded. |
|
|
Wallaby.Providers.EntityFrameworkCore
Postgres change data capture driven by your EF Core model. Storage provider for Wallaby: table and key discovery from the EF model, entity materialization with value converters, DbContext-based transforms and enrichment, and DependsOn navigation fan-out. |
|
|
Wallaby.Sinks.Meilisearch
Keep a Meilisearch index in sync with Postgres from .NET. Change data capture sink for Wallaby: logical replication streams every insert, update and delete into your index as idempotent upserts, with versioned backfill and declarative index configuration. |
|
|
Wallaby.Testing
Test helpers for Wallaby consumers: capture sink, sink replacement, and streaming-readiness gates for end-to-end Wallaby tests against a real Postgres. |
|
|
Wallaby.Providers.Marten
Postgres change data capture for Marten documents. Storage provider for Wallaby: document table discovery, JSONB rehydration through the store's serializer, soft-delete-aware delete events, conjoined tenancy, and IQuerySession-based transforms. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.1.0 | 65 | 9/21/2026 |
| 1.0.0 | 107 | 9/18/2026 |
| 1.0.0-rc.8 | 200 | 9/16/2026 |
| 1.0.0-rc.7 | 1,877 | 8/19/2026 |
| 1.0.0-rc.6 | 547 | 8/18/2026 |
| 1.0.0-rc.5 | 456 | 8/12/2026 |
| 1.0.0-rc.4 | 1,148 | 8/2/2026 |
| 1.0.0-rc.3 | 104 | 7/31/2026 |
| 1.0.0-rc.2 | 248 | 7/27/2026 |
| 1.0.0-rc.1 | 143 | 7/23/2026 |
| 1.0.0-beta.7 | 98 | 7/19/2026 |
| 1.0.0-beta.6 | 341 | 7/15/2026 |
| 1.0.0-beta.5 | 185 | 7/14/2026 |
| 1.0.0-beta.4 | 119 | 7/12/2026 |
| 1.0.0-beta.3 | 117 | 7/10/2026 |
| 1.0.0-beta.2 | 208 | 7/8/2026 |
| 1.0.0-beta.1 | 150 | 7/8/2026 |
| 1.0.0-alpha.3 | 140 | 7/6/2026 |
| 1.0.0-alpha.2 | 95 | 7/6/2026 |
| 1.0.0-alpha.1 | 89 | 7/6/2026 |