Real version control for your Ghost posts
If you have ever made a sweeping edit to a Ghost post and then wished you could see exactly what changed, or roll the whole thing back, you have run into the limits of how Ghost tracks history. Ghost does keep some history — but it is far more modest than the safety net most people assume they have. This guide explains what Ghost actually stores, where it falls short, and how to get real, permanent version control once your posts live as local markdown.
What Ghost’s built-in revisions actually do
Ghost is not a complete blank slate here. The editor has a post history feature: open a post, go to the settings menu, and you can browse previous versions of that post and restore any one of them with a click. When you are working with a team, it even shows who made each change. For catching a single bad edit on a single post, it works.
The catch is in the fine print. Ghost only keeps the last handful of revisions for a post — historically around the most recent ten, after which older versions are dropped for good. So if you have edited a post a dozen times since the version you actually want, that version is simply gone. The history is per-post too, surfaced one post at a time inside the editor. There is no view of your blog’s history as a whole, no way to ask “what changed across the site last Tuesday,” and no diff that shows you the precise lines that moved. And because the revisions are tied to the editor, a bulk change made through the Admin API or a script is not something you can browse and restore the same comfortable way.
For the kind of work this site is about — running an AI pass or a script across every post at once — that gap matters most. The moment you are editing dozens or hundreds of posts in one sweep is exactly the moment a few per-post editor revisions stop being enough.
The fix: put your synced folder under git
Once your blog is a folder of plain markdown files, you can use the version control system the entire software world already trusts: git. Git was built to track every change to a folder of text files, remember it forever, show you exact diffs, and let you roll back to any past state. A Ghost blog synced down to markdown is, conveniently, just a folder of text files.
That is what Specter gives you. It is a small native macOS app that does two-way sync between Ghost and a local folder — pull your posts down as markdown, edit them however you like, and push the changes back. If you have not set that up yet, start with connecting Specter to your Ghost blog. Once your posts are on disk, the version history story changes completely.
The workflow is straightforward. In a terminal, go to your sync folder and run git init once to start tracking it. Make an initial commit so you have a clean baseline:
cd ~/path/to/your/ghost-posts
git init
git add .
git commit -m "Baseline: full blog snapshot"
From then on, the habit is simple: commit before you change anything. Right before you hand the folder to an AI tool or run a script, snapshot the current state.
git add .
git commit -m "Before SEO meta-description pass"
Now run your edit. When it is done, git diff shows you exactly what changed — every line, in every file, across the whole blog at once. This is the view Ghost’s editor never gives you. You can read the full blast radius of a bulk edit before any of it touches your live site, which pairs naturally with Specter’s own dry-run preview.
If something is wrong, you roll back. To throw away uncommitted changes and return the folder to your last good commit:
git checkout .
To go back to a specific earlier snapshot, find it with git log and check it out. Either way, the recovered files are real markdown again, ready for Specter to sync back up to Ghost. There is no ten-revision ceiling, no per-post fiddling, and no version that quietly disappears because you edited too many times since.
An honest note on the trade-off
This is more setup than clicking “restore” in the editor, and it asks for a little comfort with git — running commits, reading a diff, the occasional checkout. If you have never touched git, there is a short learning curve. But it is a one-time cost, and the commands above are most of what you will ever need for this. In exchange you get permanent, diffable, whole-blog history that protects exactly the scripted and bulk edits Ghost’s built-in revisions do not.
The pattern fits neatly with the rest of how Specter is meant to be used. If you are running large metadata sweeps, see how to bulk edit Ghost posts for SEO; if you are letting an assistant rewrite content, see editing Ghost posts with Claude. In both cases the rule is the same: commit first, edit, diff, and only then sync. Ghost stays your publishing home. Git, on the folder Specter keeps in sync, becomes the memory it never quite had.