duckle vs fenic
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 — Semantic DataFrames: PySpark-style select, filter and join alongside AI operators — extract, classify, summarize, embed, semantic join — compiled on an engine built for inference.
Both build pipelines on a local engine instead of a warehouse: duckle is a visual SQL/Python ETL canvas on DuckDB, fenic is code-first DataFrames with LLM operators inline. Canvas vs code.
| duckle | fenic | |
|---|---|---|
| Stars | 1.2k | 665 |
| Forks | 92 | 41 |
| Language | Rust | Python |
| License | Apache-2.0 | Apache-2.0 |
| Last activity | today | 3 days ago |
| Topics | data | data, orchestration |
| Curated connections | 3 | 4 |
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.
fenic — the curator's take
Use it when an agent's data discovery has to survive the chat: express the work as typed operators and the pipeline is already the artifact — `explain()`-able, rerunnable, row-level lineage, per-query cost and tokens, promotable to a table, view or MCP tool. `semantic.extract(PydanticModel)` replacing regex-plus-one-off-prompt is the whole pitch, and the engine handles batching, rate limits, retries and response caching so you aren't hand-rolling them. Not the tool for streaming or petabyte scale, and not a pandas replacement: it's a lazy query engine you configure models on, so single-row interactive work feels heavy and every operator is a real inference bill.