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.
| Example | What it does |
|---|---|
| audio-to-video | A 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. |
| blog | A 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. |
| ci | CI/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. |
| deploy | Releases 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-tail | Follows logs/app.log, a JSON-lines log, and appends its errors to out/errors.jsonl (docs/spec.md §3.3.2). |
| heartbeat | A 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-forward | A 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-intake | Accept people from a webhook, normalise them and store them in SQLite. |
| release-watch | Appends 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-intake | Two 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-store | The 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-echo | Replies to every message your Telegram bot gets (docs/spec.md §3.13). |
| ticket-triage | An 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%. |