The aestus cdc logo: a wave of change flowing into ordered streams
Databases · Graphs · Search & Vectors · APIs & Event Brokers

Change data capture that moves like the tide

Aestus captures every change in your databases and delivers it in real time, strictly ordered, to any target: relational tables, lakehouses, graphs, vector stores, APIs, and event brokers. Zero data loss, self-healing retries, and your data never leaves your network.

See How It Works
Guaranteed Per-Entity Order Nothing Lost, Nothing Stale Runs in Your Network Universal Connectors (DBs, APIs & Brokers)
aestus tui · flow warehouse
updates: live

How It Works

A change passes through a few small agents, connected by a durable message broker. Each agent does one job for one kind of system; together they form a flow.

A change flows from the MongoDB source through the capture agent, RabbitMQ, an optional transform agent and RabbitMQ again to the integrate agent and the target. A failed record is recaptured from the source. The controller starts the agents, sets up the broker and collects telemetry; operators use the terminal UI on its REST API.
01

Capture

The capture agent follows the source's own change log or change feed. It copies existing records first, opening the stream before it starts so no change slips through, and labels every change with its key, group and source version.

02

Buffer in Order

RabbitMQ quorum queues hold every change until the next agent confirms it. Related records, such as an item and its stock, share a partition and stay in order; unrelated ones move in parallel.

03

Transform

Optionally reshape the data on the way, with a predefined transform (documents to tables, tables to documents or graphs, text to embeddings) or a fully custom one written in Go, Python or C#. Flows without a transform store the records as they are.

04

Integrate

The integrate agent writes each change idempotently (safe to repeat), and never lets an older change overwrite a newer one. If a write fails, it asks for the record again and keeps going.

What Every Flow Gets

The same guarantees for every source and every target.

Initial Load, Then Live

A new flow copies every existing record, then streams changes. The stream opens before the copy starts, so changes made during the load are never lost, and an interrupted load resumes where it stopped.

Reshape Between Models

Map documents to parent and child tables, rows to documents or graph nodes, and text to embeddings. Tables and indexes are created and widened automatically when the mapping grows.

Order Where It Matters

Group related collections by a key, such as an item and its stock records. Changes for the same group are applied in order, while different groups are processed in parallel.

Nothing Lost, Nothing Stale

Checkpoints only move once the broker has stored a change. Every target row remembers the version of its last change, so late or repeated messages are ignored, and deleted rows cannot come back.

Failures That Heal Themselves

A failed write triggers a recapture: the current record is read again from the source and sent through the flow. Failed transformations retry with exponential backoff. What still fails waits in a dead-letter queue for one decision: retry, recapture or discard.

Predefined or Fully Custom

Use a predefined transform, such as the relational mapping, with configuration only. Need something else, such as masking personal data? Write the transform yourself: natively in Go, or in Python or C# through the C bindings. Reading, writing, retries and statistics are handled for you.

One Screen to Run It

Define flows, start, stop and pause agents, watch throughput, lag and events live, and handle dead letters from the terminal UI. Everything it does is also available through a documented REST API.

Scale Out When Needed

Run several replicas of a transform or integrate agent: partitions spread across them and move to the others when one stops. A busy collection can be read by several capture readers at once.

Full Documents or Changes Only

Send complete documents, or only the fields that changed. When a change cannot be applied on its own, for example inside an array, Aestus fetches the full record instead of guessing.

Sources & Targets

Every system gets its own small agent: one to capture its changes, one to write to it. Combine any source with any target, from databases to application APIs and event brokers.

System As a source As a target
Relational Databases
PostgreSQLLogical decoding of the WALTables, JSONB, pgvector
MySQL and MariaDBBinlog row eventsTables, JSON
SQL Server and Azure SQLCDC or Change TrackingTables, vector columns
Oracle DatabaseLogMiner on the redo logsTables, vector columns
SQLiteChange-log triggersTables or documents
DatabricksDelta Change Data FeedDelta tables, VARIANT
SnowflakeChange trackingTables, VARIANT
Document Databases
MongoDB and AtlasChange streamsDocuments, embedded children, deltas
Cosmos DB and DocumentDBChange streams and change feedDocuments
Amazon DynamoDBDynamoDB StreamsItems, embedded children
Google FirestoreListeners and exportsDocuments
Apache CassandraCDC commit logTables, ordered by write time
Graph Databases
Neo4j and AuraDBChange data captureNodes and relationships
Amazon NeptuneNeptune StreamsNodes and relationships
Graphs in PostgreSQL, MongoDB, SQL Server and OracleThrough the host databaseVertex and edge tables, references
Vector & Search Databases
Elasticsearch and OpenSearchScan, for migrationsSearch documents with vectors
Pinecone, Qdrant, Weaviate, MilvusScan, for migrationsVectors with metadata
Vector columns in your databaseThrough the host databasepgvector, Atlas Vector Search, Oracle, SQL Server, Cassandra
Databricks Vector Search, Snowflake Cortex SearchThrough the platformFresh source tables the platform indexes
APIs & Event Brokers
Apache Kafka, Confluent, MSK, RedpandaConsumer groups with committed offsetsKeyed events, compacted topics
RabbitMQQueues and streamsExchanges with routing keys
Azure Service BusQueues and topics, with sessionsMessages ordered by session
Azure Event HubsPartitions with checkpointsEvents by partition key
AWS SQS, SNS, Kinesis, EventBridgeFIFO queues and shardsMessage groups and events
Google Pub/SubSubscriptions with ordering keysMessages with ordering keys
NATS and MQTTJetStream and topic subscriptionsSubjects and topics
REST APIs and webhooksPolling, or webhooks receivedCalls with idempotency keys
gRPC servicesServer streamsCalls to your methods

Runs Where Your Data Lives

The broker, the controller and every agent run as containers inside your own network. Changes go straight from your source to your target.

Containers on Podman

One small image per agent. Lightweight rootless containers via Podman today, with Kubernetes Helm charts and Docker environments supported for enterprise rollouts. The controller starts and supervises the agents.

Credentials Stay Secret

Passwords and connection strings live in Podman secrets and reach agents as environment variables. Configuration files never contain them.

Delivered with Consulting

Aestus is an enterprise product, delivered together with consulting: we work with your team to design flows and mappings, run them in your network, and keep them healthy.

Frequently Asked Questions

Which systems does Aestus connect?

Relational databases, the lakehouse, document and NoSQL stores, graph databases, search engines, vector stores, application APIs (REST, webhooks, gRPC) and event brokers (Kafka, RabbitMQ, Azure Service Bus, Event Hubs and more): see Sources & Targets. Every flow gets an initial load, ordered delivery per group, recapture of failed records and dead-letter handling.

How does it keep related records in order?

You group related collections by a key, such as an item and its stock records by item id. All changes for one group key travel through the same partition queue and are applied in order; other groups move in parallel.

What happens when a write fails?

The integrate agent does not stop. It asks the capture agent to read the record again from the source and sends the current version through the flow. If that keeps failing, the record waits in a dead-letter queue until an operator chooses to retry, recapture or discard it.

Can I add my own transformation?

Yes. Transforms are predefined or fully custom. Predefined transforms, such as the relational mapping, need configuration only. A custom transform is one function you write, natively in Go or in Python or C# through the C bindings; the transform template wraps it with everything an agent needs.

Does my data leave my network?

No. The broker, controller and agents run in your network, and changes travel only between your source, the broker and your target.

How is Aestus different from Kafka Connect / Debezium or batch ETL?

Unlike Debezium and Kafka Connect, Aestus requires no heavy JVM footprint, ZooKeeper, or mandatory Kafka cluster to sync databases, and provides built-in cross-model transforms (documents to relational tables, text to embeddings). Unlike batch ETL tools, Aestus streams continuously in sub-seconds within your own private network—with zero SaaS data egress.

How do we get started?

Aestus is an enterprise product, delivered with consulting from Helium Consulting Services and Providentia World Wide. We are currently onboarding a selective cohort of enterprise teams; write to info@aestus-cdc.com to discuss your architecture and use case.

Why "Aestus"

Aestus is Latin for the tide: the swell of the sea that rises and falls on its own rhythm and never stops. The Romans also used it for heat and for surging motion, the restless movement of water pulled by forces far away.

That is what this software does with data. A change made in one database does not sit still: it is lifted by the capture agent, carried by the current through the broker, and set down on another shore, in the target, exactly where it belongs. Like the tide, Aestus is patient and relentless. It keeps moving while systems sleep, it returns to pick up anything it left behind (a recapture is just the tide coming back in), and it never lets the water flow backwards: an older wave never washes away a newer one.

You do not command the tide; you set it up and let it run. Configure a flow, start it, and the data keeps arriving, change after change, the way the sea keeps arriving at the coast.