Guide
By Axel Antas-Bergkvist Published May 23, 2026

What happens to Koenig cards when Specter syncs

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. Specter’s job is to turn that into plain markdown on disk and back again. This page is an honest 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 your file’s 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 markdown

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 to markdown 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 inside your markdown file. 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 are turned into clean markdown with the caption underneath.

So a typical post — prose, headings, images, the occasional embed — comes down as readable markdown you can edit anywhere, with the fancy bits parked safely as HTML you can leave alone.

How a push goes back

When you push a local file 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 locally 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 is sitting in your markdown, it travels back inside that markdown card and Ghost renders it again. Round prose stays prose; preserved cards stay cards.

The honest limitation

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 markdown 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. Markdown 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 markdown faces this; we’d rather tell you than pretend otherwise.

The safeguard you actually use

This is exactly why Specter never writes blind. Before a single file or post changes, the dry-run preview 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. And if both the Ghost copy and your local file changed since the last sync, conflict prompts stop and ask which version to keep rather than overwriting either one.

The practical advice: for card-heavy posts, run the dry run and read it. For Markdown-first writing — where your posts are prose 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 set things up yet, start with connecting Specter to Ghost. And if you’re weighing where to write in the first place, the honest tradeoffs live in Ghost markdown vs the web editor.

Buy Specter — $49 Browse all guides