Thanks for your interest in Duckle. This project is in early development; contributions, issues, and design discussion are all welcome.
By participating you agree to abide by the Code of Conduct.
- Rust stable, installed via rustup. The repository pins the toolchain in
rust-toolchain.toml. - Node.js 20+ and npm 10+.
- Tauri 2 system prerequisites - see https://tauri.app/start/prerequisites for your OS. On Windows this means MSVC build tools and WebView2.
# install frontend dependencies
npm --prefix frontend install
# build the workspace (compiles every crate)
cargo build --workspace
# run the desktop app
cargo run -p duckle-desktopThe desktop app launches Vite's dev server automatically and opens a Tauri window pointing at it.
apps/desktop/- Tauri 2 shell.crates/- Rust crates for runtime, connectors, engines, workflow, scheduling, plugins.frontend/- React + TypeScript UI.
- Fork the repository and create a branch off
main. - Make your change, following the style and test guidance below.
- Run the checks locally:
cargo fmt,cargo clippy --workspace --all-targets -- -D warnings,cargo test --workspace, andnpm --prefix frontend run lintif the frontend changed. - Push to your fork and open a pull request against
main. The PR template will prompt for a summary, related issue, and the checklist. - CI runs fmt, clippy, and tests on Linux, macOS, and Windows. Keep the PR focused; a green CI run and a clear description make review fast.
There is no required-reviewer gate, so a maintainer will merge once it looks good. Small, self-contained PRs are merged fastest.
- Rust:
cargo fmtandcargo clippy --workspace --all-targets -- -D warningsmust pass. - TypeScript: 2-space indent, single quotes, trailing commas. Run
npm --prefix frontend run lintbefore pushing. - Commits: small, atomic, and self-explanatory. Use imperative subject lines (
Add Parquet source connector, notAddedorAdding). - Comments: only when the why is non-obvious. Don't restate what the code already says.
- Unit tests live alongside the code (
#[cfg(test)] mod testsin Rust; co-located*.test.tsin the frontend). - Integration tests for crates that need them live under
crates/<name>/tests/. - Run everything with
cargo test --workspace.
- Add a new module under
crates/connectors/src/. - Implement the
Connectortrait fromplugin-sdk. - Register the connector in
crates/connectors/src/lib.rs. - Add an integration test under
crates/connectors/tests/. - Add a corresponding node type in
frontend/src/canvas/nodes/.
- Add a new module under
crates/transform-engine/src/ops/. - Implement the
Transformtrait fromplugin-sdk. - Register in the transform registry.
- Add a node type and properties panel in the frontend.
By contributing, you agree your contribution is dual-licensed under MIT and Apache-2.0, as the rest of the project is.
Do not paste or port code from incompatibly licensed sources. If you draw inspiration from another project, that is fine - but write the implementation from scratch.