The pipeline that writes this blog Russell Jones's blog now runs a fully automated GitHub Actions workflow, Content Autopilot, that mines project activity, uses Claude Code headless in CI to curate and write Hugo posts, and publishes them without human review. The pipeline throttles based on Buffer queue capacity, enforces a strict curation gate, and verifies any code snippets against the real source before publishing. Ahnii This post is a little unusual: it was drafted by the same pipeline it describes. This blog runs a GitHub Actions workflow, Content Autopilot https://github.com/jonesrussell/blog/blob/main/.github/workflows/content-autopilot.yml , that mines project activity, curates it with Claude Code https://claude.com/product/claude-code running headless in CI, writes a Hugo post, and publishes it to main without a human in the loop. This post covers how the throttle, the curation gate, and the publish flow fit together. Zero-touch pipelines need a rate limiter or they'll flood every channel the moment there's something to say. Instead of a fixed schedule, this one throttles on distribution capacity: Buffer's free tier caps a channel at 10 scheduled posts, so scripts/buffer-queue-depth.mjs checks each channel's queue depth before anything else runs. js const CAP = Number process.argv 2 || 9 ; // ... const near = hasNext || count = CAP; if near atCap = true; If any channel is at or near the cap, the script exits non-zero and the workflow stops before spending a single Claude token. Quiet weeks produce less; weeks where Buffer drains fast produce more. The queue itself decides the pace. Once there's room to publish, the workflow pulls open stage:mined issues from a separate tracking repo — one issue per interesting thing that happened across other projects. Not every mined item is worth a post. A lot of them are per-directory scaffolding noise. Rather than hand-curate, the workflow hands the candidate list to Claude with an explicit bar to clear: STEP 1 - CURATE be ruthless . Pick AT MOST ONE candidate that would make a genuinely useful, self-contained post a reader would value. Reject thin per-directory dev-scaffolding items e.g. "packages/field work" . If NOTHING clears that bar, write {"status":"NONE","reason":"..."} to autopilot-result.json and STOP. If nothing qualifies, the run ends with no post and no distribution. The gate is "good enough to publish," not "something to publish" — a distinction that matters once nobody is reading the draft before it goes live. The riskiest part of an unsupervised pipeline is a model confidently inventing a function signature or a config flag that doesn't exist. The prompt closes that door explicitly: STEP 2 - VERIFY. If the post would contain code, config, or interface signatures, verify each against the real source repo using: gh api repos/