Guide

What happens to Koenig cards when Specter syncs

By Axel Antas-Bergkvist Published May 10, 2026 Updated May 27, 2026

Ghost stores your posts in a structured editor format. Inside the Koenig editor, the things you drop into a post — image galleries, embeds, bookmarks, callouts, buttons, signup forms — are called cards, and they live in your post as discrete objects rather than plain prose. When you connect Ghost to Specter in the browser, your posts open as clean, editable content, and Specter’s job is to make a faithful projection of each post and carefully translate your edits back on publish. This page is a plain account of how that works, what comes through untouched, and where the edges are.

The two formats Ghost keeps

When Specter pulls a post, it asks Ghost for three versions of the body at once: HTML, mobiledoc, and lexical. Mobiledoc and lexical are Ghost’s own document formats — older blogs tend to use mobiledoc, newer ones lexical — and HTML is the rendered output. Specter reads all three because which one carries the real source of truth depends on how the post was written.

The happy case is a post that was written as markdown to begin with, or whose entire body is a single markdown card. Ghost lets you compose that way, and so does Specter: when it creates or updates a post, it wraps the body in one markdown card. A post like that has its exact markdown sitting right inside the lexical or mobiledoc document, and Specter simply lifts it out. Nothing is converted, nothing is guessed at. It round-trips cleanly, every time.

How a pull becomes editable content

On pull, Specter tries the cleanest source first. It looks inside the lexical document for an embedded markdown card and uses that if it finds one. Failing that, it checks mobiledoc for the same thing. Only if neither contains extractable markdown does it fall back to converting the rendered HTML.

That fallback is where most posts written in Koenig land, and Specter handles it deliberately. It converts the HTML but preserves Ghost’s richer cards as raw HTML rather than mangling them into something lossy. Embed cards, gallery cards, and bookmark cards are passed through verbatim, kept as the original HTML block. A YouTube embed or a bookmark preview survives the trip and renders again correctly when it goes back. Code blocks keep their language hints, and images with captions come through clean with the caption underneath.

So a typical post — prose, headings, images, the occasional embed — comes into your workspace as readable content you can edit, with the fancy bits parked safely as HTML you can leave alone.

How a publish goes back

When you publish a post back to Ghost, Specter takes the body and writes it back as a single markdown card. Crucially, it checks how the existing post was stored first and matches it: a post that used lexical stays lexical, a post that used mobiledoc stays mobiledoc. New posts you create are written as lexical. The point is that Specter doesn’t quietly migrate your post from one Ghost format to another behind your back — it respects what was already there.

Because the raw HTML for embeds and bookmarks travels inside that markdown card, Ghost renders it again. Round prose stays prose; preserved cards stay cards.

Where the round-trip breaks

Here is the part worth being straight about. A post that was heavily authored in the Koenig editor — leaning on callouts, buttons, signup forms, toggles, product cards, or header cards with their own visibility and layout settings — may not round-trip losslessly. Some of those cards, and especially their finer settings, can flatten when a post is represented as plain content and converted back.

This is not a Specter bug, and it isn’t something a clever update will fully erase. It is the nature of moving between a rich structured editor and plain text — two formats that don’t perfectly overlap. Plain content has clean ways to express a heading, a link, a list, an image, a code block. It has no native concept of a Ghost signup card with a specific background and button label. When that has to survive as HTML and pass back through conversion, the structure is preserved as best it can be, but the editor’s bespoke settings are the kind of thing that can be lost. Any tool that bridges Koenig and plain text faces this; we’d rather tell you than pretend otherwise.

The safeguard you actually use

This is exactly why Specter never writes blind. Before anything publishes, the review diff shows you precisely what would be created, updated, or flagged — on both sides — so you can look at a card-heavy post and decide before anything happens. Reviewing is free; only AI runs spend credits. And if both the Ghost copy and your workspace changed since the last sync, conflict prompts stop and ask which version to keep rather than overwriting either one. Every publish keeps a snapshot behind it, so a card that flattened is one revert away.

The practical advice: for card-heavy posts, read the diff. For prose-first writing — posts that are paragraphs with the odd image or embed — Specter is in its element and the round trip is faithful. If you mostly compose in plain text and reach for Koenig only occasionally, you’ll rarely hit the edges at all.

If you haven’t connected yet, start with connecting Specter to Ghost. And if you’re weighing where to write in the first place, the tradeoffs live in Ghost markdown vs the web editor. Subscribe now →


Prefer to see the projection as plain .md files on your own disk, edited with your own tools? The desktop and open-source edition does the same conversion locally.