Introduction
OLake is an open-source tool for replicating databases into a lakehouse. It reads from databases and writes to Apache Iceberg or Parquet. It is focused on that one path and does it well. Filament is an open-source replication engine that writes Iceberg too, alongside Postgres, MySQL, ClickHouse, and S3, from one binary.
HIGHLIGHTS
2.0× FASTER
ROWS PER SECOND
Filament
1,265,363 ROWS
OLake
622,056 ROWS
NYC Taxi, MySQL -> Iceberg
2.0× FASTER
ROWS PER SECOND
Filament
1,265,363 ROWS
OLake
622,056 ROWS
NYC Taxi, MySQL -> Iceberg
15.0× LESS
CPU SECONDS
Filament
528.0 SEC
OLake
7905.9 SEC
NYC Taxi, Postgres -> Iceberg
15.0× LESS
CPU SECONDS
Filament
528.0 SEC
OLake
7905.9 SEC
NYC Taxi, Postgres -> Iceberg
1.5× LESS
PEAK MEMORY
Filament
10.31 GIB
OLake
15.07 GIB
NYC Taxi, MySQL -> Iceberg
1.5× LESS
PEAK MEMORY
Filament
10.31 GIB
OLake
15.07 GIB
NYC Taxi, MySQL -> Iceberg
1.1× SLOWER
WALL TIME
Filament
234.3 SEC
OLake
204.0 SEC
NYC Taxi, Postgres -> Iceberg
1.1× SLOWER
WALL TIME
Filament
234.3 SEC
OLake
204.0 SEC
NYC Taxi, Postgres -> Iceberg

License and control
License
Apache 2.0, open source.
Apache 2.0, open source.
License
Apache 2.0, open source.
Apache 2.0, open source.
Self-hosted in full
Yes. One repository, no paid tier, nothing gated.
Yes. Enterprise is custom pricing by contact form with nothing publicly gated.
Self-hosted in full
Yes. One repository, no paid tier, nothing gated.
Yes. Enterprise is custom pricing by contact form with nothing publicly gated.
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. Implement the driver interface, about 18 methods, and build a new driver image. The UI hard-codes the allowed source types.
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. Implement the driver interface, about 18 methods, and build a new driver image. The UI hard-codes the allowed source types.
Connector maintenance
Every connector lives in the engine repository with a published maturity level (alpha, beta, stable).
8 sources and 2 destinations, all in the vendor monorepo.
Connector maintenance
Every connector lives in the engine repository with a published maturity level (alpha, beta, stable).
8 sources and 2 destinations, all in the vendor monorepo.
Services to operate
Server and control plane, with Postgres and NATS. Each run is its own Kubernetes Job. One binary for evaluation.
UI deployment runs 5 compose services (UI, worker, Temporal, Postgres, init) plus a container per sync. Minimum 8 vCPU and 16 GB. An external Iceberg catalog is mandatory.
Services to operate
Server and control plane, with Postgres and NATS. Each run is its own Kubernetes Job. One binary for evaluation.
UI deployment runs 5 compose services (UI, worker, Temporal, Postgres, init) plus a container per sync. Minimum 8 vCPU and 16 GB. An external Iceberg catalog is mandatory.
Runtime
Static Go binaries on distroless images. One runner code path wherever a run executes.
Go drivers plus a Java 17 sidecar JVM for every Iceberg write, talking over gRPC on localhost.
Runtime
Static Go binaries on distroless images. One runner code path wherever a run executes.
Go drivers plus a Java 17 sidecar JVM for every Iceberg write, talking over gRPC on localhost.
Scheduling
Built-in cron per pipeline. Safe to run multiple control planes.
In the UI, on Temporal. None in the CLI.
Scheduling
Built-in cron per pipeline. Safe to run multiple control planes.
In the UI, on Temporal. None in the CLI.
SaaS source execution
Manifests interpreted inside the engine, in the same process as the run. No per-connector containers.
None. Databases, Kafka, and S3 only.
SaaS source execution
Manifests interpreted inside the engine, in the same process as the run. No per-connector containers.
None. Databases, Kafka, and S3 only.
Embeddable
Yes. Go library (app.Run) with swappable event bus, state store, and secrets.
No library mode documented.
Embeddable
Yes. Go library (app.Run) with swappable event bus, state store, and secrets.
No library mode documented.
Interfaces
Web UI, ConnectRPC API, CLI.
CLI, web UI, session-cookie REST API. Single admin user, no RBAC or SSO.
Interfaces
Web UI, ConnectRPC API, CLI.
CLI, web UI, session-cookie REST API. Single admin user, no RBAC or SSO.
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.
Chunk-level state plus an Iceberg commit ledger in the modes that keep state. Plain full refresh writes no state and restarts.
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.
Chunk-level state plus an Iceberg commit ledger in the modes that keep state. Plain full refresh writes no state and restarts.
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. Two-phase commit per chunk and _olake_id deduplication.
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. Two-phase commit per chunk and _olake_id deduplication.
Change data capture
Native. Postgres logical replication (pgoutput) with a consistent snapshot bootstrap. MySQL binlog with GTID cursors.
Postgres pgoutput, MySQL binlog, MongoDB change streams, SQL Server CDC tables. Oracle CDC is work in progress. Not continuous, each run is a bounded job.
Change data capture
Native. Postgres logical replication (pgoutput) with a consistent snapshot bootstrap. MySQL binlog with GTID cursors.
Postgres pgoutput, MySQL binlog, MongoDB change streams, SQL Server CDC tables. Oracle CDC is work in progress. Not continuous, each run is a bounded job.
Schema drift
New columns added to the destination automatically. Add-only, nothing dropped, nothing rewritten.
New columns added. Widening promotions applied, some narrowing accepted after range validation. Unsupported type changes such as float to int fail the sync.
Schema drift
New columns added to the destination automatically. Add-only, nothing dropped, nothing rewritten.
New columns added. Widening promotions applied, some narrowing accepted after range validation. Unsupported type changes such as float to int fail the sync.
Parallel reads within a table
Yes. Large tables split into up to 64 shards (keyset, bitmap, or ctid) read concurrently.
Yes. ctid or key-range chunks under a per-job max_threads cap that defaults to 3.
Parallel reads within a table
Yes. Large tables split into up to 64 shards (keyset, bitmap, or ctid) read concurrently.
Yes. ctid or key-range chunks under a per-job max_threads cap that defaults to 3.
Destinations
Postgres, MySQL, ClickHouse, Iceberg, S3.
Iceberg and Parquet only.
Destinations
Postgres, MySQL, ClickHouse, Iceberg, S3.
Iceberg and Parquet only.
Cost
What drives billing
Nothing. Compute you already run.
Nothing for the software. JVM sidecar memory and Temporal for the UI.
What drives billing
Nothing. Compute you already run.
Nothing for the software. JVM sidecar memory and Temporal for the UI.
Paid tiers
None.
Enterprise by contact form. No published pricing.
Paid tiers
None.
Enterprise by contact form. No published pricing.
Comparison
Benchmarks
Benchmarks
benchmark
Wall time
Seconds for a full load
Seconds for a full load
Filament
OLake
NYC Taxi, PG → Iceberg (298.3M rows)
234.3 s
204.0 s
NYC Taxi, MySQL → Iceberg (298.3M rows)
235.7 s
479.5 s
Transfer speed
Rows per second
Rows per second
Filament
Filament
OLake
OLake
Better
NYC Taxi, PG → Iceberg
NYC Taxi, PG → Iceberg
1,265,363
1,265,363
1,265,363
622,056
622,056
622,056
Filament 2.03×
NYC Taxi, MySQL → Iceberg
NYC Taxi, MySQL → Iceberg
1,265,363
1,265,363
1,265,363
622,056
622,056
622,056
Filament 2.03×
CPU seconds
Summed across containers
Summed across containers
Filament
Filament
OLake
OLake
Better
NYC Taxi, PG → Iceberg
528.0 s
528.0 s
528.0 s
7,905.9 s
7,905.9 s
7,905.9 s
Filament 15.0×
NYC Taxi, MySQL → Iceberg
940.5 s
940.5 s
940.5 s
7,465.4 s
7,465.4 s
7,465.4 s
Filament 7.9×
Peak memory
Largest container
Largest container
Filament
OLake
NYC Taxi, PG → Iceberg
11.70 GiB
16.64 GiB
NYC Taxi, MySQL → Iceberg
10.31 GiB
15.07 GiB
Last updated on August 31, 2026
Full Filament vs. OLake benchmark report
Full Filament vs. OLake benchmark report
Full Filament vs. OLake benchmark report
See how Filament compares
filament benchmarks
Migrate to
Migrate to
Company
Talk to the team
Copyright © 2026 Galaxy. All rights reserved.