Editor Guide
Workflow & Publishing
Every page moves through a deterministic set of states. Status is computed live from timestamps — there is no stored status field.
Content states
Draft API: hidden
The default state. Authors iterate freely without touching live content. No published_at date is set.
Review API: hidden
Reviewers validate quality and policy via inline comments. Authors address feedback before moving forward.
Approved API: hidden
Administrative checkpoint before release. Content can be published immediately or scheduled.
Scheduled API: hidden until publish time
published_at is set to a future time. The page becomes visible automatically when that time arrives (checked every minute).
Published API: visible
Live on the API. published_at ≤ now and either unpublish_at is null or in the future.
Scheduling
Set Publish at to schedule a go-live. Set Unpublish at to expire content automatically. A background job processes both every minute.
Scenario: Scheduled publish
- Set
published_atto tomorrow 9am - Status shows "Scheduled"
- API returns 404 until that time
- Job fires, page becomes Published
- API returns 200
Scenario: Auto-unpublish
- Page is live, set
unpublish_at - Status stays "Published" until then
- Job fires at unpublish time
- Status becomes "Unscheduled"
- API returns 404
Scenario: Re-publish
- Page was unpublished
- Update
published_atto now - Next job run publishes it again
- API returns 200
Who can do what
| Action | Editor | Moderator | Site Owner | Admin |
|---|---|---|---|---|
| Create/edit draft | ✓ | ✓ | ✓ | ✓ |
| Submit for review | ✓ | ✓ | ✓ | ✓ |
| Approve | — | ✓ | ✓ | ✓ |
| Publish / schedule | — | ✓ | ✓ | ✓ |
| Force unpublish | — | — | ✓ | ✓ |