How to Schedule and Publish Content in EmDash CMS

Scheduling in EmDash looks simple from the admin panel — pick a date, save — but there are two details worth knowing upfront: scheduling has to be explicitly enabled per collection, and Cloudflare Workers deployments need an extra piece of configuration or scheduled posts just never go live.
Table of Contents
- Scheduling Is an Opt-In Collection Feature
- Scheduling From the Admin Panel
- Scheduling via CLI or REST API
- The Cloudflare Workers Gotcha
- Node.js Deployments
- Verifying Scheduling Actually Works After Deploy
- Frequently Asked Questions
- Can I schedule content to unpublish at a future date too?
- What happens if I edit a scheduled post before it publishes?
- Does the AI assistant respect the same scheduling rules?
- Is there a way to see all currently scheduled content at once?
- The Bottom Line
Scheduling Is an Opt-In Collection Feature
Collections declare which features they support, and scheduling is one of them, alongside drafts, revisions, and preview:
{
slug: "posts",
label: "Blog Posts",
labelSingular: "Post",
supports: ["drafts", "revisions", "preview", "scheduling"]
}If a collection was created without `scheduling` in its `supports` array, the scheduling option simply won't be available for that content type in the admin — worth checking first if you don't see a Schedule option where you expect one.
Scheduling From the Admin Panel
- Open the content item you want to schedule.
- Instead of Publish, choose the schedule option and pick a future date and time.
- Save — the item's status becomes scheduled, distinct from draft or published.
It publishes automatically at the specified time with no further action needed — assuming the publish mechanism is actually running, which is the Cloudflare caveat below.
Scheduling via CLI or REST API
npx emdash content schedule posts 01ABC123 --at 2026-08-01T09:00:00ZPOST /_emdash/api/content/posts/01ABC123/schedule
Content-Type: application/json
{ "scheduledAt": "2026-08-01T09:00:00Z" }Both accept an ISO 8601 datetime. Canceling a schedule reverts the item to its prior status without touching the content itself — the CLI equivalent is `npx emdash content unschedule`, or ask the AI assistant to "cancel the schedule on the launch post."
The Cloudflare Workers Gotcha
On Cloudflare Workers, scheduled publishing, plugin cron, and maintenance tasks run from a Worker Cron Trigger. Without the Cron Trigger, content scheduled in the admin panel does not publish on Cloudflare Workers, and plugin cron jobs do not run. Local astro dev still uses the in-process scheduler.
This is a real, easy-to-miss trap: scheduling a post works fine in local dev (which uses an in-process scheduler), so it's easy to assume it'll work the same way in production — and on Cloudflare Workers specifically, it silently won't, unless you've added a Cron Trigger. New Cloudflare templates include this automatically; if you're adding it to an existing project, you need two things:
- Export the EmDash Worker entry so the cron handler exists:
// src/worker.ts
export { default, PluginBridge } from "@emdash-cms/cloudflare/worker";- Add a Cron Trigger to your Wrangler config:
{
"triggers": {
"crons": ["* * * * *"]
}
}That trigger runs every minute, which is the right granularity for scheduled publishing — anything coarser and a post scheduled for a specific minute could sit unpublished for longer than expected.
Node.js Deployments
Node.js deployments don't have this gotcha — the in-process scheduler used in local dev is also what runs in a standard Node.js server deployment, so scheduled content publishes without any additional cron configuration.
Verifying Scheduling Actually Works After Deploy
- Schedule a test post a few minutes in the future.
- Wait for the scheduled time to pass.
- Check whether it actually went live — if it's still showing as "scheduled" past its time on a Cloudflare deployment, the Cron Trigger is the first thing to check.
Frequently Asked Questions
Can I schedule content to unpublish at a future date too?
Scheduling as documented covers publishing a draft at a future time. For unpublishing on a schedule, that's not a documented built-in feature — you'd need a plugin using a `cron` hook to check dates and call `content:afterUnpublish`-equivalent logic yourself.
What happens if I edit a scheduled post before it publishes?
Edits are saved to the draft; the scheduled publish time is unaffected unless you explicitly change or cancel it. The version that goes live at the scheduled time is whatever the draft looks like at that moment.
Does the AI assistant respect the same scheduling rules?
Yes — "Schedule the announcement for June 1st at 9am" and "Cancel the schedule on the launch post" are real, documented MCP-driven commands, subject to the same collection-support and Cloudflare Cron Trigger requirements as scheduling through the admin UI.
Is there a way to see all currently scheduled content at once?
List content filtered by status: `npx emdash content list posts --status scheduled`, or the equivalent REST API call with `?status=scheduled` — useful for an editorial calendar view before it goes live.
The Bottom Line
Scheduling works reliably once two things are true: the collection has `scheduling` in its `supports` array, and — specifically on Cloudflare Workers — a Cron Trigger is configured so the scheduled publish actually fires. Skip either and content silently sits unpublished past its scheduled time with no error to alert you. Test a real scheduled post after any production deploy to confirm both pieces are in place.




Comments