pipo. docs

Examples

Runnable pipelines from the repository's examples/ folder. Every one passes pipo check in CI. From a checkout, bun pipo check examples checks them all.

ExampleWhat it does
audio-to-videoA watch input picks up every .mp3 dropped in ./inbox. A transform: exec node runs ffmpeg to loop ./cover.jpg over the track and write ./out/<name>.mp4. The output appends one JSON line per video (exit code, time taken, the file) to ./out/videos.jsonl.
blogA tiny blog. Three inputs feed one pipeline, posts are normalised and tagged in the middle, and one SQLite table holds them. A static site in out/site is rebuilt from that table on every post.
ciCI/CD for a small shop API (app/) in two chained pipelines. ci takes GitHub push events, tests each commit to main and builds green ones. When a commit breaks the tests, Claude Code fixes it in the build's checkout and the fix is pushed to a branch for review. deploy releases green builds to production one at a time. A commit's packet in ci is delivered only when production reports that commit live.
deployReleases the shop API to production, one commit at a time. Green builds come from the ci pipeline (via: pipeline), and the rollback input takes any earlier build by hand. See ../ci/README.md for the whole story.
error-tailFollows logs/app.log, a JSON-lines log, and appends its errors to out/errors.jsonl (docs/spec.md §3.3.2).
heartbeatA schedule input fires every 5 seconds with a fixed payload. A map node adds the tick time, and the output appends one JSON line to ./out/heartbeat.jsonl. A line_contains delivery check confirms each packet's line is in the file.
inbox-forwardA watch input sees new .txt files in ./inbox, reads their content, shapes it with a map node and POSTs it as JSON to the URL in INBOX_URL. Any 2xx status counts as success. Each request carries an Idempotency-Key: <packet_id> header, so a retry after a crash does not duplicate.
people-intakeAccept people from a webhook, normalise them and store them in SQLite.
release-watchAppends each new Bun release to out/releases.jsonl, once, by polling GitHub's releases feed every 30 minutes (docs/spec.md §3.3.2).
signup-intakeTwo inputs feed one pipeline: an http form at /in/signup-intake/form and a nightly schedule import. A map node cleans both the same way and records meta.input, the input each sign-up came through. The output is to: pipeline: every sign-up is handed to signup-store, exactly once, and delivered.check: downstream waits until signup-store has written and verified it.
signup-storeThe other end of the signup-intake chain. A via: pipeline input takes packets only from the pipelines in its from list, and a push input takes manual fixes. Both write one row per email to ./data/signups.db (an upsert on email), and a record_exists check confirms each row landed. from_pipeline is meta.upstream.pipeline: who handed the packet over.
telegram-echoReplies to every message your Telegram bot gets (docs/spec.md §3.13).
ticket-triageAn http input takes support tickets ({subject, body}), an agent node asks Claude for a category, a priority and a one-line summary (checked against triage.schema.json), and the answer is appended to ./out/triaged.jsonl. agent_budget caps the cost: $0.50 a day for this pipeline and 4,000 tokens per ticket, with a warning at 80%.