Duckle
Two merged fixes to a self hosted ETL tool built on DuckDB: relative time offsets in pipeline templates and reliable loading of workspaces defined in a single file.
- Role
- Contributor
- When
- August 2026
- Stack
- TypeScript, React, Rust, DuckDB
Context
Duckle is an open source ETL and ELT tool you deploy on your own servers. Pipelines are built visually or in SQL and run on DuckDB, with a Rust engine and a TypeScript frontend. Pipelines and jobs live in a workspace described by JSON files, so they can be versioned and generated from the command line.
What I contributed
Relative time offsets in templates (#276, merged). The engine already understood expressions such as ${date-1d} or ${now-2h} in pipeline parameters and paths, but the frontend did not. When a template used an offset, the UI treated it as an unknown parameter and asked the user to type a value by hand, and previews substituted the wrong date. I added an offset parser to the frontend (days, hours, minutes and seconds, signed and combinable, as in +1d6h), used it when resolving runs and substituting values, and taught parameter discovery to recognise these expressions as built in. Frontend and engine now resolve the same template to the same value.
Loading single file workspaces (#275, merged). Workspaces exported by the CLI can keep their pipelines and jobs inline in duckle.json instead of separate files. The frontend loader only looked for the separate files, so opening one of these workspaces showed the starter example project instead of the user's jobs. The fix reads inline pipeline data, falls back to workspace.json when duckle.json is minimal, and restores the list of active jobs.
Why it matters
Both bugs sat between two parts of the same product: a feature that worked in the engine but not in the UI, and a file format the CLI could write but the UI could not read. Fixing them meant reading both sides and making the frontend agree with what the engine and CLI already did.
Pull requests
2 merged, 0 open, 0 closed. Status synced from GitHub.