Lightweight Python workflow orchestration platform
Project description
Piply
Piply is a lightweight Python pipeline framework for teams that want YAML-defined workflows, schedules, retries, logs, sensors, and an operations UI without running a heavy orchestration stack.
It stays small on purpose:
- local dependency-aware DAG execution
- SQLite for runs, logs, task outputs, queue state, sensors, and pause overrides
- FastAPI plus server-rendered UI
- no Redis, Celery, Airflow, Prefect, or external queue required
Features
- Multi-task pipelines with
depends_on - Python script, Python callable, CLI, API, webhook, email, and SSH tasks
- Reusable YAML
variableswith{name}interpolation .env, environment variables, explicit secrets, and reusable SQL connections- Task output passing through
context["task_id"] - Pipeline-to-pipeline output and tenant context passing
- Per-task upstream failure behavior:
skip,fail, orcontinue - Schedules, sensors, retries, cancellation, reruns, and searchable logs
- 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 workspace:
piply init my-piply-project
piply run extract_flow --config my-piply-project/piply.yaml --wait
Minimal YAML
version: "1"
title: Piply Workspace
workspace: .
variables:
scripts_dir: pipelines
batch_id: demo-batch
connections:
app_db: sqlite:///sensor_demo.db
pipelines:
extract_flow:
schedule:
every: 15m
retry:
attempts: 2
mode: resume
delay_seconds: 10
triggers_on_success:
- report_flow
tasks:
extract:
type: python
path: "{scripts_dir}/extract.py"
function: extract_data
transform:
type: python
path: "{scripts_dir}/extract.py"
function: transform_data
depends_on: [extract]
validate:
type: cli
command: python {scripts_dir}/validate_cli.py {batch_id}
cwd: .
depends_on: [transform]
report_flow:
tasks:
build_report:
type: python
path: "{scripts_dir}/report.py"
function: build_report
Python callable tasks can consume upstream outputs:
def transform_data(context):
extracted = context["extract"]
return {"records": extracted["records"] + 1}
For Bash-specific CLI commands, set shell: bash:
tasks:
load_env_and_run:
type: cli
shell: bash
command: set -a && source .env && set +a && conda run -n py312_extract python {scripts_dir}/job.py
cwd: .
Common CLI
piply init my-piply-project
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 run extract_flow --tenant acme --param batch=2026-05-26 --config piply-demo/piply.yaml
piply tasks list extract_flow --config piply-demo/piply.yaml
piply tasks run extract_flow validate --tenant acme --param region=west --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
Docs
- Usage Guide: detailed YAML examples,
.env, multi-tenant runs, sensors, and every CLI command - Wiki Overview: architecture and feature summary
- UI And API Guide: screens, actions, and API examples
- Implementation Summary: runtime modules and verification expectations
Roadmap
Planned features:
piply logs --follow- plugin hooks for custom operators and sensors
- managed external secret backends
- richer queue, worker, and artifact metrics
- UI-safe pipeline editing
- reusable task templates / profiles
- optional distributed runner while keeping local mode as the default
- Design and implement a metadata-driven dynamic pipeline orchestration framework inspired by Airflow/Prefect concepts while keeping compatibility with the existing Piply YAML structure.
The framework must support 3 clear layers:
- Pipeline Definition
- Runtime Expansion
- Execution Engine
Goal: Allow reusable task templates to dynamically generate runtime tasks based on entity values.
Example Runtime Expansion: Given:
entities: report: - payment - adjustment - refund
and tasks:
extract -> load
the engine should dynamically generate:
payment.extract -> payment.load adjustment.extract -> adjustment.load refund.extract -> refund.load
Requirements:
-
Maintain backward compatibility with current Piply YAML structure.
-
Introduce a new optional "entities" section at:
- global level
- pipeline level
- task level
-
Tasks should behave as reusable templates instead of static runtime tasks.
-
Runtime engine should:
- expand tasks dynamically
- resolve dependencies
- build DAG internally
- support parallel execution
- support retries/checkpoints
- support context propagation
- Existing task types must continue working:
- python
- cli
- api
- webhook
- ssh
- Preserve existing dependency syntax:
depends_on: [extract]
but internally map runtime dependencies as:
payment.extract -> payment.load
- Support variable interpolation:
command: python extract.py --report {report}
kwargs: report: "{report}"
- Proposed enhanced YAML design:
pipelines: extract_flow:
entities:
report:
- payment
- adjustment
- refund
tasks:
extract:
type: python
path: pipelines/extract.py
function: extract_data
kwargs:
report: "{report}"
transform:
type: python
path: pipelines/extract.py
function: transform_data
depends_on: [extract]
validate:
type: cli
command: python validate.py --report {report}
depends_on: [transform]
- Runtime DAG generated internally:
payment.extract payment.transform payment.validate
adjustment.extract adjustment.transform adjustment.validate
refund.extract refund.transform refund.validate
- Framework architecture should include:
- YAML parser
- entity expander
- DAG builder
- dependency resolver
- execution engine
- retry manager
- context manager
- logging/observability layer
- Recommend best internal architecture using:
- Python
- Pydantic
- AsyncIO/Celery
- NetworkX
- plugin-based task executors
- Design should be scalable for future support of:
- matrix expansion
- tenant-based execution
- dynamic branching
- conditional tasks
- task groups
- distributed execution
- Airflow/Prefect style dynamic task mapping
- Suggest best practices for:
- runtime task naming
- execution tracking
- retry semantics
- state management
- lineage tracking
- observability
- DAG visualization
- Recommend enterprise-grade folder structure and class design for implementation.
The solution should prioritize:
- scalability
- clean architecture
- metadata-driven execution
- extensibility
- maintainability
- backward compatibility
- minimal YAML complexity
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
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.4.tar.gz.
File metadata
- Download URL: mr_piply-0.1.4.tar.gz
- Upload date:
- Size: 102.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 |
0be108b68261d0551a633e652bb5be289658c3a3de31b032ab74bbd1cdce1171
|
|
| MD5 |
6027229f09c02b68e4fc018f503ca2a3
|
|
| BLAKE2b-256 |
cca44c11ff64f53dc5909fda30c4558a8e23ab1db376fd8559f42982a49c7ec0
|
File details
Details for the file mr_piply-0.1.4-py3-none-any.whl.
File metadata
- Download URL: mr_piply-0.1.4-py3-none-any.whl
- Upload date:
- Size: 113.2 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 |
90d9611025cc2e84417e34e9a13a7606f09325833d91035212c4141f284a23a8
|
|
| MD5 |
2699da6a287f6d836504605bc8ca69e3
|
|
| BLAKE2b-256 |
515efd76be52b7349f5cb24f2b130b0b230990e7f83253da7c8dbbabd975219f
|