Duckle v0.4.0
Duckle is a local-first ETL/ELT studio: design pipelines on a canvas or describe them to the on-device AI assistant, and run them at native speed on DuckDB. v0.4.0 turns Build Pipeline into a real cross-platform deploy tool, speeds up fan-out workloads, adds new ways to materialize and loop, and ships a brand-new website and docs. This build also adds run-time date/time path placeholders with auto-created folders, project-tree drag-and-drop, REST source improvements, and a partial-column merge write mode.
Highlights
Cross-OS Build Pipeline
Build Pipeline turns a pipeline into ONE self-contained executable. v0.4.0 adds a Target OS selector to the build dialog:
- Windows and Linux build natively, and a Linux server file can now be cross-built from any host - the static Linux engine and a Linux DuckDB CLI are bundled into the artifact for you, so you can produce a Linux deployment file without a Linux box.
- macOS builds on a Mac (Apple's toolchain is Mac-only); the dialog says so up front instead of failing late, and only offers a target it can actually produce.
- The output stays a single file: a runner stub plus a zipped payload (the resolved pipeline, contexts, secret handling, DuckDB, and only the extensions that pipeline needs). Copy it to a server and run or schedule it - nothing to install.
Materialize a step to DuckDB
Any step can now be pinned to memory, to disk, or persisted to a real .duckdb file you can reopen later. Use it to cache an expensive join across runs or to hand a step's output to a BI tool. The memory/disk choice moved to the Basic tab so it is one click away.
Parallel loops (ctl.foreach)
For-each loops can run their per-row child pipeline with a configurable concurrency. Fan-out workloads - per-table loads, per-partition exports, per-tenant moves - now run several children at once instead of strictly one at a time, which dramatically shortens wide ingests.
New transform: Zip Arrays to Table (xf.zip)
Turn a headings array plus row-arrays into a proper table, one column per heading - the missing piece for APIs and sources that return columnar arrays.
Portable workspaces (${workspace})
A built-in ${workspace} placeholder resolves to the current workspace folder, so file paths inside a pipeline travel with the project across machines and accounts.
Local multi-account profiles
Keep separate accounts and workspaces and switch between them from the top bar without restarting. Cold start opens the active account's workspace, and switching accounts no longer blanks the canvas.
Resolved context-variable hints
Bindable property fields now show the resolved value of a ${VAR} inline (secrets masked), so you can see exactly what a node will use before you run it.
Dynamic paths, data-driven loops, and project organization
- Run-time path placeholders. Drop
${date},${time},${datetime},${timestamp}, or${now}into any source or sink path and they resolve to the current run time (UTC). A sink's parent folder is created for you, so${workspace}/exports/${date}/orders.parquetwrites into a fresh dated folder. They resolve the same way on the canvas, on a schedule, with the headless runner, and inside a built bundle - the time is stamped when the pipeline runs, not when it was built, so a daily run of one bundle lands in a new dated folder each day. - Data-driven source names.
ctl.foreachreads its upstream rows and runs a child pipeline once per row, exposing each column as${ITER_ITEM_<COLUMN>}(plus${ITER_INDEX}). A table of names can drive the source table name in the child, so one pipeline loops over many tables. - Organize the project tree. Drag a pipeline (or any item, or one of your own folders) onto a folder to move it; the move is saved to the workspace.
A new website and docs
A complete documentation site is live at duckle.org: a landing page, getting-started / components / automation / AI docs, a filterable integrations directory, light and dark themes, and search-friendly metadata.
Engine and connectors
- MotherDuck: the real MotherDuck brand mark; the inline token is applied via
SET(no more repeated device-login prompts); sinks auto-create the target table on first write; and the Snowflakeendpointplus MotherDuckupsertoptions are exposed in the property panel. - Context variables now resolve inside
ctl.foreachandctl.runjobchild pipelines, and for schema autodetect. - Per-stage materialization controls, and attach-backed Parquet sources stay on the fast path even under a reject split.
- REST source: the API-key auth header name is now configurable (so endpoints like
X-Redmine-API-Keywork instead of a fixedX-API-Key), and offset pagination can stop on a bodytotal_countrather than fetching one empty page past the end. - Merge write mode: DuckDB-family sinks (DuckDB, SQLite, DuckLake, MotherDuck) gain a
mergemode that updates only the columns the source provides viaMERGE INTO, preserving the columns it does not - the win over delete-and-reinsert, which would null them.
Canvas and workspace
- Smarter one-click auto-layout: nodes are ranked by dependency depth and columns are spaced by node width, so connectors always have room.
- A single corrupt workspace JSON file no longer blocks the whole workspace from opening.
- The account dropdown and editor are no longer clipped behind the top bar.
Reliability fixes
- The webhook source no longer drops requests on macOS.
- Relational and MotherDuck sinks create the destination on the first write in append mode.
Download
Grab the single-file binary for your OS below. The headless runner and the MCP server are embedded, so there are no separate downloads.
| OS | Asset |
|---|---|
| Windows x64 | Duckle-windows-x64.exe |
| Windows ARM64 | Duckle-windows-arm64.exe |
| macOS (Apple Silicon) | Duckle-macos-arm64 |
| macOS (Intel) | Duckle-macos-x64 |
| Linux x64 | Duckle-linux-x64 |
| Linux ARM64 | Duckle-linux-arm64 |
On Windows, double-click (SmartScreen may warn the first time on an unsigned binary; choose More info then Run anyway). On macOS / Linux, chmod +x the file and run it. On first launch Duckle guides you through installing DuckDB (required) and, optionally, the on-device Duckie AI assistant.
Upgrade notes
- Workspaces are forward-compatible; no migration is needed.
- In-app update detection will notify existing installs that a newer build is available.
- Built artifacts are unsigned by design (appending the self-extracting payload invalidates any code signature), so do not codesign or Authenticode-sign them.