duckle vs loafer
Self-hosted ETL/ELT on DuckDB: author pipelines on a canvas, in SQL or Python, then ship the same file to your own server — 190+ sources, dbt, CDC, lineage, and an MCP server for agents. — versus — YAML-defined ETL/ELT engine with a CLI and self-hosted control plane: Postgres/MySQL/Mongo/CSV/REST/PDF in, upserts with cursors, validation and quarantine, durable workers — AI transforms optional.
Both are self-hosted ETL/ELT you author as files. Duckle runs on DuckDB with a canvas plus SQL/Python and ships the same file to production; Loafer is YAML-first with durable role-isolated workers, quarantine and schema-drift policies, and an optional AI-written transform.
| duckle | loafer | |
|---|---|---|
| Stars | 1.3k | 6 |
| Forks | 94 | 1 |
| Language | Rust | Python |
| License | Apache-2.0 | MIT |
| Last activity | 2 days ago | 21 days ago |
| Topics | data | data |
| Curated connections | 5 | 1 |
duckle — the curator's take
Reach for it when the objection to Fivetran or Airbyte is the bill and the vendor cloud: pipelines compile to SQL on DuckDB, use every core on the box, and every pipeline is one file in git that outlives whoever wrote it. `duckle-runner serve` runs it headless on a schedule with a web console, roles and an audit trail, and the MCP server means an agent can inspect and drive pipelines rather than you hand-writing glue. Where it's weak: single-engine by design, so it scales up a box rather than out a cluster; it's beta and Rust/Tauri-shaped, meaning a desktop authoring app is part of the workflow; and the 385-component count includes a long tail you should verify before betting a migration on it.
loafer — the curator's take
Loafer is an ETL engine first and an 'AI agent' only by its tagline: the AI is an optional transform step, and the example pipelines run with no API key. What it does well is make data movement legible — a pipeline file says source, transform class (row-local vs global pushdown), target, incremental cursor and what happens to bad rows. Use it for durable scheduled loads into Postgres/Mongo from a dev-friendly YAML. NOT for whole-dataset joins/aggregates in Python (it forces those to ELT pushdown by design), and not yet for the dashboard, OCR or crawl workers the README lists as in development. Six stars, v0-era — read PRODUCTION_READINESS.md first.