{"repo":"slothflowlabs/duckle","free":true,"listed":false,"github":"https://github.com/slothflowlabs/duckle","clone":"git clone https://github.com/slothflowlabs/duckle.git","description":"Open-source ETL and ELT tool on DuckDB. No-Code/Low-code visual data pipelines or SQL: 385 components, dbt, CDC, data quality, reverse ETL, lineage, MCP for AI agents.","language":"Rust","stars":1027,"topics":["cdc","connectors","data-engineering","data-integration","data-orchestration","data-pipeline","data-quality","data-transformation","data-warehouse","dbt","duckdb","elt","etl","etl-framework","ingestion","lakehouse","local-first","low-code","no-code","reverse-etl"],"license":"Apache-2.0","category":"data_orchestration","readme_excerpt":"<div align=\"center\">\n\n<img src=\"docs/assets/duckle-readme.png\" alt=\"Duckle\" width=\"460\"/>\n\n<h3>Pipelines you own. Author locally, deploy to your servers.</h3>\n\n<p><b>Duckle</b> is an open-source ETL platform for teams who want their pipelines running on their own infrastructure. Author on your laptop with a canvas, Python or SQL, then ship the same file to a server: <code>duckle-runner serve</code> runs it headless on a schedule, in Docker or on a box you own, with a web console, roles and an audit trail. Every pipeline is one file in git, so it outlives whoever wrote it. It compiles to SQL on DuckDB and uses every core you give the box, so a bigger instance is a faster pipeline: <b>96 million rows out of Postgres to Parquet in 39.9s</b>. <b>No vendor cloud. No per-row billing. No lock-in.</b></p>\n\n<a href=\"https://duckle.org/\"><img src=\"website/assets/img/website-hero.gif\" alt=\"Duckle connecting 190 sources and destinations - databases, warehouses, SaaS apps and the DuckDB ecosystem - all running locally on DuckDB\" width=\"600\"/></a>\n\n<p><sub><i>Duckle is an independent open-source project by SlothFlowLabs. It builds on the DuckDB engine but is not part of, affiliated with, or endorsed by DuckDB Labs or MotherDuck.</i></sub></p>\n\n<p>\n<img alt=\"status\" src=\"https://img.shields.io/badge/status-beta-3b82f6\"/>\n<img alt=\"license\" src=\"https://img.shields.io/badge/license-MIT%20OR%20Apache--2.0-blue\"/>\n<img alt=\"platforms\" src=\"https://img.shields.io/badge/platforms-Windows%20%C2%B7%20macOS%20%C2%B7%20Linux-2b6cb0\"/>\n<img alt=\"rust\" src=\"https://img.shields.io/badge/Rust-000000?logo=rust&logoColor=white\"/>\n<img alt=\"tauri\" src=\"https://img.shields.io/badge/Tauri%202-24C8DB?logo=tauri&logoColor=white\"/>\n<img alt=\"react\" src=\"https://img.shields.io/badge/React%2019-20232A?logo=react&logoColor=61DAFB\"/>\n<img alt=\"typescript\" src=\"https://img.shields.io/badge/TypeScript-3178C6?logo=typescript&logoColor=white\"/>\n<img alt=\"duckdb\" src=\"https://img.shields.io/badge/DuckDB-FFF000?logo=duckdb&logoColor=black\"/>\n<img alt=\"stars\" src=\"https://img.shields.io/github/stars/slothflowlabs/duckle?style=social\"/>\n<a href=\"https://mcptoplist.com/server/glama%2Fslothflowlabs%2Fduckle\"><img src=\"https://mcptoplist.com/badge/glama%2Fslothflowlabs%2Fduckle.svg\" alt=\"MCP Toplist: Top 1% of 98,291\" /></a>\n</p>\n\n</div>\n\n<div align=\"center\">\n\n<a href=\"https://trendshift.io/repositories/54176?utm_source=trendshift-badge&amp;utm_medium=badge&amp;utm_campaign=badge-trendshift-54176\" target=\"_blank\" rel=\"noopener noreferrer\"><img src=\"https://trendshift.io/api/badge/trendshift/repositories/54176/daily?language=Rust\" alt=\"slothflowlabs%2Fduckle | Trendshift\" width=\"250\" height=\"55\"/></a>\n\n<a href=\"https://discord.com/invite/rUeAStJbWb\"><img src=\"docs/assets/discord-cta-v2.svg\" alt=\"Join the Duckle community on Discord\" width=\"340\"/></a>\n\n<p><sub><a href=\"https://github.com/slothflowlabs/duckle/stargazers\"><b>Star Duckle</b></a> if it looks useful. It genuinely helps other data engineers find the project.</sub></p>\n\n</div>\n\n---\n\n## Where Duckle runs\n\nThe laptop is where you author. The work runs wherever you deploy it, on the same file.\n\n| | How | What you get |\n|---|---|---|\n| **Server** | `duckle-runner serve --workspace /srv/pipelines` | Headless web console, cron scheduler, roles, audit log, alerts |\n| **Docker** | `Dockerfile.web` | The same console in a container, behind your own ingress |\n| **CI** | `duckle-runner --pipeline p.json` | Any runner. Exit codes and NDJSON logs, nothing to install |\n| **Standalone** | **Build Pipeline** | One self-contained executable. Drop it on a box, run it from cron or systemd |\n| **Desktop** | The app | Author, debug and inspect. Optional, and never required to run anything |\n\nNothing here depends on a person's machine being switched on:\n\n- **Pipelines are plain files in git.** Review them in a pull request, roll them back, and let them outlive whoever wrote them. There is no proprietary repository and no exported binary artifact.\n- **The console has roles and an audit log,** so more than one person can operate it and you can see who did what.\n- **Secrets are not in the pipeline file.** They resolve from the environment or an encrypted per-workspace store at run time.\n\nWorking recipes for **AWS (EC2, ECS, EKS)**, **Azure (VM, Container Apps, AKS)** and **Google Cloud (Compute Engine, GKE)**, with manifests and the mistakes worth avoiding, are at **[duckle.org/deploy](https://duckle.org/deploy.html)**. Three things worth knowing before you start:\n\n- The console **refuses to start** on a non-loopback bind without a credential. Pass `--token`, set `DUCKLE_CONSOLE_TOKEN`, or create accounts with `duckle-runner console add-user`.\n- The **scheduler runs in `serve`**, not in the editor. Start the editor with schedules armed and it now says so rather than leaving you to wonder why nothing fired.\n- **`GET /healthz`** needs no credential and answers `ok`, so a Kubernetes probe or a load balancer can check liveness without holding a token. Every other route is authenticated, so pointing a probe anywhere else reports the pod unhealthy forever.\n\n### Deploying a pipeline to a running server\n\n`POST /api/deploy` lands a pipeline on a server from wherever it was authored, with the schedule it should eventually run on:\n\n```bash\ncurl -X POST https://duckle.internal/api/deploy \\\n  -H \"Authorization: Bearer $DUCKLE_TOKEN\" \\\n  -d '{\"name\":\"orders-load\",\n       \"pipeline\": '\"$(cat orders-load.json)\"',\n       \"schedule\":{\"intervalMinutes\":30}}'\n```\n\nTwo things are deliberate. **The schedule arrives disabled**, so a cadence someone set while testing on a laptop cannot start firing the moment it reaches production; enabling it is a separate call. And **deploying needs `admin` while enabling needs `operator`**, because a deployed pipeline runs shell and SQL on that host: shipping the code and starting it are two acts, and the audit log records both with the name of whoever did them.\n\n### Scaling it\n\n`duckle-runner serve` is an ordinary service. Run it on EC2, EKS, a VM or a container next to everything else you operate, and scale it the way you scale any service:\n\n- **More cores.** The engine is parallel and uses every core on the box by default, so a bigger instance is a faster pipeline with no change to the pipeline. Bound it with `DUCKLE_THREADS` when you would rather it did not take the whole machine.\n- **More RAM.** Set `memoryLimitMb` per stage, or a workspace default, and spill to disk past it.\n- **More pipelines at once.** `DUCKLE_MAX_CONCURRENT_RUNS` raises how many run together; it ships at 1 so an unattended server stays predictable until you decide otherwise.\n- **More machines.** `duckle-runner work` drains a queued batch from as many workers as you start, on as many hosts as you like, each claiming its items under a lock so nothing runs twice.\n- **Bigger than any box.** Turn on **pushdown** and the query runs verbatim inside Postgres, Oracle, SQL Server or Snowflake. The warehouse does the scan; Duckle keeps the scheduling, lineage, data quality and alerting.\n\nMeasured, rather than asserted:\n\n- **96,000,000 rows** out of live Postgres to Parquet in **39.9s** ([details](#96m-rows-postgres-to-parquet))\n- **Oracle extract at 65.0s**, against 68.6s for python-oracledb with pyarrow on the same machine ([details](#whats-new-in-v061))\n\nThe one thing Duckle does not do is split a single query across a cluster the way a distributed warehouse does. When you need that, push the work down into the system that has it and let Duckle orchestrate around it.\n\n## Quick links\n\n<table>\n<tr>\n<td valign=\"top\" width=\"25%\">\n\n**Get started**\n\n- [Where Duckle runs](#where-duckle-runs)\n- [What is Duckle?](#what-is-duckle)\n- [What's new in v0.6.1](#whats-new-in-v061)\n- [What's new in v0.6.0](#whats-new-in-v060)\n- [Quickstart (60 s)](#quickstart-60-seconds)\n- [Download / Install](#download--install)\n- [Build from source](#build-from-source)\n- [Run your first pipeline](#run-your-first-pipeline)\n\n</td>\n<td valign=\"top\" width=\"25%\">\n\n**Use the product**\n\n- [Meet Duckie (AI)](#meet-duckie---the-local-ai-pipeline-assistant)\n- [How to use Duckle](#how-to-use-duckle)\n- [Recipes / examples](#recipes-and-examples)\n- [In-app Git (GitHub/GitLab)](#git-integration-github--gitlab)\n- [Workspace + Git flow](#workspace-and-git-flow)\n- [Schedules](#schedules-and-triggers)\n- [Server deployment](#server-deployment-build-pipeline)\n- [MCP server: connect Claude, Cursor or any agent](#mcp-server-connect-claude-or-any-llm-to-duckle)\n- [Connection management](#connection-management)\n- [Context variables](#context-variables)\n\n</td>\n<td valign=\"top\" width=\"25%\">\n\n**Reference**\n\n- [Capabilities matrix](#capabilities)\n- [Sources](#sources-101-available)\n- [Transforms](#transforms-130-available)\n- [Sinks](#sinks-63-available)\n- [Data quality](#data-quality-27-available)\n- [Custom code](#custom-code-6-available)\n- [Control flow](#control-flow-18-available)\n- [Advanced settings](#advanced-settings-per-node)\n- [Engines](#engines)\n- [Configuration](#configuration)\n\n</td>\n<td valign=\"top\" width=\"25%\">\n\n**Resources**\n\n- [Architecture](#architecture)\n- [Clean data for AI](#clean-data-before-it-reaches-your-ai)\n- [Performance tips](#performance-tips)\n- [FAQ](#faq)\n- [Troubleshooting](#troubleshooting)\n- [CI / CD](#ci--cd)\n- [Status](#status)\n- [Roadmap](#roadmap)\n- [Contributing](#contributing)\n- [Sponsor Duckle](SPONSORS.md)\n- [License](#license)\n- [Releases](https://github.com/slothflowlabs/duckle/releases)\n- [Roadmap doc](docs/roadmap.md)\n- [Contributing doc](CONTRIBUTING.md)\n\n</td>\n</tr>\n</table>\n\n---\n\n## What is Duckle?\n\nA visual data pipeline studio that runs on your laptop. Drag sources, transforms, validators, and sinks onto a canvas. Wire them together. Press **Run**. Duckle compiles the graph to SQL and executes it through a real columnar engine, with live previews, generated SQL on every node, and zero hidden state.\n\nIn short: a free, open-source, single-engine alternative t","default_branch":"main","files":569,"tree":[".all-contributorsrc",".cargo/config.toml",".dockerignore",".duckdb-cli-v1.2.2/duckdb.exe",".duckdb-cli-v1.2.2/duckdb.zip",".duckdb-cli-v1.4.4/duckdb.exe",".duckdb-cli-v1.4.4/duckdb.zip",".duckdb-cli-v1.5.3/duckdb.exe",".duckdb-cli-v1.5.3/duckdb.zip",".editorconfig",".gitattributes",".github/FUNDING.yml",".github/ISSUE_TEMPLATE/bug_report.md",".github/ISSUE_TEMPLATE/config.yml",".github/ISSUE_TEMPLATE/feature_request.md",".github/dependabot.yml",".github/pull_request_template.md",".github/workflows/ci.yml",".github/workflows/docker-web.yml",".github/workflows/pages.yml",".github/workflows/pypi.yml",".github/workflows/release.yml",".gitignore",".gitlab-ci.yml","CODE_OF_CONDUCT.md","CONTRIBUTING.md","Cargo.lock","Cargo.toml","Dockerfile.web","LICENSE-APACHE","LICENSE-MIT","README.md","SPONSORS.md","apps/desktop/Cargo.toml","apps/desktop/bin/.gitkeep","apps/desktop/build.rs","apps/desktop/capabilities/default.json","apps/desktop/icons/.gitkeep","apps/desktop/icons/128x128.png","apps/desktop/icons/128x128@2x.png","apps/desktop/icons/32x32.png","apps/desktop/icons/64x64.png","apps/desktop/icons/Square107x107Logo.png","apps/desktop/icons/Square142x142Logo.png","apps/desktop/icons/Square150x150Logo.png","apps/desktop/icons/Square284x284Logo.png","apps/desktop/icons/Square30x30Logo.png","apps/desktop/icons/Square310x310Logo.png","apps/desktop/icons/Square44x44Logo.png","apps/desktop/icons/Square71x71Logo.png","apps/desktop/icons/Square89x89Logo.png","apps/desktop/icons/StoreLogo.png","apps/desktop/icons/android/mipmap-anydpi-v26/ic_launcher.xml","apps/desktop/icons/android/mipmap-hdpi/ic_launcher.png","apps/desktop/icons/android/mipmap-hdpi/ic_launcher_foreground.png","apps/desktop/icons/android/mipmap-hdpi/ic_launcher_round.png","apps/desktop/icons/android/mipmap-mdpi/ic_launcher.png","apps/desktop/icons/android/mipmap-mdpi/ic_launcher_foreground.png","apps/desktop/icons/android/mipmap-mdpi/ic_launcher_round.png","apps/desktop/icons/android/mipmap-xhdpi/ic_launcher.png","apps/desktop/icons/android/mipmap-xhdpi/ic_launcher_foreground.png","apps/desktop/icons/android/mipmap-xhdpi/ic_launcher_round.png","apps/desktop/icons/android/mipmap-xxhdpi/ic_launcher.png","apps/desktop/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png","apps/desktop/icons/android/mipmap-xxhdpi/ic_launcher_round.png","apps/desktop/icons/android/mipmap-xxxhdpi/ic_launcher.png","apps/desktop/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png","apps/desktop/icons/android/mipmap-xxxhdpi/ic_launcher_round.png","apps/desktop/icons/android/values/ic_launcher_background.xml","apps/desktop/icons/icon-mark.png","apps/desktop/icons/icon-source.png","apps/desktop/icons/icon.icns","apps/desktop/icons/icon.ico","apps/desktop/icons/icon.png","apps/desktop/icons/ios/AppIcon-20x20@1x.png","apps/desktop/icons/ios/AppIcon-20x20@2x-1.png","apps/desktop/icons/ios/AppIcon-20x20@2x.png","apps/desktop/icons/ios/AppIcon-20x20@3x.png","apps/desktop/icons/ios/AppIcon-29x29@1x.png","apps/desktop/icons/ios/AppIcon-29x29@2x-1.png","apps/desktop/icons/ios/AppIcon-29x29@2x.png","apps/desktop/icons/ios/AppIcon-29x29@3x.png","apps/desktop/icons/ios/AppIcon-40x40@1x.png","apps/desktop/icons/ios/AppIcon-40x40@2x-1.png","apps/desktop/icons/ios/AppIcon-40x40@2x.png","apps/desktop/icons/ios/AppIcon-40x40@3x.png","apps/desktop/icons/ios/AppIcon-512@2x.png","apps/desktop/icons/ios/AppIcon-60x60@2x.png","apps/desktop/icons/ios/AppIcon-60x60@3x.png","apps/desktop/icons/ios/AppIcon-76x76@1x.png","apps/desktop/icons/ios/AppIcon-76x76@2x.png","apps/desktop/icons/ios/AppIcon-83.5x83.5@2x.png","apps/desktop/src/app_settings.rs","apps/desktop/src/ci_status.rs","apps/desktop/src/dbt_engine.rs","apps/desktop/src/engine_manager.rs","apps/desktop/src/lib.rs","apps/desktop/src/llama_chat.rs","apps/desktop/src/main.rs","apps/desktop/src/pixeltable_engine.rs","apps/desktop/src/samples.rs","apps/desktop/src/secrets.rs","apps/desktop/src/self_update.rs","apps/desktop/src/update_check.rs","apps/desktop/src/workspace_git.rs","apps/desktop/tauri.conf.json","benchmarks/pg-to-parquet/.gitignore","benchmarks/pg-to-parquet/README.md","benchmarks/pg-to-parquet/RESULTS.md","benchmarks/pg-to-parquet/bench.sh","benchmarks/pg-to-parquet/docker-compose.yml","benchmarks/pg-to-parquet/jobs/airbyte_setup.py","benchmarks/pg-to-parquet/jobs/dlt_job.py","benchmarks/pg-to-parquet/pipelines/duckle.json.tpl","branding/duckle-logo-1024.png","branding/duckle-logo-dark.png","branding/duckle-logo-glow.png","branding/duckle-logo-hero.png","branding/duckle-logo-light.png","branding/duckle-logo-pixel-30.png","branding/duckle-logo-pixel-40.png","branding/duckle-logo-pixel-52.png","branding/duckle-logo-pixel-dark.png","branding/duckle-logo-pixel-light.png","build.cmd","crates/connectors/Cargo.toml","crates/connectors/src/csv.rs","crates/connectors/src/lib.rs","crates/duckdb-engine/Cargo.toml","crates/duckdb-engine/build.rs","crates/duckdb-engine/examples/asset_coverage.rs","crates/duckdb-engine/examples/inspect_mssql.rs","crates/duckdb-engine/examples/oracle_repro.rs","crates/duckdb-engine/src/alerts.rs","crates/duckdb-engine/src/batch.rs","crates/duckdb-engine/src/catalog.rs","crates/duckdb-engine/src/connectors.rs","crates/duckdb-engine/src/context.rs","crates/duckdb-engine/src/dive.rs","crates/duckdb-engine/src/drift.rs","crates/duckdb-engine/src/error_category.rs","crates/duckdb-engine/src/gizmosql.rs","crates/duckdb-engine/src/history.rs","crates/duckdb-engine/src/lib.rs","crates/duckdb-engine/src/lineage.rs","crates/duckdb-engine/src/plan/builders.rs","crates/duckdb-engine/src/plan/graph.rs","crates/duckdb-engine/src/plan/mod.rs","crates/duckdb-engine/src/plan/specs.rs","crates/duckdb-engine/src/plan/tests.rs","crates/duckdb-engine/src/pyexpr.rs","crates/duckdb-engine/src/qvd.rs","crates/duckdb-engine/src/review.rs","crates/duckdb-engine/src/run_log.rs","crates/duckdb-engine/src/runlock.rs","crates/duckdb-engine/src/schedules.rs","crates/duckdb-engine/src/talend.rs","crates/duckdb-engine/src/tls.rs","crates/duckdb-engine/src/trust.rs","crates/duckdb-engine/src/util.rs","crates/duckdb-engine/src/watermark.rs","crates/duckdb-engine/tests/execution.rs","crates/duckdb-engine/tests/fixture.qvd","crates/duckle-gpu/Cargo.toml","crates/duckle-gpu/examples/bench.rs","crates/duckle-gpu/examples/chain_bench.rs","crates/duckle-gpu/examples/probe.rs","crates/duckle-gpu/src/lib.rs","crates/duckle-lance/Cargo.toml","crates/duckle-lance/src/main.rs","crates/duckle-mcp/Cargo.toml","crates/duckle-mcp/catalog.json","crates/duckle-mcp/src/catalog.rs","crates/duckle-mcp/src/main.rs","crates/duckle-mcp/src/tools.rs","crates/duckle-runner/Cargo.toml","crates/duckle-runner/src/audit.rs","crates/duckle-runner/src/auth_store.rs","crates/duckle-runner/src/branch.rs","crates/duckle-runner/src/build.rs","crates/duckle-runner/src/catalog_cmd.rs","crates/duckle-runner/src/console_auth.rs","crates/duckle-runner/src/drift.rs","crates/duckle-runner/src/import.rs","crates/duckle-runner/src/main.rs","crates/duckle-runner/src/manifest.rs","crates/duckle-runner/src/panel.html","crates/duckle-runner/src/selfextract.rs","crates/duckle-runner/src/serve.rs","crates/duckle-runner/src/signin.html","crates/duckle-runner/src/work.rs","crates/duckle-secrets/Cargo.toml","crates/duckle-secrets/src/lib.rs","crates/duckle-secrets/tests/connection_e2e.rs","crates/execution-core/Cargo.toml","crates/execution-core/src/lib.rs","crates/metadata/Cargo.toml","crates/metadata/src/lib.rs","crates/plugin-sdk/Cargo.toml","crates/plugin-sdk/src/lib.rs","crates/runtime/Cargo.toml","crates/runtime/src/lib.rs","crates/scheduler/Cargo.toml","crates/scheduler/src/lib.rs","crates/scheduler/tests/firing.rs","crates/slothdb-engine/Cargo.toml","crates/slothdb-engine/src/lib.rs","crates/stream-engine/Cargo.toml","crates/stream-engine/src/lib.rs","crates/transform-engine/Cargo.toml","crates/transform-engine/src/lib.rs","crates/workflow-engine/Cargo.toml","crates/workflow-engine/src/lib.rs","dev.cmd","dev.ps1","docker-compose.coolify.yml","docker-compose.web.yml","docs/ROADMAP-IDEAS.md","docs/assets/discord-cta-v2.svg","docs/assets/duckle-mark.png","docs/assets/duckle-mark.svg","docs/assets/duckle-og-card.png","docs/assets/duckle-readme.png","docs/assets/duckle-wordmark.png","docs/assets/flow.svg","docs/assets/hero-demo.gif","docs/assets/hero.svg","docs/assets/ingest-seconds-benchmark.png","docs/assets/mcp-claude-banner.svg","docs/assets/pg-to-parquet-benchmark.png","docs/assets/pypi-demo-agent.svg","docs/assets/pypi-demo-install.svg","docs/assets/pypi-demo-pip.svg","docs/assets/pypi-demo-validate.svg","docs/assets/real-life-screenshot/cdc-ducklake.png","docs/assets/real-life-screenshot/duckie.png","docs/assets/real-life-screenshot/incremental-load.png","docs/assets/real-life-screenshot/mega-pipeline-join.png","docs/assets/real-life-screenshot/mega-pipeline-parallelize.png","docs/assets/real-life-screenshot/parallelize-canvas.png","docs/assets/real-life-screenshot/visual-mapper.png","docs/assets/ui-preview.svg","docs/ci/github-actions.yml","docs/ci/gitlab-ci.yml","docs/current/architecture.md","docs/current/connectors.md","docs/current/engines.md","docs/current/getting-started.md","docs/current/index.md","docs/current/installation.md","docs/current/mcp.md","docs/current/scheduler.md","docs/current/transforms.md","docs/deploy-coolify.md","docs/design/dives.md","docs/roadmap.md","docs/salesforce-sink/IMPLEMENTATION.md","docs/salesforce-sink/live-suite/.gitignore","docs/salesforce-sink/live-suite/README.md","docs/salesforce-sink/live-suite/b1_bulk_insert.json","docs/salesforce-sink/live-suite/b2_bulk_upsert.json","docs/salesforce-sink/live-suite/b3_bulk_delete.json","docs/salesforce-sink/live-suite/b4_bulk_retrieve.json","docs/salesforce-sink/live-suite/b5_bulk_badid.json","docs/salesforce-sink/live-suite/connections/pg-dummy.json","docs/salesforce-sink/live-suite/connections/sf-live.json","docs/salesforce-sink/live-suite/data/bearer_inline.csv","docs/salesforce-sink/live-suite/data/bulk_badid.csv","docs/salesforce-sink/live-suite/data/bulk_insert.csv","docs/salesforce-sink/live-suite/data/bulk_upsert.csv","docs/salesforce-sink/live-suite/data/insert.csv","docs/salesforce-sink/live-suite/data/upsert.csv","docs/salesforce-sink/live-suite/out/.gitkeep","docs/salesforce-sink/live-suite/q1_bulk_query.json","docs/salesforce-sink/live-suite/run-suite.sh","docs/salesforce-sink/live-suite/s1_insert.json","docs/salesforce-sink/live-suite/s2_retrieve.json","docs/salesforce-sink/live-suite/s3_update.json","docs/salesforce-sink/live-suite/s4_upsert.json","docs/salesforce-sink/live-suite/s5_retrieve2.json","docs/salesforce-sink/live-suite/s6_delete.json","docs/salesforce-sink/live-suite/t4_bearer_inline.json","docs/salesforce-sink/live-suite/t6_wrongkind.json","docs/salesforce-sink/live-suite/t7_missingref.json","examples/starter-workspace/duckle.json","examples/starter-workspace/gen_samples.sql","examples/starter-workspace/pipelines/_csv_split_child.pipeline.json","examples/starter-workspace/pipelines/csv_split.pipeline.json","examples/starter-workspace/pipelines/ducklake_cdc.pipeline.json","examples/starter-workspace/pipelines/enrich_parallel.pipeline.json","examples/starter-workspace/pipelines/incremental_load.pipeline.json","examples/starter-workspace/pipelines/orders_filter.pipeline.json","examples/starter-workspace/pipelines/region_summary.pipeline.json","examples/starter-workspace/repository.json","frontend/index.html","frontend/package-lock.json","frontend/package.json","frontend/scripts/build-catalog.mjs","frontend/scripts/export-catalog.ts","frontend/scripts/gen-brand-icons.mjs","frontend/src/App.tsx","frontend/src/EngineUpgradeBanner.tsx","frontend/src/GuidedTour.tsx","frontend/src/ReviewPrompt.tsx","frontend/src/ShareView.tsx","frontend/src/UpdateBanner.tsx","frontend/src/accounts.ts","frontend/src/canvas/Canvas.tsx","frontend/src/canvas/ConnectionTypePicker.tsx","frontend/src/canvas/DuckleEdge.tsx","frontend/src/canvas/EdgeEditorModal.tsx","frontend/src/canvas/QuickAddSearch.tsx","frontend/src/canvas/VisualMapperModal.tsx","frontend/src/canvas/connection-types.ts","frontend/src/canvas/layout.ts","frontend/src/canvas/nodes/DuckleNode.tsx","frontend/src/canvas/run-status-context.ts","frontend/src/clipboard.ts","frontend/src/dives/DashboardModal.tsx","frontend/src/dives/DiveModal.tsx","frontend/src/dives/DivePanel.tsx","frontend/src/dives/DivesGallery.tsx","frontend/src/dives/VegaChart.tsx","frontend/src/dives/dashboard-types.ts","frontend/src/dives/dive-export.ts","frontend/src/dives/dive-generate.ts","frontend/src/dives/dive-io.ts","frontend/src/dives/dive-run.ts","frontend/src/dives/dive-types.ts","frontend/src/dives/suggest-chart.ts","frontend/src/errors.ts","frontend/src/font-size.ts","frontend/src/i18n/LanguageSelector.tsx","frontend/src/i18n/README.md","frontend/src/i18n/index.ts","frontend/src/i18n/languages.ts","frontend/src/i18n/locales/af.json","frontend/src/i18n/locales/ar.json","frontend/src/i18n/locales/az.json","frontend/src/i18n/locales/bg.json","frontend/src/i18n/locales/bn.json","frontend/src/i18n/locales/ca.json","frontend/src/i18n/locales/cs.json","frontend/src/i18n/locales/cy.json","frontend/src/i18n/locales/da.json","frontend/src/i18n/locales/de.json","frontend/src/i18n/locales/el.json","frontend/src/i18n/locales/en.json","frontend/src/i18n/locales/es.json","frontend/src/i18n/locales/et.json","frontend/src/i18n/locales/fa.json","frontend/src/i18n/locales/fi.json","frontend/src/i18n/locales/fr.json","frontend/src/i18n/locales/ga.json","frontend/src/i18n/locales/he.json","frontend/src/i18n/locales/hi.json","frontend/src/i18n/locales/hr.json","frontend/src/i18n/locales/hu.json","frontend/src/i18n/locales/id.json","frontend/src/i18n/locales/is.json","frontend/src/i18n/locales/it.json","frontend/src/i18n/locales/ja.json","frontend/src/i18n/locales/kk.json","frontend/src/i18n/locales/km.json","frontend/src/i18n/locales/ko.json","frontend/src/i18n/locales/lt.json","frontend/src/i18n/locales/lv.json","frontend/src/i18n/locales/mn.json","frontend/src/i18n/locales/mr.json","frontend/src/i18n/locales/ms.json","frontend/src/i18n/locales/my.json","frontend/src/i18n/locales/ne.json","frontend/src/i18n/locales/nl.json","frontend/src/i18n/locales/no.json","frontend/src/i18n/locales/pa.json","frontend/src/i18n/locales/pl.json","frontend/src/i18n/locales/pt-BR.json","frontend/src/i18n/locales/ro.json","frontend/src/i18n/locales/ru.json","frontend/src/i18n/locales/si.json","frontend/src/i18n/locales/sk.json","frontend/src/i18n/locales/sl.json","frontend/src/i18n/locales/sq.json","frontend/src/i18n/locales/sr.json","frontend/src/i18n/locales/sv.json","frontend/src/i18n/locales/sw.json","frontend/src/i18n/locales/ta.json","frontend/src/i18n/locales/te.json","frontend/src/i18n/locales/th.json","frontend/src/i18n/locales/tl.json","frontend/src/i18n/locales/tr.json","frontend/src/i18n/locales/uk.json","frontend/src/i18n/locales/ur.json","frontend/src/i18n/locales/vi.json","frontend/src/i18n/locales/zh-CN.json","frontend/src/i18n/locales/zh-TW.json","frontend/src/main.tsx","frontend/src/node-subtitle.ts","frontend/src/persistence.ts","frontend/src/pipeline-types.ts"],"storefront":"/r/slothflowlabs","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/slothflowlabs/duckle/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}