Skip to main content

Duckstring

Get your ducks in a row.

Duckstring is an open source data engineering platform built on DuckDB. Data into the terabytes fits comfortably on a single machine, which is where DuckDB is at its best, and Duckstring provides what a pipeline needs around it: packaging and versioning, orchestration, incremental processing, a catalog and delivery. It runs the same on a laptop, on a single server, or with work spread across cloud machines.

Documentation · Quickstart · Playground

Versioned transformations

Each set of transformations is a Pond: a Python project whose pond.toml names it, gives it a semantic version and lists the Ponds it reads from.

[pond]
name = "sales"
version = "1.2.0"

[sources]
transactions = "1.0.0"
products = "1.1.0"

The pipeline follows from those declarations, so it never has to be drawn by hand. A breaking change ships as a new major version, which runs alongside the old one while downstream Ponds move across at their own pace.

Pull orchestration

Schedules are set on the Ponds whose output is actually used, at the end of the pipeline. Duckstring works back from there, running each upstream Pond only as often as something downstream needs it, so a path nobody consumes never runs. A daily job is one command:

duckstring trigger tide reports 1d

Incremental processing

A Trickle stores a table's changes as a Z-set: rows weighted +1 when added and -1 when removed. Joins and aggregations written with the Trickle builder recompute only the keys that changed since the last run, and handle updates and deletes correctly across any shape of join:

from duckstring import ripple


@ripple
def priced_line(pond):
    (
        pond.trickle("orders.order_line")
        .join(pond.trickle("catalog.product"), on="product_id")
        .select(
            "s0.order_id, s0.product_id, s0.quantity, s1.unit_price, "
            "CAST(round(s0.quantity * s1.unit_price, 2) AS DECIMAL(14,2)) AS revenue"
        )
        .merge("priced_line", pk="order_id")
    )

Code and data together

The runtime, called the Catchment, is also the catalog. Each major version of a Pond is a schema holding its tables, with lineage, run history and the version's schema contract recorded alongside. Query it from the CLI, from Python, or from any Postgres client:

SELECT * FROM reports_v1.monthly_summary;

Python and the command line

Ripples, the steps inside a Pond, are Python functions with a DuckDB connection, so SQL, DuckDB's relation API, pandas and Arrow all work. Everything a Catchment does can be driven from the duckstring CLI or its HTTP API, and a web UI shows pipelines as they run.

Quickstart

Duckstring needs Python 3.10 or newer.

pip install duckstring
duckstring catchment init --name dev

This starts a local Catchment, with its web UI at http://127.0.0.1:7474. Leave it running, and in a second terminal:

mkdir demo && cd demo
duckstring pond demo                       # transactions, products → sales → reports
duckstring pond deploy --all --yes
duckstring trigger pulse reports           # run the pipeline once, from the end
duckstring query reports monthly_summary

The Quickstart goes through the same steps with explanations.

Also included

Documentation

docs.duckstring.com has the concepts, task guides, and a reference for the CLI, Python API, pond.toml and HTTP API. To try pull orchestration without installing anything, use the Playground.

Status

Duckstring is pre-1.0, so interfaces may still change between minor versions. Changes are listed in the changelog.

Hosted Catchments

A hosted Catchment service is planned at duckstring.com. If you're interested, get in touch at dev@duckstring.com.

License

Apache 2.0

Metadata

Release files for duckstring 0.6.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for duckstring 0.6.0
File Size Uploaded Provenance
duckstring-0.6.0.tar.gz 794.4 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for duckstring 0.6.0
File Interpreter ABI Platform
duckstring-0.6.0-py3-none-any.whl Python 3 none any Details

Total release size: 1.7 MB

Release files / duckstring-0.6.0.tar.gz

Download URL duckstring-0.6.0.tar.gz
Size 794.4 kB
Tags Source
SHA-256 checksum
How to use checksums
790c982883f3ab95fd3d9179e7d547db8e0e08e9a51c31d277521cb3d9d78901
BLAKE2b-256 checksum
How to use checksums
17fc68ce0fe9211b3b219d8c3ac4cc0b4ce9125b96ebfcf6e44e1ea0c70da4d5
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 Oct 4, 2026.

Transparency log

Release files / duckstring-0.6.0-py3-none-any.whl

Download URL duckstring-0.6.0-py3-none-any.whl
Size 902.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0fcb7eb90c9b494921c6b868df48e00a26ad419996683c9a2ca293c6f9786d47
BLAKE2b-256 checksum
How to use checksums
89f8848e16786c1a9098a5ae0fefeba8bb44d87afad5e66157db1f2d7050896e
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 Oct 4, 2026.

Transparency log

Security for duckstring 0.6.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.

Select from 2 files

Attestation for duckstring-0.6.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 Oct 4, 2026.

Transparency log

A 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.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page