Skip to main content

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 variables with {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, or continue
  • 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

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:

  1. Pipeline Definition
  2. Runtime Expansion
  3. 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:

  1. Maintain backward compatibility with current Piply YAML structure.

  2. Introduce a new optional "entities" section at:

  • global level
  • pipeline level
  • task level
  1. Tasks should behave as reusable templates instead of static runtime tasks.

  2. Runtime engine should:

  • expand tasks dynamically
  • resolve dependencies
  • build DAG internally
  • support parallel execution
  • support retries/checkpoints
  • support context propagation
  1. Existing task types must continue working:
  • python
  • cli
  • api
  • webhook
  • email
  • ssh
  1. Preserve existing dependency syntax:

depends_on: [extract]

but internally map runtime dependencies as:

payment.extract -> payment.load

  1. Support variable interpolation:

command: python extract.py --report {report}

kwargs: report: "{report}"

  1. 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]
  1. Runtime DAG generated internally:

payment.extract payment.transform payment.validate

adjustment.extract adjustment.transform adjustment.validate

refund.extract refund.transform refund.validate

  1. Framework architecture should include:
  • YAML parser
  • entity expander
  • DAG builder
  • dependency resolver
  • execution engine
  • retry manager
  • context manager
  • logging/observability layer
  1. Recommend best internal architecture using:
  • Python
  • Pydantic
  • AsyncIO/Celery
  • NetworkX
  • plugin-based task executors
  1. 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
  1. Suggest best practices for:
  • runtime task naming
  • execution tracking
  • retry semantics
  • state management
  • lineage tracking
  • observability
  • DAG visualization
  1. 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

mr_piply-0.1.4.tar.gz (102.8 kB view details)

Uploaded Source

Built Distribution

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

mr_piply-0.1.4-py3-none-any.whl (113.2 kB view details)

Uploaded Python 3

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

Hashes for mr_piply-0.1.4.tar.gz
Algorithm Hash digest
SHA256 0be108b68261d0551a633e652bb5be289658c3a3de31b032ab74bbd1cdce1171
MD5 6027229f09c02b68e4fc018f503ca2a3
BLAKE2b-256 cca44c11ff64f53dc5909fda30c4558a8e23ab1db376fd8559f42982a49c7ec0

See more details on using hashes here.

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

Hashes for mr_piply-0.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 90d9611025cc2e84417e34e9a13a7606f09325833d91035212c4141f284a23a8
MD5 2699da6a287f6d836504605bc8ca69e3
BLAKE2b-256 515efd76be52b7349f5cb24f2b130b0b230990e7f83253da7c8dbbabd975219f

See more details on using hashes here.

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