Database Change Detection Without Triggers

Detect which rows changed in O(1) per row. No CDC pipelines, no database triggers, no replication slots. Just XOR fingerprinting.

CDC pipelines (Debezium)

Complex setup, WAL parsing, schema registry, connector maintenance

ATOMiK: One Python import. No infrastructure.

Database triggers

Schema changes, performance overhead on every write, vendor lock-in

ATOMiK: Application-level detection. Zero database changes.

updated_at columns

Requires schema modification, clock skew, doesn't detect which columns changed

ATOMiK: Content-based detection. Catches any change, even backdoor SQL.

Full-table comparison

O(n * row_size) — comparing 1M rows at 1KB each = 1 GB of comparison data

ATOMiK: O(n * 8 bytes) — 64-bit fingerprint per row. 125x less memory.

Try it yourself — zero dependencies

pip install atomik-core
python -m atomik_core.examples.sqlite_change_tracker

Creates a 1000-row SQLite database, modifies 50 rows, and detects every change using XOR fingerprinting. No external dependencies — SQLite is built into Python.

How it works

from atomik_core import Fingerprint, AtomikTable
import sqlite3

# 1. Connect to your database
db = sqlite3.connect("myapp.db")
tracker = AtomikTable(num_contexts=65536)

# 2. Fingerprint each row (initial snapshot)
for row in db.execute("SELECT id, name, email, balance FROM users"):
    fp = xor_reduce(serialize(row))  # 8-byte fingerprint
    tracker.load(addr=row[0], initial_state=fp)

# 3. On next sync cycle — detect changes in O(1) per row
changed_ids = []
for row in db.execute("SELECT id, name, email, balance FROM users"):
    fp = xor_reduce(serialize(row))
    if tracker.read(addr=row[0]) != fp:
        changed_ids.append(row[0])
        tracker.load(addr=row[0], initial_state=fp)

print(f"{len(changed_ids)} rows changed")
# Only sync/replicate the changed rows

Comparison

PropertyATOMiKCDC (Debezium)Triggersupdated_at
Detection costO(1) per rowO(1) per writeO(1) per writeO(1) per row
Schema changesNoneConnector configDDL requiredDDL required
Infrastructurepip installKafka + ConnectDB-specificNone
Catches backdoor SQLYesYes (WAL)NoNo
Works across DBsYesPer-connectorPer-DB syntaxYes
Column-level detectionVia field fingerprintFull row diffCustom logicNo
DependenciesZeroKafka, ZooKeeper, ConnectDB extensionsNone
O(1)
Per-row detection
8 bytes
Per fingerprint
Zero
Dependencies
125x
Less memory

Stop building CDC pipelines

Detect database changes with one pip install. Zero infrastructure.