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

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
See how Filament compares
filament benchmarks
Migrate to
Migrate to
Company
Talk to the team
Copyright © 2026 Galaxy. All rights reserved.