Skip to main content

plumber

A geospatial data-engineering pipeline framework. A stable function-shaped phase interface (run(gdf, **params) -> gdf) separates three concerns that are usually tangled: what an algorithm does, how phases are sequenced and scaled, and how a pipeline is specified. That separation is meant to make both prototyping→production scaling and safe agentic pipeline generation tractable — new logic drops into a fixed slot instead of modifying a monolith.

Status

Phase 3 (Tracer). run, check, localmp, checkpoints and partial runs work. See issue #1 for the wayfinder map and plan.md for the design.

Install

Plumber must be installed in the same Python environment as the code your pipeline imports. Your shims import your project, so a global pipx install will not work.

Plumber is not a dependency of your project. Do not add it to your project's pyproject.toml. Install it into the environment after the fact.

Use plumber (from PyPI)

Activate the environment your project already runs in, then install plumber into it. Pick the tool you like:

# pip
pip install ab-plumber

# uv (pass the venv, so uv does not pick another Python)
uv pip install --python .venv/bin/python ab-plumber

# conda
conda install pip && pip install ab-plumber

Check it: plumber --help.

Develop plumber (editable install)

Editable means the environment points at the source, so your edits show up with no reinstall. Activate your project's environment first, then pick one.

pip can install straight from GitHub. No manual clone. pip clones the repo for you into <venv>/src/ab-plumber, and that folder is a normal git clone you can edit and commit from:

pip install -e "git+https://github.com/austinbreunig/plumber@develop#egg=ab-plumber"

uv cannot. uv pip install -e only takes a local folder, so clone first:

git clone https://github.com/austinbreunig/plumber
uv pip install --python .venv/bin/python -e ./plumber

(With pip you can also clone first and run pip install -e ./plumber.)

To work on plumber itself (tests, lint), pick one:

# uv
uv run --extra dev pytest -q
uv run --extra dev ruff check .

# pip
pip install -e ".[dev]" && pytest -q && ruff check .

# Nix (adds Python, uv and system libraries for you)
nix develop --command uv run --extra dev pytest -q
nix develop --command uv run --extra dev ruff check .

Notes

  • Nix is optional. Use it only if your project has a flake.nix. On Nix, run the commands above inside nix develop, and always pass --python <venv>/bin/python to uv pip.
  • uv sync removes packages that are not in your lockfile, including plumber. Keep plumber in its own venv (for example .venv-plumber), or run uv sync --inexact.

Quickstart

First install plumber. Then, in any repo, write your input function, one or more phases, and an output function. A phase is run(gdf, **params) -> gdf. Put pipeline glue (input, output, shims) in a .plumber/ folder, or in the project folder. Then add a plumber.yaml:

input:
  path: myio:load_roads
  params: {path: data/roads.parquet}
phases:
  - path: phases.buffer:run
    partitionable: true
    params: {distance: 10}
output:
  path: myio:write_parquet
  params: {path: out/roads.parquet}

Check it, then run it:

plumber check                  # PASS/WARN/FAIL per phase, also writes report.json
plumber run                    # one process (local)
plumber run --strategy localmp --worker-count 4   # worker processes, same output

Optional: checkpoint: true on a slow phase saves its output, and plumber run --from <phase> --to <phase> runs a slice.

Execution strategy

Default is local (one process). Switch to localmp (worker processes) with no phase changes:

execution:
  strategy: localmp
  partition:            # pick exactly one
    by: [zone_id]       # one piece per unique value combination
    # chunk_size: 10000 # fixed-size row slices, in order
    # worker_count: 8   # N roughly equal slices

CLI flags override the config: --strategy localmp, --by zone_id, --chunk-size 10000, --worker-count 8. Any partition flag replaces the config's whole partition: block. A phase with partitionable: false gets the joined data once. The output keeps the input's row order, and the output function runs once on the joined data.

Wrapping your own function

See docs/adapter-shim.md.

Development workflow

Follows the ab_spatial playbook: Discovery → POC → Tracer → MVP → Refinement. See ../../playbook/phases.md.

Issue tracker

GitHub Issues in austinbreunig/plumber, via the gh CLI. See docs/agents/issue-tracker.md.

Metadata

Release files for ab-plumber 0.1.1

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

Source distribution (sdist)

Source distribution for ab-plumber 0.1.1
File Size Uploaded Provenance
ab_plumber-0.1.1.tar.gz 161.1 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for ab-plumber 0.1.1
File Interpreter ABI Platform
ab_plumber-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 179.0 kB

Release files / ab_plumber-0.1.1.tar.gz

Download URL ab_plumber-0.1.1.tar.gz
Size 161.1 kB
Tags Source
SHA-256 checksum
How to use checksums
bbb18880a2e2b0f686019c974e65e33b1dd477d128ec1a84441cd9d857ea6704
BLAKE2b-256 checksum
How to use checksums
b39c15dabd96b55a6d5a531663ac15c148987a39950514fa556cd50ed9c560db
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 14, 2026.

Transparency log

Release files / ab_plumber-0.1.1-py3-none-any.whl

Download URL ab_plumber-0.1.1-py3-none-any.whl
Size 17.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
becd70bfec2b4aac6d6432c30005a6449e0c7c079a9f51f3dc40f9575fa93728
BLAKE2b-256 checksum
How to use checksums
f22efe74e82f27b77a953f9e918953ed93d45a84e7ae8af31892205c99621a5d
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 14, 2026.

Transparency log

Security for ab-plumber 0.1.1

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 ab_plumber-0.1.1.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 14, 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.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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