DataMirror
DocsTutorialPricing
Live streaming enabled

Keep search
in sync.

Change data capture streams every insert, update and delete from PostgreSQL or MySQL into Meilisearch, Elasticsearch or OpenSearch — no polling, no batch windows, no cloud middleman. Self-hosted, with monitoring built in.

One-time licence · no subscription · self-hosted

P99 latency
~50msP99 latency
End-to-end lag
<1sEnd-to-end lag
Data loss
0Data loss
Philosophy

Mirror once,
stay synced forever.

Our Change Data Capture protocol ensures your destination is always a perfect, real-time reflection of your primary database.

Universal Connectivity

Connects everything.

One engine. Any source. Any destination. Mix and match databases and search backends — DataMirror bridges them all in real time.

PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
PostgreSQL
Primary DB
PostgreSQL
Primary DB
MySQL
Operational DB
PostgreSQL
Primary DB
MySQL
E-commerce DB
DataMirror
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
Meilisearch
Search index
Elasticsearch
Search engine
PostgreSQL
Analytics DB
PostgreSQL
Read replica
Meilisearch
Product search
PostgreSQLMeilisearchsyncing in real time
PostgreSQLMySQLMeilisearchElasticsearchMongoDB+ more coming
How it works

Three stages, one strict path from row to result.

01 Capture
02 Transform
03 Deliver
Stage 01

Read the log, not the table

Data Mirror tails the PostgreSQL WAL and the MySQL binlog directly. Every insert, update and delete is picked up as it commits, so there is no polling loop, no modified_at column to maintain, and no load on your primary.

  • Logical replication slots
  • Binlog row events
  • Resumes from the last LSN
Stage 02

Shape it on the way through

Flatten relations, rename and compute fields, and drop what the index does not need. Transforms are plain Python, so joins and enrichment stay readable instead of hiding inside a query language.

  • Relational flattening
  • Computed fields
  • Python plugins
Stage 03

Land it exactly once

Batched writes reach Meilisearch, Elasticsearch or OpenSearch with retries and a dead-letter queue behind them. A failed document is retried and recorded, never silently dropped.

  • Automatic retries
  • Dead-letter queue
  • Zero data loss
Capabilities

Everything the pipeline needs, nothing it does not.

Sources

Postgres and MySQL, straight from the log

Point Data Mirror at a replication slot or binlog and it starts streaming. No triggers on your tables, no scheduled scans, no schema changes to your application database.

2 enginesPostgreSQL 12+ / MySQL 8+
Quick start

5-minute setup

Deploy the engine with one simple schema mapping. We handle the complex relationships and full-table initial scans.

schema.yaml
schemas:
- database: "store_db"
index: "products_index"
enabled: true
table: "products"
columns:
- id
- product_name
- price
transform:
rename:
product_name: "name"
Source
Dest
Snapshot progressIdle
Observability

Total visibility

Don't guess if your data is syncing. Know exactly what happens in every microsecond.

Zero-code monitoring

Out of the box, our built-in web dashboard provides real-time throughput metrics. No Prometheus setup required. Watch per-event latency stay around 50ms, even while processing millions of rows.

  • Real-time TPS (transactions per second)
  • Precise P99 latency calculations
  • Dead-letter queue tracking
Total events
2.4M
P99 latency
50ms
Throughput
Live telemetry
[00:12:44]INFOReal-time pipeline started.
[00:12:44]SYNCBatch upsert complete: 500 rows.
[00:12:44]SYNCManual snapshot complete: meta.
[00:12:45]SYNCComputed transform: product_id → id.
[00:12:45]INFODestination healthy. Monitoring...
[00:12:46]SYNCCheckpoint saved at LSN: 0/16B3C8C
[00:12:46]INFOWorker node 04 heartbeat received.
[00:12:47]SYNCProcessing 1,204 change events.
[00:12:47]INFOLatency stabilized at 42ms.
[00:12:48]SYNCRelational join resolved: orders → users.
[00:12:49]INFOQuery cache invalidated.
[00:12:50]SYNCPushed 4,112 rows to search index.
[00:12:51]WARNType mismatch in field "price", auto-casting.
[00:12:52]SYNCTransaction committed (txid: 81920).
[00:12:52]INFOPipeline health check passed.
[00:12:44]INFOReal-time pipeline started.
[00:12:44]SYNCBatch upsert complete: 500 rows.
[00:12:44]SYNCManual snapshot complete: meta.
[00:12:45]SYNCComputed transform: product_id → id.
[00:12:45]INFODestination healthy. Monitoring...
[00:12:46]SYNCCheckpoint saved at LSN: 0/16B3C8C
[00:12:46]INFOWorker node 04 heartbeat received.
[00:12:47]SYNCProcessing 1,204 change events.
[00:12:47]INFOLatency stabilized at 42ms.
[00:12:48]SYNCRelational join resolved: orders → users.
[00:12:49]INFOQuery cache invalidated.
[00:12:50]SYNCPushed 4,112 rows to search index.
[00:12:51]WARNType mismatch in field "price", auto-casting.
[00:12:52]SYNCTransaction committed (txid: 81920).
[00:12:52]INFOPipeline health check passed.
[00:12:44]INFOReal-time pipeline started.
[00:12:44]SYNCBatch upsert complete: 500 rows.
[00:12:44]SYNCManual snapshot complete: meta.
[00:12:45]SYNCComputed transform: product_id → id.
[00:12:45]INFODestination healthy. Monitoring...
[00:12:46]SYNCCheckpoint saved at LSN: 0/16B3C8C
[00:12:46]INFOWorker node 04 heartbeat received.
[00:12:47]SYNCProcessing 1,204 change events.
[00:12:47]INFOLatency stabilized at 42ms.
[00:12:48]SYNCRelational join resolved: orders → users.
[00:12:49]INFOQuery cache invalidated.
[00:12:50]SYNCPushed 4,112 rows to search index.
[00:12:51]WARNType mismatch in field "price", auto-casting.
[00:12:52]SYNCTransaction committed (txid: 81920).
[00:12:52]INFOPipeline health check passed.

Pipeline telemetry

Dive into the raw stream. If a query hits a snag, the detailed index logs provide exact granular data on row mutations, cast warnings, and destination rejections.

Why not the alternatives?

Real-time search sync, without the baggage

PGSync, Debezium + Kafka, managed pipelines — they all work. Data Mirror gives you the real-time CDC to Meilisearch, Elasticsearch or OpenSearch in a single container, with monitoring built in. Here is how we compare.

vs PGSync
The closest open-source alternative — minus the Kafka, plus monitoring
Compare
vs Debezium + Kafka Connect
Full CDC power without running Kafka
Compare
vs Estuary Flow
Self-hosted simplicity vs a managed pipeline service
Compare
vs Logstash + JDBC Input
Real-time CDC vs periodic polling
Compare
Your Secure VPC
DataMirror Node
Internal IP: 10.0.0.5
NO DATA LEAVES YOUR PERIMETER
Deployment

Full control.
Zero exposure.

Keep your sensitive data where it belongs-within your own secure perimeter. DataMirror is built to be self-hosted, ensuring no information ever touches the public internet.

Private VPC Deployment

Connect sources and destinations over internal IPs. DataMirror runs as a local conduit, not a cloud proxy.

No Cloud Middle-Man

Unlike other sync tools, we never see, store, or touch your data. It stays within your controlled environment.

Docker & Kubernetes Ready

Deploy in minutes on your own infrastructure using standard container orchestration workflows.

See it running

The monitoring dashboard ships with every licence — no separate observability stack to stand up. Click any shot to open the gallery.

Dashboard

Events processed, error rate, replication lag and uptime at a glance, with the live source-to-sink topology.

Reporting

Throughput by operation type, plus P50 and P99 for both processing and end-to-end latency.

Event samples

Every insert, update and delete with its source table, primary key, latency and commit status.

Troubleshoot

Dead-letter queue with broker and in-memory retry, and snapshot recovery that resumes interrupted scans.

Screens captured from a local test node syncing PostgreSQL to Meilisearch over WAL-based CDC.

What you actually get

One download, from whichever checkout you use. Everything below is included in the $49 licence.

The engine

The Data Mirror Python app as a ready-to-run Docker image, v0.8.1, with a lightweight broker built in — Kafka optional, never required.

Schema config

A single declarative YAML that maps tables to indexes, with transforms and relationship resolution.

Monitoring dashboard

The full operations UI — throughput, P99 latency, engine topology, dead-letter queue and consistency checks.

Docs and setup guide

Install guide, full configuration and API reference, a transformation guide for custom Python scripts, and a beginner walkthrough from empty database to live index.

Licence and updates

Emailed by Gumroad, or downloaded from your Envato account, the moment payment clears. Future updates are included.

Support

Six months of item support included, extendable to twelve at checkout. Hands-on setup help is available separately — just ask.

Technical specifications

Check these against your stack before you buy — everything Data Mirror needs, and everything it talks to.

Source databases

  • PostgreSQL 12 or newer
  • MySQL 8.0 or newer

Destinations

  • Meilisearch
  • Elasticsearch
  • OpenSearch
  • Replica databases
  • Custom backends via plugins

Runtime requirements

  • Docker and Docker Compose
  • Python 3.9 or newer
  • Built-in broker, or bring your own Kafka + Debezium
  • Runs on your own hardware or VPC

Sync capabilities

  • CDC from the write-ahead log or binlog
  • Bulk migration of millions of existing rows
  • Relationship flattening into denormalised records
  • Custom Python transform scripts
  • Plugin architecture for building sink extensions
  • Dead-letter queue with retry and snapshot recovery

Against the alternatives

The two things people weigh Data Mirror against: a hosted sync service, or building it yourself on Debezium and Kafka.

Data MirrorHosted sync serviceDIY Debezium + Kafka
Cost at production scaleOne-time, $49Recurring, usage-basedFree software, your engineering time
Your rows leave your network
Requires an external broker to run
Monitoring dashboard included
Runs inside a private VPCSometimes, on higher tiers
Time to first synced indexMinutesMinutesDays to weeks
Price grows with row count

Hosted services vary by vendor and tier — check current terms before comparing. DIY costs nothing to licence; the expense is the engineering time to build and operate it.

Pricing

One-time licence. Own it forever.

$49 once, self-hosted, with monitoring built in. No subscriptions, no per-row fees — and the answers to every pricing, licence, support and refund question live on the pricing page.

Self-hosted - your infrastructure

Your data wants to move. Let it.

Docker
# Start the engine
$ docker run -d \
    -p 8090:8090 \
    -v $(pwd)/schema.yaml:/schema.yaml \
    data-mirror