A cron that finds drafts whose scheduled date has arrived, lands any hero images still in flight, runs the publish gate, and for anything that passes flips the status, announces the change to the engines, updates the universe row to published with its live URL, upserts the target keyword into daily rank tracking and sends the published-post email. Held posts get the reason written to the row and recorded in the ledger.
Also called: publish on schedule · auto publish · post goes live on its date
- 1In-flight heroes are collected first, because a post held last time for a missing image is often publishable the moment the picture lands.
- 2Up to five due drafts are processed per pass, oldest scheduled date first.
- 3A missing hero is the one blocker the route acts on — it starts the image and moves on rather than waiting.
- 4Passing posts are published, and blogUrlsFor() announces both the post URL and the blog index, since both changed.
- 5The universe row flips to published with target_url set, and the keyword is upserted into seo_keywords so rank checks start next morning.
- 6The ledger row stores { status: draft, published_at: null } as the rollback source.
The header names the dead code path it revived: "scheduled_for has existed since the seasonal planner shipped: the planner writes it, the calendar renders it, and nothing ever read it back. A finished post with a hero, scheduled for a Tuesday, sat as a draft forever, because publishing only ever happened when a human clicked the button." The downstream equivalence is deliberate: "a post published by the machine is indistinguishable downstream from one Keith published himself."
- Scheduled dates were written and never read, so nothing published itself.
- A finished post could sit as a draft indefinitely.
- Publishing by hand and by machine did different downstream work.
See it on your own jobs
Twenty minutes, your numbers, no slide deck. We’ll build one of your real buildings in front of you and send you the estimate link at the end — yours to keep either way.
or keep browsing features →