{"slug": "show-hn-local-automation-runner-with-built-in-llm-steps-yaml-pipelines", "title": "Show HN: Local automation runner with built-in LLM steps – YAML pipelines", "summary": "Stepyard, a new open-source automation runner, lets developers define YAML pipelines with built-in LLM steps and Python plugins, running entirely on local machines without cloud dependencies. The tool supports scheduled and on-demand execution, with state stored locally in SQLite, and aims to simplify CI/CD and automation workflows.", "body_md": "# Stepyard[¶](#stepyard)\n\n**YAML pipelines. Python plugins. Runs on your machine - no server to set up, no cloud account needed.**\n\nStepyard is an automation runner for developers. Pipelines live as YAML files in your repo. You extend them with plain Python functions. Everything runs from the CLI or a local daemon - on your machine or a server you own.\n\n```\npip install stepyard\nstepyard init my-project && cd my-project\nstepyard run hello\n```\n\nA deploy pipeline: build and push a container, run a smoke test, and post the result to Slack. One YAML file, no supporting scripts.\n\n```\nname: deploy\ndescription: Build, push, and verify the production container.\n\nsteps:\n  - id: build\n    uses: shell.run\n    with:\n      command: docker build -t myapp:${{ env.GIT_SHA }} .\n\n  - id: push\n    uses: shell.run\n    with:\n      command: docker push myapp:${{ env.GIT_SHA }}\n\n  - id: smoke_test\n    uses: http.request\n    with:\n      url: https://staging.myapp.com/healthz\n      method: GET\n\n  - id: notify\n    uses: llm.generate               # built-in - no plugin needed\n    with:\n      model: gpt-4o-mini\n      prompt: |\n        Summarise this deploy result in one sentence for Slack:\n        HTTP status: ${{ steps.smoke_test.output.status }}\n        SHA: ${{ env.GIT_SHA }}\n\n  - id: post_to_slack\n    uses: http.request\n    with:\n      url: ${{ env.SLACK_WEBHOOK }}\n      method: POST\n      json_body:\n        text: ${{ steps.notify.output.output }}\n```\n\nRun it:\n\n```\nGIT_SHA=$(git rev-parse --short HEAD) stepyard run deploy\n✓  build          12.4 s\n✓  push            4.1 s\n✓  smoke_test      0.3 s\n✓  notify          0.9 s\n✓  post_to_slack   0.2 s\n\nFlow completed in 18.0 s\n```\n\n## Why Stepyard?[¶](#why-stepyard)\n\n-\n**Flows are files in your repo** Steps, conditions, loops, and retries are plain YAML keys - no proprietary DSL. Version-control them alongside your code and validate them with\n\n`stepyard validate`\n\n. -\n**Extend with plain Python** One\n\n`@node`\n\ndecorator turns any function into a reusable step. Inputs are type-validated automatically; plugin dependencies are isolated so they never conflict with Stepyard's own. -\n**Nothing leaves your machine** State is stored in a local SQLite database. Data goes out only if a step in your flow explicitly sends it.\n\n-\n**Scheduled and on-demand execution**`cron`\n\n,`interval`\n\n, and`startup`\n\ntriggers. Run`stepyard service start`\n\nand your flows execute on schedule - no external service or cloud account needed.\n\n## Real-world examples[¶](#real-world-examples)\n\n### Daily database backup[¶](#daily-database-backup)\n\n```\nname: pg_backup\ntrigger:\n  uses: cron\n  with:\n    schedule: \"0 3 * * *\"   # every day at 03:00\n\nsteps:\n  - id: dump\n    uses: shell.run\n    with:\n      command: pg_dump ${{ env.DATABASE_URL }} | gzip > /tmp/backup.sql.gz\n\n  - id: upload\n    uses: shell.run\n    with:\n      command: |\n        aws s3 cp /tmp/backup.sql.gz \\\n          s3://${{ env.BACKUP_BUCKET }}/db/$(date +%Y-%m-%d).sql.gz\n\n  - id: cleanup\n    uses: shell.run\n    with:\n      command: rm -f /tmp/backup.sql.gz\n```\n\n### Automated code review on every PR[¶](#automated-code-review-on-every-pr)\n\nFetch the diff via the GitHub API, review it with an LLM, and post a comment back - all with built-in nodes, no additional service.\n\n```\nname: pr_review\ndescription: Review a PR diff with an LLM and post a comment if issues are found.\n# Run: PR=42 GITHUB_REPO=my-org/my-repo stepyard run pr_review\n\nsteps:\n  - id: diff\n    uses: http.request\n    with:\n      url: https://api.github.com/repos/${{ env.GITHUB_REPO }}/pulls/${{ env.PR }}/files\n      headers:\n        Authorization: Bearer ${{ env.GITHUB_TOKEN }}\n        Accept: application/vnd.github+json\n\n  - id: review\n    uses: llm.generate\n    with:\n      model: gpt-4o\n      system_prompt: |\n        You are a senior engineer doing a code review.\n        Be concise. If everything looks good reply with exactly: LGTM\n      prompt: |\n        Review this pull request for bugs, security issues, and obvious mistakes:\n\n        ${{ steps.diff.output.body }}\n\n  - id: post_comment\n    if: ${{ steps.review.output.output != \"LGTM\" }}\n    uses: http.request\n    with:\n      url: https://api.github.com/repos/${{ env.GITHUB_REPO }}/issues/${{ env.PR }}/comments\n      method: POST\n      headers:\n        Authorization: Bearer ${{ env.GITHUB_TOKEN }}\n        Accept: application/vnd.github+json\n      json_body:\n        body: ${{ steps.review.output.output }}\n```\n\n### Multi-environment deployment with rollback[¶](#multi-environment-deployment-with-rollback)\n\n```\nname: deploy_multi\n\nsteps:\n  - id: deploy_staging\n    uses: shell.run\n    with:\n      command: kubectl apply -f k8s/staging/\n\n  - id: integration_tests\n    uses: shell.run\n    continue_on_error: true\n    with:\n      command: pytest tests/integration/ -q\n\n  - id: deploy_production\n    if: ${{ steps.integration_tests.output.code == 0 }}\n    uses: shell.run\n    with:\n      command: kubectl apply -f k8s/production/\n\n  - id: rollback\n    if: ${{ steps.integration_tests.output.code != 0 }}\n    uses: shell.run\n    with:\n      command: kubectl rollout undo deployment/myapp -n staging\n```\n\n## Documentation overview[¶](#documentation-overview)\n\n| Section | What you'll find |\n|---|---|\n|\n\n[Core Concepts](concepts/)[How-to Guides](how-to/)[Built-in Nodes](nodes/builtin/)[Plugin Development](plugins/creating/)[CLI Reference](cli/reference/)## Compatibility[¶](#compatibility)\n\n| Python | 3.10 · 3.11 · 3.12 · 3.13 |\n| OS | macOS · Linux · Windows (WSL) |\n| Storage | SQLite (default) |\n| License | MIT |", "url": "https://wpnews.pro/news/show-hn-local-automation-runner-with-built-in-llm-steps-yaml-pipelines", "canonical_source": "https://rorlikowski.github.io/stepyard/", "published_at": "2026-06-20 09:21:46+00:00", "updated_at": "2026-06-20 09:37:31.622545+00:00", "lang": "en", "topics": ["developer-tools", "large-language-models", "generative-ai"], "entities": ["Stepyard", "GPT-4o-mini", "GPT-4o", "Slack", "GitHub", "AWS S3", "SQLite"], "alternates": {"html": "https://wpnews.pro/news/show-hn-local-automation-runner-with-built-in-llm-steps-yaml-pipelines", "markdown": "https://wpnews.pro/news/show-hn-local-automation-runner-with-built-in-llm-steps-yaml-pipelines.md", "text": "https://wpnews.pro/news/show-hn-local-automation-runner-with-built-in-llm-steps-yaml-pipelines.txt", "jsonld": "https://wpnews.pro/news/show-hn-local-automation-runner-with-built-in-llm-steps-yaml-pipelines.jsonld"}}