Filament vs. dlt

Side-by-side capabilities and benchmarks.

Introduction

dlt is a Python library for writing data pipelines in code. It is popular with teams that want their pipelines to live inside a Python codebase. As a library, it leaves the orchestrator, the scheduler, and the runtime to you. Filament is an open-source replication engine that ships as a running service with a scheduler, a UI, and an API, and also embeds as a Go library.

HIGHLIGHTS

4.2× FASTER

ROWS PER SECOND

Filament

2,288,144 ROWS

dlt

551,606 ROWS

TPC-H, Postgres -> Postgres

4.2× FASTER

ROWS PER SECOND

Filament

2,288,144 ROWS

dlt

551,606 ROWS

TPC-H, Postgres -> Postgres

2.6× FASTER

WALL TIME

Filament

114.8 SEC

dlt

296.0 SEC

NYC Taxi, Postgres -> Postgres

2.6× FASTER

WALL TIME

Filament

114.8 SEC

dlt

296.0 SEC

NYC Taxi, Postgres -> Postgres

1.9× LESS

CPU SECONDS

Filament

377.4 SEC

dlt

728.2 SEC

NYC Taxi, Postgres -> Postgres

1.9× LESS

CPU SECONDS

Filament

377.4 SEC

dlt

728.2 SEC

NYC Taxi, Postgres -> Postgres

15.3× LESS

PEAK MEMORY

Filament

2.97 GIB

dlt

45.54 GIB

NYC Taxi, Postgres -> Postgres

15.3× LESS

PEAK MEMORY

Filament

2.97 GIB

dlt

45.54 GIB

NYC Taxi, Postgres -> Postgres

Galaxy product illustration

License and control

License

Apache 2.0, open source.

Apache 2.0 for the library. dltHub features (CDC, Iceberg, transformations, AI harness) are source-available under a commercial EULA.

License

Apache 2.0, open source.

Apache 2.0 for the library. dltHub features (CDC, Iceberg, transformations, AI harness) are source-available under a commercial EULA.

Self-hosted in full

Yes. One repository, no paid tier, nothing gated.

The library runs anywhere Python runs. Managed runtime, scheduling, web UI, data quality checks, and premium sources are dltHub only.

Self-hosted in full

Yes. One repository, no paid tier, nothing gated.

The library runs anywhere Python runs. Managed runtime, scheduling, web UI, data quality checks, and premium sources are dltHub only.

Adding a new source

A YAML manifest for REST APIs, loaded at runtime with no rebuild. A Go driver for databases and other driver-based sources.

Python. A @dlt.resource function, or a rest_api dictionary for REST endpoints.

Adding a new source

A YAML manifest for REST APIs, loaded at runtime with no rebuild. A Go driver for databases and other driver-based sources.

Python. A @dlt.resource function, or a rest_api dictionary for REST endpoints.

Connector maintenance

Every connector lives in the engine repository with a published maturity level (alpha, beta, stable).

3 generic core sources (REST, SQL, filesystem) and 29 verified sources in a separate repository maintained by the team and community.

Connector maintenance

Every connector lives in the engine repository with a published maturity level (alpha, beta, stable).

3 generic core sources (REST, SQL, filesystem) and 29 verified sources in a separate repository maintained by the team and community.

Services to operate

Server and control plane, with Postgres and NATS. Each run is its own Kubernetes Job. One binary for evaluation.

None for the library. You bring the orchestrator (Airflow, Dagster, GitHub Actions, cron) and it keeps state in a _dlt_pipeline_state table.

Services to operate

Server and control plane, with Postgres and NATS. Each run is its own Kubernetes Job. One binary for evaluation.

None for the library. You bring the orchestrator (Airflow, Dagster, GitHub Actions, cron) and it keeps state in a _dlt_pipeline_state table.

Runtime

Static Go binaries on distroless images. One runner code path wherever a run executes.

Python 3.10 to 3.14. Extract, normalize, and load stages buffer to local disk. Normalize is CPU-bound and single-process by default.

Runtime

Static Go binaries on distroless images. One runner code path wherever a run executes.

Python 3.10 to 3.14. Extract, normalize, and load stages buffer to local disk. Normalize is CPU-bound and single-process by default.

Scheduling

Built-in cron per pipeline. Safe to run multiple control planes.

None in the library. External orchestrator or the paid dltHub runtime.

Scheduling

Built-in cron per pipeline. Safe to run multiple control planes.

None in the library. External orchestrator or the paid dltHub runtime.

SaaS source execution

Manifests interpreted inside the engine, in the same process as the run. No per-connector containers.

Declarative rest_api source run in-process by Python.

SaaS source execution

Manifests interpreted inside the engine, in the same process as the run. No per-connector containers.

Declarative rest_api source run in-process by Python.

Embeddable

Yes. Go library (app.Run) with swappable event bus, state store, and secrets.

Yes. It is a library.

Embeddable

Yes. Go library (app.Run) with swappable event bus, state store, and secrets.

Yes. It is a library.

Interfaces

Web UI, ConnectRPC API, CLI.

Python API, CLI, a local marimo dashboard. No REST API documented. Hosted web UI is dltHub.

Interfaces

Web UI, ConnectRPC API, CLI.

Python API, CLI, a local marimo dashboard. No REST API documented. Hosted web UI is dltHub.

Correctness

Resume after failure

Mid-table, from per-shard checkpoints, for upsert, incremental, and CDC runs. A failed run lands in a partial state and continues on re-request.

Pending load packages finish on the next run. Extraction of a single table restarts. Default replace truncates then inserts outside one transaction, so a failed load can leave tables empty.

Resume after failure

Mid-table, from per-shard checkpoints, for upsert, incremental, and CDC runs. A failed run lands in a partial state and continues on re-request.

Pending load packages finish on the next run. Extraction of a single table restarts. Default replace truncates then inserts outside one transaction, so a failed load can leave tables empty.

Per-batch integrity check

CRC32-C computed independently on the read side and the write side of every batch. A mismatch fails the run.

None. Load package status tracking in _dlt_loads. Data quality checks are dltHub only.

Per-batch integrity check

CRC32-C computed independently on the read side and the write side of every batch. A mismatch fails the run.

None. Load package status tracking in _dlt_loads. Data quality checks are dltHub only.

Change data capture

Native. Postgres logical replication (pgoutput) with a consistent snapshot bootstrap. MySQL binlog with GTID cursors.

Postgres only, through the pg_replication verified source. MSSQL change tracking is paid. No MySQL binlog.

Change data capture

Native. Postgres logical replication (pgoutput) with a consistent snapshot bootstrap. MySQL binlog with GTID cursors.

Postgres only, through the pg_replication verified source. MSSQL change tracking is paid. No MySQL binlog.

Schema drift

New columns added to the destination automatically. Add-only, nothing dropped, nothing rewritten.

Auto-evolve by default. Type conflicts create variant columns such as amount__v_text. Schema contracts can freeze or discard.

Schema drift

New columns added to the destination automatically. Add-only, nothing dropped, nothing rewritten.

Auto-evolve by default. Type conflicts create variant columns such as amount__v_text. Schema contracts can freeze or discard.

Parallel reads within a table

Yes. Large tables split into up to 64 shards (keyset, bitmap, or ctid) read concurrently.

No. chunk_size batches one sequential read. Parallelism is across tables, or manual range backfills you write yourself.

Parallel reads within a table

Yes. Large tables split into up to 64 shards (keyset, bitmap, or ctid) read concurrently.

No. chunk_size batches one sequential read. Parallelism is across tables, or manual range backfills you write yourself.

Row lineage

Every replicated row carries the run id and start time. CDC rows also carry operation, source position, and sequence.

_dlt_load_id and _dlt_id per row.

Row lineage

Every replicated row carries the run id and start time. CDC rows also carry operation, source position, and sequence.

_dlt_load_id and _dlt_id per row.

Cost

What drives billing

Nothing. Compute you already run.

Nothing for the library. dltHub is $1,190 per month with 500 runtime credits, one credit per hour of runtime, overage $0.80 to $1.00 per credit.

What drives billing

Nothing. Compute you already run.

Nothing for the library. dltHub is $1,190 per month with 500 runtime credits, one credit per hour of runtime, overage $0.80 to $1.00 per credit.

Paid tiers

None.

dltHub. Managed runtime, scheduling, web UI, CDC for MSSQL, Iceberg, transformations, data quality checks.

Paid tiers

None.

dltHub. Managed runtime, scheduling, web UI, CDC for MSSQL, Iceberg, transformations, data quality checks.

Comparison

Benchmarks

Benchmarks

benchmark

Wall time, seconds for a full load

Wall time, seconds for a full load

Wall time, seconds for a full load

Filament

dlt

NYC Taxi, PG → PG (298.3M rows)

114.8 s

296.0 s

TPC-H, PG → PG (8.7M rows)

3.79 s

15.70 s

Rows per second

Rows per second

Rows per second

Filament

Filament

dlt

dlt

Better

NYC Taxi, PG → PG

NYC Taxi, PG → PG

2,597,498

2,597,498

2,597,498

1,007,711

1,007,711

1,007,711

Filament 2.58×

TPC-H, PG → PG

TPC-H, PG → PG

2,288,144

2,288,144

2,288,144

551,606

551,606

551,606

Filament 4.15×

CPU seconds, summed across the mover's containers

CPU seconds, summed across the mover's containers

CPU seconds, summed across the mover's containers

Filament

Filament

dlt

dlt

Better

NYC Taxi, PG → PG

377.4

377.4

377.4

728.2

728.2

728.2

Filament 1.93×

TPC-H, PG → PG

17.9

17.9

17.9

48.5

48.5

48.5

Filament 2.71×

Peak memory, largest container

Peak memory, largest container

Peak memory, largest container

Filament

dlt

NYC Taxi, PG → PG

2.97 GiB

45.54 GiB

TPC-H, PG → PG

1.83 GiB

6.47 GiB

Last updated on August 31, 2026

Full Filament vs. dlt benchmark report

Full Filament vs. dlt benchmark report

Full Filament vs. dlt benchmark report

Migrate to

Migrate to

Copyright © 2026 Galaxy. All rights reserved.