/

ingestr

Filament vs. ingestr

Side-by-side capabilities and benchmarks.

Introduction

ingestr is a command line tool for copying data from one system to another in a single command. It is simple to pick up and useful for one-off moves. Orchestration, scheduling, and monitoring are left to whatever you run around it. Filament is an open-source replication engine with a CLI for one-off transfers and a service for everything else, with scheduling, checkpoints, and verified writes built in.

HIGHLIGHTS

5.3× faster

ROWS PER SECOND

Filament

2,597,498 ROWS

ingestr

488,233 ROWS

NYC Taxi, Postgres -> Postgres

5.3× faster

ROWS PER SECOND

Filament

2,597,498 ROWS

ingestr

488,233 ROWS

NYC Taxi, Postgres -> Postgres

4.6X FASTER

WALL TIME

Filament

3.79 SEC

ingestr

17.49 SEC

TPC-H, Postgres -> Postgres

4.6X FASTER

WALL TIME

Filament

3.79 SEC

ingestr

17.49 SEC

TPC-H, Postgres -> Postgres

1.6X LESS

PEAK MEMORY

Filament

2.97 GIB

ingestr

4.83 GIB

NYC Taxi, Postgres -> Postgres

1.6X LESS

PEAK MEMORY

Filament

2.97 GIB

ingestr

4.83 GIB

NYC Taxi, Postgres -> Postgres

2.4X MORE

CPU SECONDS

Filament

377.4 SEC

ingestr

157.4 SEC

NYC Taxi, Postgres -> Postgres

2.4X MORE

CPU SECONDS

Filament

377.4 SEC

ingestr

157.4 SEC

NYC Taxi, Postgres -> Postgres

Galaxy product illustration

License and control

License

Apache 2.0, open source.

Functional Source License 1.1, source-available. Competing use prohibited. Each version becomes Apache 2.0 two years after release. MIT until June 2026.

License

Apache 2.0, open source.

Functional Source License 1.1, source-available. Competing use prohibited. Each version becomes Apache 2.0 two years after release. MIT until June 2026.

Self-hosted in full

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

Yes for the CLI. Orchestration comes from the open-source Bruin CLI or your own scheduler. Lineage, audit logs, and cost insights are Bruin Cloud.

Self-hosted in full

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

Yes for the CLI. Orchestration comes from the open-source Bruin CLI or your own scheduler. Lineage, audit logs, and cost insights are Bruin Cloud.

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.

Go, contributed to the repository and compiled in. No plugin or manifest mechanism.

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.

Go, contributed to the repository and compiled in. No plugin or manifest mechanism.

Connector maintenance

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

All maintained by Bruin. 117 sources and 32 destinations in the README table.

Connector maintenance

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

All maintained by Bruin. 117 sources and 32 destinations in the README table.

Services to operate

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

None. One process per run.

Services to operate

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

None. One process per run.

Runtime

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

Go binary using Arrow and ADBC. The pip package downloads the binary.

Runtime

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

Go binary using Arrow and ADBC. The pip package downloads the binary.

Scheduling

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

None. Cron, an orchestrator, or Bruin.

Scheduling

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

None. Cron, an orchestrator, or Bruin.

SaaS source execution

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

Hand-written Go per source, compiled into the binary.

SaaS source execution

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

Hand-written Go per source, compiled into the binary.

Embeddable

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

Python SDK that shells out to the binary.

Embeddable

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

Python SDK that shells out to the binary.

Interfaces

Web UI, ConnectRPC API, CLI.

CLI, a local unauthenticated web UI, Python SDK.

Interfaces

Web UI, ConnectRPC API, CLI.

CLI, a local unauthenticated web UI, Python SDK.

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.

Batch loads restart from scratch. No high-watermark state is kept between batch runs, so your scheduler passes the interval. CDC runs resume from the log position.

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.

Batch loads restart from scratch. No high-watermark state is kept between batch runs, so your scheduler passes the interval. CDC runs resume from the log position.

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. Row counts reported at the end of the run.

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. Row counts reported at the end of the run.

Change data capture

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

Yes. Postgres WAL, MySQL binlog, SQL Server, MongoDB, Vitess, PlanetScale. Deletes are soft-deleted rows.

Change data capture

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

Yes. Postgres WAL, MySQL binlog, SQL Server, MongoDB, Vitess, PlanetScale. Deletes are soft-deleted rows.

Schema drift

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

Schema contract modes (evolve, freeze, discard). New columns added as nullable. Type changes depend on the destination.

Schema drift

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

Schema contract modes (evolve, freeze, discard). New columns added as nullable. Type changes depend on the destination.

Parallel reads within a table

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

Opt-in. Requires a partition column, a partition interval, and an explicit interval window. One stream per table by default.

Parallel reads within a table

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

Opt-in. Requires a partition column, a partition interval, and an explicit interval window. One stream per table by default.

Row lineage

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

_cdc_lsn, _cdc_deleted, _cdc_synced_at on CDC loads. None documented for batch loads.

Row lineage

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

_cdc_lsn, _cdc_deleted, _cdc_synced_at on CDC loads. None documented for batch loads.

Cost

What drives billing

Nothing. Compute you already run.

Nothing for the CLI. Bruin Cloud has no public price list.

What drives billing

Nothing. Compute you already run.

Nothing for the CLI. Bruin Cloud has no public price list.

Paid tiers

None.

Bruin Cloud for managed orchestration, lineage, audit logs, and SSO on enterprise plans.

Paid tiers

None.

Bruin Cloud for managed orchestration, lineage, audit logs, and SSO on enterprise plans.

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

ingestr

NYC Taxi, PG → PG (298.3M rows)

114.8 s

610.9 s

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

3.79 s

17.49 s

Rows per second

Rows per second

Rows per second

Filament

Filament

ingestr

ingestr

Better

NYC Taxi, PG → PG

NYC Taxi, PG → PG

2,597,498

2,597,498

2,597,498

488,233

488,233

488,233

Filament 5.32×

TPC-H, PG → PG

TPC-H, PG → PG

2,288,144

2,288,144

2,288,144

495,233

495,233

495,233

Filament 4.62×

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

ingestr

ingestr

Better

NYC Taxi, PG → PG

377.4

377.4

377.4

157.4

157.4

157.4

ingestr 0.42×

TPC-H, PG → PG

17.9

17.9

17.9

11.3

11.3

11.3

ingestr 0.63×

Peak memory, largest container

Peak memory, largest container

Peak memory, largest container

Filament

ingestr

NYC Taxi, PG → PG

2.97 GiB

4.83 GiB

TPC-H, PG → PG

1.83 GiB

1.62 GiB

Last updated on August 31, 2026

Full Filament vs. ingestr benchmark report

Full Filament vs. ingestr benchmark report

Full Filament vs. ingestr benchmark report

Migrate to

Migrate to

Copyright © 2026 Galaxy. All rights reserved.