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.2 is a fix release that makes the v0.4.1 changes for #76, #77, and #80 actually work end to end, and adds a Settings panel so a proxy can be configured without touching system environment variables.
Materialize = View now pushes down on duck sources (#76)
Picking Materialize = View on a DuckDB / DuckLake / MotherDuck / Quack source used to be ignored: the Plan still showed CREATE TABLE and the whole table was read before any downstream filter ran (the v0.4.1 attempt routed it through an eager Parquet copy, which is the opposite of what View is for).
- A single-consumer duck source set to View now compiles to a real lazy
CREATE OR REPLACE VIEWover the live source. A downstreamWHERE/ projection pushes into the source scan, so the whole table is no longer loaded. Confirmed withEXPLAIN: the filter lands in the source scan, not after a full read. - The Plan tab now shows
CREATE VIEWfor this case, matching the choice you made. - This is safe across stages: the view is kept lazy only when the pipeline runs in a single batched session and the source is the sole attached source; otherwise it falls back to a materialized table (read once). Pipelines with several consumers of the same source also keep a table, so it is scanned once.
- Note: this applies to sources. A sink writes a table into its destination, so View does not apply to sink nodes.
Custom SQL is respected on DuckLake / MotherDuck / Quack sources (#77)
These sources gained a Custom SQL read mode in v0.4.1, but the engine only used your query when the Read-mode dropdown was explicitly set to "Custom SQL". Leaving it on the default "Whole table" ignored a query you typed and raised a "table name is required" error.
- A filled SQL box now wins regardless of the dropdown, exactly like the DuckDB source. Type a query (reference the source as
duckle_src, e.g.SELECT * FROM duckle_src.main.orders WHERE status = 'open') and it runs, with no table name required. Whole-table reads are unchanged.
Proxy support that works on a locked-down machine (#80)
v0.4.1 read a proxy only from environment variables, and the shared HTTP client was built once at startup (before any proxy could be known) and never rebuilt, so it never took effect. On a locked-down corporate machine you also cannot set a persistent system variable.
- A new Settings panel (gear icon in the top toolbar) lets you set an HTTP / HTTPS proxy per workspace. It is saved to
<workspace>/.duckle/settings.json, applied immediately, and re-applied on every launch and workspace switch - no system environment variable needed. - REST and cloud-API connectors, and the in-app updater, all route through it. The URL may include credentials, e.g.
http://user:pass@proxy:8080. The standardHTTPS_PROXY/HTTP_PROXY/ALL_PROXYvariables are still honored too. - This resolves the "Connection Failed ... (os error 10060)" timeout reported when the network requires a proxy.
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.
Upgrade notes
- Workspaces are forward-compatible; no migration is needed.
- Existing installs can fetch this build directly with the in-app updater (Update now).
- Built artifacts are unsigned by design (appending the self-extracting payload invalidates any code signature), so do not codesign or Authenticode-sign them.