Debezium alternative — Debezium vs Skippr
Debezium is Apache-2.0 log CDC. The usual shape is a Kafka Connect source: Postgres, MySQL, MariaDB, SQL Server, Oracle, Db2, MongoDB, Cassandra, Vitess, and peers. Snapshot, then the transaction log. Events go to Kafka topics. You add a sink. Debezium Server is the same connectors without Kafka; sinks are pluggable (Pub/Sub, Kinesis, Pulsar, HTTP, and others). Apache Iceberg is not in the Debezium tree. The documented Iceberg path is the community project debezium-server-iceberg (1.2.0.Final on 4 Oct 2026, Debezium 3.6.3.Final, Iceberg 1.11.0, Java 21). It writes Parquet (Avro or ORC optional), upsert off by default, deletes kept as __deleted=true unless you change that. Iceberg v3 deletion vectors landed in that 1.2 line. Kafka Connect plus the Iceberg project's sink is the other path; the Debezium transform there is still marked experimental. There is no licence fee. You pay JVMs, Kafka, disks, and people. Confluent Cloud's managed Postgres CDC (Debezium) lists about 0.104 to 0.2083 USD a task-hour plus 0.025 USD a GB. This is not a Streamhouse. There is no Iceberg ∪ WAL.
Skippr is an open Streamhouse you run as one Rust binary. Write skippr.yml (or the same thing in Python), discover, sync. You query live state over Iceberg ∪ WAL, and the history is ordinary Iceberg in your bucket. No Connect cluster. ELT into a warehouse is one path, not the product.
| Feature | Skippr | Debezium |
|---|---|---|
| Deploy | Single Rust binary, your VPC or on-prem | Kafka Connect worker, or Debezium Server |
| Schema | In-stream evolution, sibling columns | Topic schema plus SMT. Iceberg evolution is the sink's job |
| Storage | Open Iceberg on Parquet you own | Kafka log, then the sink. Iceberg is community Server or Connect |
| CDC | Log-based; fails closed if the dest cannot honour | Log CDC. Exactly-once is a Connect/sink property, not the engine |
| Query | skipprd query on Iceberg ∪ WAL; history in any Iceberg engine | After the sink. Kafka is the bus, not the lake |
| Pricing | Free self-hosted engine | Apache-2.0. Pay Kafka and JVMs. Confluent Cloud is task-hours plus GB. |
What Debezium is good at
A WAL you already want on a Kafka topic, with many consumers, including a lake sink as one of them. That is the product. The connector list (Oracle, Db2, Vitess) is why platforms still embed it. Server is the honest cut when you do not want to run Kafka. If the job is "this log onto this bus," that is a real product.
Where the job is wider
Debezium is a CDC capture. It is not a Streamhouse. There is no Iceberg ∪ WAL. There is no skipprd query on in-flight rows. Iceberg is a sink you assemble. Compaction, catalog, and fail-closed apply are yours.
The cluster is the ops. Replication slots, Connect rebalances, offset topics, and a community Iceberg jar that tracks Debezium versions on a delay. Skippr will not capture Oracle or Db2 the way Debezium does. Skippr also will not replace a Connect estate that already fans one topic to many consumers.
If the job is "Debezium we already staff," Debezium is the narrower tool. If the job is live SQL on Iceberg you run, Debezium was never that.
Getting started
Install skipprd from the install guide, or pip install skippr. The three tabs write the same skippr.yml. Then discover, sync, and query.
skippr:
workspace: analytics
skipprd_el_storage_mode: local
pipelines:
orders:
data_source: data_sources.app_db
data_sink: data_sinks.lake
data_sources:
app_db:
Postgres:
host: db.internal
user: skippr_reader
password: ${APP_DB_PASSWORD}
database: app
tables: [orders, customers]
cdc_mode: snapshot_then_cdc
data_sinks:
lake:
AthenaIceberg:
warehouse: s3://my-iceberg-warehouse/
glue_database_name: analytics
athena_workgroup_name: primary
athena_results_s3_bucket: my-athena-results
region: us-east-1
schema_sink: schema_sinks.lake_schema
schema_sinks:
lake_schema:
AthenaIceberg:
warehouse: s3://my-iceberg-warehouse/
glue_database_name: analytics
athena_workgroup_name: primary
athena_results_s3_bucket: my-athena-results
region: us-east-1skipprd --workspace analytics --storage-mode local connect data-source postgres \
--pipeline orders \
--name app_db \
--host db.internal \
--user skippr_reader \
--password '${APP_DB_PASSWORD}' \
--database app \
--tables orders \
--tables customers \
--cdc-mode snapshot_then_cdc
skipprd connect data-sink athenaiceberg \
--pipeline orders \
--name lake \
--warehouse s3://my-iceberg-warehouse/ \
--glue-database-name analytics \
--athena-workgroup-name primary \
--athena-results-s3-bucket my-athena-results \
--region us-east-1
skipprd connect schema-sink athenaiceberg \
--pipeline orders \
--name lake_schemafrom skippr import (
Config,
DataSinkAthenaIceberg,
DataSourcePostgres,
DataSourcePostgresSourceCdcMode,
EnvRef,
LocalStorage,
Pipeline,
)
cfg = Config().workspace("analytics").storage(LocalStorage())
app_db = cfg.data_source(
"app_db",
DataSourcePostgres(
host="db.internal",
user="skippr_reader",
password=EnvRef("APP_DB_PASSWORD"),
database="app",
tables=["orders", "customers"],
cdc_mode=DataSourcePostgresSourceCdcMode.SNAPSHOTTHENCDC,
),
)
lake = cfg.data_sink(
"lake",
DataSinkAthenaIceberg(
warehouse="s3://my-iceberg-warehouse/",
glue_database_name="analytics",
athena_workgroup_name="primary",
athena_results_s3_bucket="my-athena-results",
region="us-east-1",
),
schema_sink="lake_schema",
)
cfg.pipeline("orders", Pipeline(data_source=app_db, data_sink=lake))
cfg.save("skippr.yml")export APP_DB_PASSWORD='your-postgres-password'
skipprd discover --pipeline orders
skipprd sync --pipeline orders --once
skipprd query "SELECT count(*) FROM analytics.orders"Which to choose
Choose Debezium if you want log CDC onto Kafka or a Server sink, and the bus after capture is enough.
Choose Skippr if you want one binary, live SQL, and Iceberg files that stay yours. Skippr will not run a Debezium connector.
Install from Install. Connector and query reference live in Developer Docs. For optional onboarding in your VPC, Enterprise Jumpstart or Contact.
