---
title: "Scheduling and publication"
description: "How an approved post reaches a publication slot, what a slot is, and why publication is treated as irreversible."
updated: "2026-08-28"
verifiedAgainst:
  - packages/shared/src/autopilot-full-scheduling.ts
  - packages/shared/src/free-grant.ts
  - apps/web/lib/server/publication-schedule-service.ts
  - packages/shared/src/autopilot-full-publication.ts
  - apps/web/lib/autopilot-plan-schedule.ts
---

Publication is the one action in the pipeline that reaches the public. It is
handled as a separate stage from drafting, with its own gate.

## Slots

A Project's cadence, preferred days, preferred time and timezone describe a
series of publication slots. An approved post takes the next free slot rather
than publishing the moment it is approved, which is what keeps a blog publishing
on a rhythm instead of in bursts.

`Max scheduled posts ahead` limits how deep that queue gets.

## When each post writes and when it publishes

The planned posts on the dashboard carry two separate times, because writing and
publishing are two separate events and the gap between them is often days.

<PropertyList>
  <Property name="Writes from" type="a not before, never an exact minute">
    When Autopilot may start writing that post. It is worded as a starting point
    on purpose: the dispatcher runs on a schedule and takes a limited number of
    due posts each pass, so several posts that come due together are written over
    the following passes rather than all at once. Once the draft exists the row
    says so instead.
  </Property>
  <Property name="Publishes" type="only in Full mode">
    The slot the post is aimed at. In Assisted mode there is no such time to show,
    and the row says the post publishes after your review, which is the honest
    answer rather than a date nobody has chosen yet. A post with no slot resolved
    yet says it is waiting for a free one.
  </Property>
</PropertyList>

<Callout variant="note" title="Both times are in the Project's timezone">
  Not yours. A Project publishing on a European schedule reads the same on a
  screen in Los Angeles, because the times describe the blog's rhythm rather than
  the reader's clock. The timezone is the one set in the Project's Autopilot
  configuration.
</Callout>

The Autopilot page itself shows the same two facts at full length, including the
month and the timezone. The dashboard is the short form of them, not a second
opinion.

## Scheduling a post yourself

Putting a specific post into a future slot by hand is a separate action from
Autopilot filling the queue, and the two are gated differently.

<Callout variant="note" title="Manual scheduling is not included in the Free grant">
  Scheduling a Post for later by hand is a paid-only feature. On a Free Project
  the request is refused with an upgrade prompt rather than a quota message, and
  it says so in those terms: upgrade to schedule Posts for later, and you can
  still publish now.

  Autopilot's own scheduling is not affected. Both automation modes are included
  in the Free grant, so a Free Project in Full mode still takes approved posts to
  publication slots on its cadence. What Free withholds is the manual override,
  not the automation.
</Callout>

## Why the queue matters

A Project that drafts faster than it publishes builds a backlog. That is normal
and usually desirable: it means a bad week of drafting does not create a gap on
the blog. When the backlog reaches the configured depth, drafting pauses until
the queue drains.

## Publication is irreversible in the way that matters

<Callout variant="danger" title="A published post has been seen">
  Unpublishing removes a post from your blog, but it cannot recall a crawler, an
  RSS reader, an email, or a person. Treat publication as one way, which is why
  the approval gates exist before it rather than after.
</Callout>

Publication of a post is recorded once and only once: a post cannot be published
twice by two runs that both thought they were first.

## Unpublishing

A published post can be unpublished from the editor. It leaves your blog and its
URL stops resolving as a post. If you expect people to arrive at that URL, set a
redirect rather than leaving it to 404.
