Build data pipelines the way you build software: version each transform, declare its dependencies, and Duckstring resolves the execution DAG automatically.
Project description
Duckstring
There is no DAG.
Duckstring treats data transformations as software packages. Upstream dependencies are declared per Pond (unit operation), defining the DAG without the need for its direct management.
Ponds are upgraded and deployed to Duckstring's pull-based Catchment (orchestrator) atomically - like upgrading a package - with the earlier version continuing to execute until there are no consumers dependent on it. Upstream defines constraints on what it can consume, downstream defines when it's needed, and the Catchment optimally executes the sequence of Ponds supplying it with the best currency and frequency as possible.
You should not need to manage the DAG. You should not need global governance. You should know yourself and your suppliers and trust that you'll get what you need when you need it.
Core Concepts
The main elements:
- Catchment: Control environment (FastAPI + UI + CLI)
- Pond: Versioned container with declared upstream dependencies
- Ripple: Unit operation within a Pond (e.g. a single transformation producing a table)
- Trickle: DBSP-based incremental engine operating within a Ripple
Ponds are typed or referred to in context:
- Source: A parent Pond
- Sink: A child Pond
- Inlet: A Pond with external dependencies and no Sources
- Outlet: A Pond with no Sinks (e.g. outputs final data products)
To see the orchestration model in action without installing anything, try the Duckstring Playground.
Quickstart
pip install duckstring
# Start a local Catchment (the runtime + web UI) — leave it running
duckstring catchment init --name dev
Then, in another terminal:
# Create the demo pipeline (transactions, products → sales → reports) and deploy it
mkdir demo && cd demo
duckstring pond demo
duckstring pond deploy --all -y
# Run it end to end, once
duckstring trigger pulse reports
# Look around
duckstring status # live state of every Pond
duckstring query reports monthly_summary # peek at an output table
The Catchment also serves a live web UI at http://127.0.0.1:7474 — the Pond graph, freshness, run history, and the full trigger/control surface.
Execution
Ponds execute on demand signals sent to an Outlet, in two flavours — push runs the lineage forward to a target freshness; pull propagates demand upstream so every Pond re-runs as its Sources update, naturally throttled to the bottleneck. Each comes as a one-shot or a standing trigger:
| Once | Continuously | |
|---|---|---|
| Push | Pulse | Tide |
| Pull | Tap | Wave |
A Tide keeps an Outlet no staler than a bound (duckstring trigger tide reports 1d); a Wave keeps it as fresh as the pipeline can supply. See Triggers for the full semantics.
Going further
Full documentation lives at docs.duckstring.com:
- Quickstart — the path above, with explanations
- Theory — the freshness-based orchestration model in depth
- Versioning — SemVer on Ponds, concurrent major versions, atomic upgrades
- Local testing — Puddles: test a Pond before deploying it
- Fault tolerance — retry budgets, failure states, recovery
- Running a Catchment — hosting, authentication, platform deployment
- CLI / HTTP API — full references
There are future plans for a hosted Catchment service at duckstring.com. If you're interested, please get in touch.
License
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file duckstring-0.4.0.tar.gz.
File metadata
- Download URL: duckstring-0.4.0.tar.gz
- Upload date:
- Size: 593.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ea366fae83fc32bf5026e212cd1d21562f8a81870acd52a841ac3ebf17e38bdb
|
|
| MD5 |
10e011a8fd2d07490d95ee13b8440065
|
|
| BLAKE2b-256 |
6806ae2836e57f7eeeaba9d4109817bd7a82910ac8a10446c157372d89063c03
|
Provenance
The following attestation bundles were made for duckstring-0.4.0.tar.gz:
Publisher:
release.yml on duckstring-dev/duckstring
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
duckstring-0.4.0.tar.gz -
Subject digest:
ea366fae83fc32bf5026e212cd1d21562f8a81870acd52a841ac3ebf17e38bdb - Sigstore transparency entry: 2079770957
- Sigstore integration time:
-
Permalink:
duckstring-dev/duckstring@ff5a9ab12a75897246227958aed59898462b1b39 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/duckstring-dev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ff5a9ab12a75897246227958aed59898462b1b39 -
Trigger Event:
push
-
Statement type:
File details
Details for the file duckstring-0.4.0-py3-none-any.whl.
File metadata
- Download URL: duckstring-0.4.0-py3-none-any.whl
- Upload date:
- Size: 668.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0a0bbe1adf0ca0fead8233fe419c0ea5a4a19aec76b30290e795bef1ed86bf35
|
|
| MD5 |
6b254634417551402eb5d9a03df3d335
|
|
| BLAKE2b-256 |
8c02be6c2685c3dcb606bf45e9f52261a8cca5909e09ec8798341d71550563c5
|
Provenance
The following attestation bundles were made for duckstring-0.4.0-py3-none-any.whl:
Publisher:
release.yml on duckstring-dev/duckstring
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
duckstring-0.4.0-py3-none-any.whl -
Subject digest:
0a0bbe1adf0ca0fead8233fe419c0ea5a4a19aec76b30290e795bef1ed86bf35 - Sigstore transparency entry: 2079771547
- Sigstore integration time:
-
Permalink:
duckstring-dev/duckstring@ff5a9ab12a75897246227958aed59898462b1b39 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/duckstring-dev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ff5a9ab12a75897246227958aed59898462b1b39 -
Trigger Event:
push
-
Statement type: