Lightweight Python workflow orchestration platform
Project description
Piply
Piply is a lightweight Python pipeline framework for teams that want script orchestration, schedules, retries, logs, sensors, and a usable operations UI without adopting a heavy orchestration stack.
It is intentionally small:
- YAML-first pipeline definitions
- local execution with dependency-aware DAG scheduling
- SQLite for runs, logs, task outputs, queue state, sensors, and pause overrides
- FastAPI + server-rendered UI
- no Redis, Celery, Prefect, Airflow, or external queue required
What You Get
- Multi-task pipelines with
depends_on - Sequential or parallel execution inferred from the DAG
- Python script and Python callable tasks
- CLI, API, webhook, email, and SSH task types
- Task output passing with
context["task_id"] - Pipeline-to-pipeline JSON output passing
- Per-task upstream failure behavior:
skip,fail, orcontinue - Schedule backfill through an internal SQLite queue
- File, SQL, and API sensors
- Reusable SQL connections and explicit secret references
- Retries, resume-from-failure, cancellation, and logs
- Queue and local worker metrics
- Dashboard, Pipelines, Execution Matrix, Logs, Settings, and run detail pages
Quick Start
pip install -e .
copy .env.example .env
piply validate --config piply-demo/piply.yaml
piply start --config piply-demo/piply.yaml
Open http://127.0.0.1:8000.
Create a starter project:
piply init my-piply-project
piply validate --config my-piply-project/piply.yaml
piply start --config my-piply-project/piply.yaml
The generated starter includes a runnable extract_flow -> report_flow chain plus disabled reference pipelines for optional operators and sensors.
Example YAML
version: "1"
title: Piply Workspace
workspace: .
secrets:
backend: env
prefix: PIPLY_SECRET_
connections:
app_db: sqlite:///sensor_demo.db
pipelines:
extract_flow:
schedule:
every: 15m
retry:
attempts: 2
mode: resume
delay_seconds: 10
max_parallel_tasks: 2
triggers_on_success:
- report_flow
sensors:
inbound_rows:
type: sql_sensor
connection_ref: app_db
table: inbound_events
cursor_column: id
tasks:
extract:
type: python
path: pipelines/extract.py
function: extract_data
kwargs:
records: 120
transform:
type: python
path: pipelines/extract.py
function: transform_data
depends_on: [extract]
validate:
type: cli
command: python -c "print('validated')"
depends_on: [transform]
publish_manifest:
type: cli
command: python -c "print('published')"
depends_on: [transform]
on_upstream_failure: skip
report_flow:
tasks:
build_report:
type: python
path: pipelines/report.py
function: build_report
Python callable tasks can consume upstream outputs:
def transform_data(context):
extracted = context["extract"]
return {"records": extracted["records"] + 1}
When extract_flow triggers report_flow, JSON outputs are also passed into the downstream context.
CLI
piply init
piply validate --config piply-demo/piply.yaml
piply list --config piply-demo/piply.yaml
piply run extract_flow --config piply-demo/piply.yaml --wait
piply tasks list extract_flow --config piply-demo/piply.yaml
piply tasks run extract_flow publish_manifest --config piply-demo/piply.yaml
piply tasks retry <run_id> <task_id> --mode resume --config piply-demo/piply.yaml
piply runs --config piply-demo/piply.yaml
piply logs <run_id> --config piply-demo/piply.yaml
piply pause extract_flow --config piply-demo/piply.yaml
piply resume extract_flow --config piply-demo/piply.yaml
piply start --config piply-demo/piply.yaml
piply stop --config piply-demo/piply.yaml
API Highlights
GET /api/dashboardGET /api/pipelinesGET /api/pipelines/{pipeline_id}POST /api/pipelines/{pipeline_id}/runPOST /api/pipelines/{pipeline_id}/tasks/{task_id}/runPOST /api/pipelines/{pipeline_id}/chain/{target_pipeline_id}GET /api/runsGET /api/runs/{run_id}GET /api/runs/{run_id}/tasks/{task_id}GET /api/runs/{run_id}/tasks/{task_id}/outputPOST /api/runs/{run_id}/retryPOST /api/runs/{run_id}/tasks/{task_id}/retryGET /api/metricsGET /api/execution-matrixGET /api/logs
Runtime Model
Piply runs locally and keeps state in SQLite. The scheduler materializes due schedules and sensor events into an internal queue, then dispatches work with per-pipeline backpressure. The engine executes tasks through lightweight local workers and records task runs, logs, output metadata, retries, lineage, and parent/child pipeline relationships. CLI --wait runs complete downstream pipeline triggers inline so chained smoke tests finish deterministically.
Roadmap
Planned features:
piply logs --follow- reusable task templates / profiles
- plugin hooks for custom operators
- UI controls for editing pipeline definitions safely
- artifact retention policies for large outputs
- optional distributed runner while keeping local mode as the default
More Docs
wiki/USAGE_GUIDE.mdwiki/README.mdwiki/UI_API_GUIDE.mdwiki/IMPLEMENTATION_SUMMARY.md
Project details
Release history Release notifications | RSS feed
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 mr_piply-0.1.3.tar.gz.
File metadata
- Download URL: mr_piply-0.1.3.tar.gz
- Upload date:
- Size: 99.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
345a3de9adad03f01a9970e825ee9491f24062e59a43a998509a8503f01c673f
|
|
| MD5 |
a2ecb720704b1b27111c243b54830fb2
|
|
| BLAKE2b-256 |
9e809ac68c98ed0c65722de4b95f3dfc6974e60a2d6cc7555055d93be8a49777
|
File details
Details for the file mr_piply-0.1.3-py3-none-any.whl.
File metadata
- Download URL: mr_piply-0.1.3-py3-none-any.whl
- Upload date:
- Size: 110.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fcd97e691a2b97a45fd199e9a6e1bae632e572284231ec044c3bfdbcec2f7d52
|
|
| MD5 |
090294ca5a7c09ae1a8169f68b0ea69e
|
|
| BLAKE2b-256 |
6b273e466f36d9a3ffac38bf3c968de7fb84fabd46b9a5f809cf88d7468b580f
|