Skip to content

Duckle v0.4.0

Choose a tag to compare

@github-actions github-actions released this 16 Jun 16:55
· 34 commits to main since this release

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.parquet writes 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.foreach reads 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 Snowflake endpoint plus MotherDuck upsert options are exposed in the property panel.
  • Context variables now resolve inside ctl.foreach and ctl.runjob child 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-Key work instead of a fixed X-API-Key), and offset pagination can stop on a body total_count rather than fetching one empty page past the end.
  • Merge write mode: DuckDB-family sinks (DuckDB, SQLite, DuckLake, MotherDuck) gain a merge mode that updates only the columns the source provides via MERGE 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.