StackMap
Subscribe

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.

The curated verdict

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.

ducklefenic
Stars1.2k665
Forks9241
LanguageRustPython
LicenseApache-2.0Apache-2.0
Last activitytoday3 days ago
Topicsdatadata, orchestration
Curated connections34

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.