Skip to main content

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)

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.

Scope & maturity

Duckstring targets single-node workloads (DuckDB under the hood) — pipelines in the tens of millions of rows, not big-data scale. Incremental transforms (the Trickle concept) are not yet implemented: transforms recompute their tables each run, with incremental state via self-reads.

Going further

Full documentation lives at docs.duckstring.com:

There are future plans for a hosted Catchment service at duckstring.com. If you're interested, please get in touch.

License

Apache 2.0

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

duckstring-0.2.0.tar.gz (414.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

duckstring-0.2.0-py3-none-any.whl (413.7 kB view details)

Uploaded Python 3

File details

Details for the file duckstring-0.2.0.tar.gz.

File metadata

  • Download URL: duckstring-0.2.0.tar.gz
  • Upload date:
  • Size: 414.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for duckstring-0.2.0.tar.gz
Algorithm Hash digest
SHA256 19dbcb580f899abfa3dfe946bd49b1b021b07553a44dc2a5511241bd4e61bd92
MD5 b6fc2161712c76d103c7fb52aec06fef
BLAKE2b-256 9e380f9363ec2a3ec79a771f255bdaf7118f84589908d00446a9c5893bcb8a39

See more details on using hashes here.

Provenance

The following attestation bundles were made for duckstring-0.2.0.tar.gz:

Publisher: release.yml on duckstring-dev/duckstring

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file duckstring-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: duckstring-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 413.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for duckstring-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e455b69029035abccff4229c0047e695d760d63ab39076fc221e3a4ab2ab68b5
MD5 67f668a2926b71c99f409c911c9a2ad0
BLAKE2b-256 3a6ab76a083d4cad232fa519a2197e18f343fb0e9ef76b04dfce43bba0acf493

See more details on using hashes here.

Provenance

The following attestation bundles were made for duckstring-0.2.0-py3-none-any.whl:

Publisher: release.yml on duckstring-dev/duckstring

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page