Duckstring
Build data pipelines the way you build software: version each transform, declare its dependencies, and Duckstring resolves the execution DAG automatically.
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.
There is no DAG.
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
Metadata
Release files for duckstring 0.5.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| duckstring-0.5.0.tar.gz | 763.7 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| duckstring-0.5.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.6 MB
Release files / duckstring-0.5.0.tar.gz
| Download URL | duckstring-0.5.0.tar.gz |
|---|---|
| Size | 763.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a7b26cef95d1e81d93ca817d9e3e0d1b868f98e269850a1225975a4ebe293d33
|
|
BLAKE2b-256 checksum How to use checksums |
b9d5ff8fb781b366de589c622f733e84eb729e97d72643c7db8f0d51d1f0552e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 3, 2026.
Transparency logRelease files / duckstring-0.5.0-py3-none-any.whl
| Download URL | duckstring-0.5.0-py3-none-any.whl |
|---|---|
| Size | 871.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
17452df8593a7df98e357eec12ce200336f3c6012aa5b98bec48c5e4f3a97547
|
|
BLAKE2b-256 checksum How to use checksums |
69d17a833b6ee2c0265d06fffaa4ceed28e1dbdbac84dc471e3c15d4182ee27c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 3, 2026.
Transparency logSecurity for duckstring 0.5.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for duckstring-0.5.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 3, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.