Ghost Writing
Quick Start
compose_post {
"title": "We shipped the editor",
"status": "draft",
"blocks": [
{ "type": "heading", "level": 2, "text": "What changed" },
{ "type": "paragraph", "text": "Prose with **bold** and [links](https://ghost.org)." },
{ "type": "callout", "emoji": "🚀", "color": "green", "text": "Live now" }
]
}
Critical Rules
- Never push raw HTML — compose posts from Koenig blocks via
compose_post. The html block is a last resort when no native block fits.
- Draft first — create with
status: "draft", report the post URL, publish only when asked.
- Long posts use
blockFile — write blocks JSON to an absolute path, validate with compose_lexical, pass the path to compose_post.
- Updates replace the whole body —
compose_post with id needs the current updated_at (via posts.read) and full blocks; keep the blockFile as source of truth when iterating.
- Don't guess block fields — run
koenig_help (list) or koenig_help { "block": "callout" } (fields + example) before composing.
Workflow
- Outline: one goal per post, working title, section list — see writing
- Pick blocks per section: prose vs cards — see blocks
- Compose:
compose_post with inline blocks, or blockFile for long posts
- Review: re-read for rhythm, set excerpt/tags/feature image
- Publish or schedule via
use_ghost_api — see workflows
References
- Blocks — every block type, its purpose, and how to choose between similar ones
- Writing — structure, rhythm, metadata, and voice practices for good posts
- Workflows — tool map and end-to-end recipes: create, edit, publish, newsletter, members-only