Steps run sequentially. Parameters from with are passed to every step. Step-level values override pipe-level.
with:
src: /data/photos
dest: /data/output
steps:
- job: scripts/download.sh
- job: scripts/resize.py
with:
quality: 80
- job: scripts/upload.js
Any language — piperig picks the interpreter by extension..py → python, .sh → bash, .js → node, .ts → npx tsx. No extension → direct exec.
piperig run resize.pipe.yamlOverride anything at runtime: piperig run resize.pipe.yaml quality=95
Use {key} to reference other parameters. Substitution pulls from the full pool — with, each, loop, and CLI overrides.
with:
dest: /data/output
each:
- { label: fullhd, size: 1920x1080 }
- { label: thumb, size: 128x128 }
steps:
- job: scripts/resize.py
with:
output: {dest}/{label}.jpg
Time ranges, numeric ranges, or lists. piperig expands them into individual calls.
loop:
date: -7d..-1d
steps:
- job: scripts/report.py
Combine loop and each — piperig computes the cartesian product.
loop:
date: -3d..-1d
each:
- { size: 1920x1080, label: fullhd }
- { size: 128x128, label: thumb }
steps:
- job: scripts/resize.py
Retries, timeouts, and allow_failure — per step or for the whole pipe.
steps:
- job: scripts/fetch.py
retry: 3
retry_delay: 5s
timeout: 10m
- job: scripts/notify.sh
allow_failure: true
Declare log fields — piperig extracts them from JSON lines your scripts print to stdout.
log:
- label
- file
- size
steps:
- job: scripts/resize.py
Your script prints JSON:
print(json.dumps({"label": "fullhd", "file": "photo.jpg", "size": "1920x1080"}))
Plain text and JSON can be mixed freely. Without log, everything passes through as text.
Control how parameters reach your scripts.
input: json # pipe-level default
steps:
- job: scripts/process.py # json (from pipe)
- job: scripts/deploy.sh
input: args # --key value
- job: scripts/notify.py
input: env # KEY=value (default)
When job points to a .pipe.yaml, piperig runs it as a child pipeline. Parent with overrides child parameters.
steps:
- job: scripts/prepare.sh
- job: pipes/images.pipe.yaml
with:
quality: 90
- job: scripts/cleanup.sh
Run pipes on a cron schedule or fixed interval.
# schedule.yaml
- name: daily-images
cron: "0 5 * * *"
run:
- pipes/daily/
- name: healthcheck
every: 10m
run:
- pipes/healthcheck.pipe.yaml
piperig serve schedule.yamlpiperig run <pipe> [key=value]run a pipepiperig run <directory/>run all pipes in directorypiperig runinteractive pickerpiperig check <pipe> [key=value]preview call planpiperig serve <schedule.yaml>cron schedulerpiperig new pipe <name>scaffold a .pipe.yamlpiperig new schedule <name>scaffold a schedule.yamlpiperig initcreate .piperig.yaml