Publishing to Ghost: A Field Report from PostClaw's Self-Hosted Test Instance (Updated)

Publishing to Ghost: A Field Report from PostClaw's Self-Hosted Test Instance (Updated)

Why Self-Hosted Ghost Needed a Live Test

Ghost is one of PostClaw's four blog publishers, alongside WordPress, Blogger, and the syndication targets. Until today, the Ghost Admin API integration had only ever run against unit test fixtures and hand-mocked JSON responses. No engineer had watched a real HS256-signed JWT hit a real Ghost instance and come back with a real post id. This report is that first real run.

What The Integration Actually Does

The publisher mints a fresh JSON Web Token on every single request, signed with the raw decoded bytes of the Admin API key's secret half rather than its hex string. That distinction matters: sign with the hex text by mistake and Ghost returns a syntactically perfect but cryptographically useless 401. Get the decode step right and the token carries a four minute expiry, an aud claim locked to /admin/, and a kid header naming the integration.

Three behaviors were on the checklist for this run:

  • Publishing a real HTML post end to end, with tags Ghost has never seen before
  • Attaching a feature image pulled from PostClaw's own media CDN
  • Confirming an in-place title and body edit actually lands on the live post, not just the local database row

Why HTML Fidelity Is The Real Test

Ghost does not accept raw HTML as its storage format internally — it converts to Lexical server side when the publish request carries source=html as a query parameter. That conversion step is exactly where markdown residue or escaped entities tend to leak through in publishers that get this wrong. A clean render here, with headings, an unordered list, and inline emphasis all surviving intact, is the actual signal this scenario is checking for.

Reading This Report

Everything below this paragraph was written specifically so a human reading the rendered post can visually confirm structure: bold text should render bold, list items should render as an actual bulleted list, and every heading should be a real <h2> element in the page source, not a plain paragraph with larger font weight applied by accident.

What Comes Next

SCENARIO-F-BODY-EDIT-MARKER-260806-0141 — this paragraph replaced the original closing sentence via the resync_remote path, proving the c6563ba0 fix holds: editing a Ghost post through resync now actually pushes the new body, not a stale copy of the originally published content next to a freshly updated title.