Add internal links across your whole Ghost blog at once
Internal links are some of the cheapest SEO you can do, and Ghost makes them slow. The editor does have a tidy way to add one: highlight text, hit cmd+k or type @, and search your published posts to drop a link in. That’s fine for a sentence. It is miserable for a hundred posts. There’s no native way to scan your whole archive, find every place a new article should point back to an older one, fix the links that went stale when you changed a slug, or standardize the anchor text you’ve been writing three different ways. Ghost links posts one at a time, by hand, inside a single open editor — and that’s the whole story.
So when your blog grows past a few dozen posts, internal linking quietly stops happening. You publish something new, you mean to go back and link the five related posts to it, and you never do. The links you do have slowly rot as URLs change. The work isn’t hard; it’s just impossible to do in bulk where your content actually lives.
The fix is to move the work somewhere bulk edits are natural: a folder of plain markdown files on your Mac.
Pull the whole blog down first
That round trip is what Specter does. It’s a native macOS menu-bar app that does two-way sync between Ghost and a local folder. Point it at your site (you’ll need a Ghost Admin API key), pick a folder, and it pulls every post down as a .md file with its frontmatter preserved — title, tags, status, feature image URL, and excerpt all sitting at the top of the file. Because the sync runs both ways, this isn’t limited to new drafts; it can edit posts you’ve already published, which is exactly where your internal links live and exactly where they’ve gone stale.
Once your archive is a folder of text files, every link in it is just a line you can read and rewrite. That’s the unlock. The whole blog is now searchable, scriptable, and open to any tool you own — including AI.
Let AI suggest the links
Now hand the folder to an AI tool — Claude, ChatGPT, Gemini, Copilot, whatever you already use (here’s how that setup works). Specter has no built-in model and charges nothing for tokens; you bring your own intelligence. The AI can read all your posts at once, which is the thing the Ghost editor can never do, and that wider view is what makes good internal linking possible.
The kinds of jobs that take a week by hand and minutes across a folder:
- Read every post, and where one naturally references a topic covered in another post, add a contextual link to it with sensible anchor text.
- Find broken or outdated internal links — old slugs, a domain you migrated away from, paths that 404 — and fix or flag them everywhere they appear.
- Standardize anchor text so the same destination isn’t linked as “our pricing,” “see pricing,” and “click here” across the archive.
A plain script handles part of this too. If you mostly need to find and replace dead URLs or normalize a path pattern, a few lines of find-and-replace over the folder is faster and more predictable than an AI pass. Use AI for the judgment calls — which posts should link to each other — and a script for the mechanical sweeps.
You review the suggestions — always
Here’s the honest part. AI is good at spotting that two posts are related and proposing a link between them. It is not reliable at deciding whether that link actually helps the reader, whether the anchor text is right, or whether it just stuffed a paragraph with five links because it could. Treat what it produces as suggestions, not decisions. Read the diff in your editor, keep the links that genuinely connect related ideas, cut the ones that are reaching, and fix anchor text that reads like a robot wrote it. Over-linking is a real way to make a post worse, and the tooling won’t stop you — you have to.
This is the same human-in-the-loop discipline that makes the whole AI-on-Ghost workflow safe. Nothing reaches your live blog until you’ve looked at it.
Preview the diff, then sync back
When the folder looks right, run a dry-run preview in Specter before anything touches Ghost. It’s not a vague “this will update N posts” — it shows the actual creates, updates, and conflicts, so you can read the blast radius of a link sweep across your whole archive before a single byte goes live. After an edit that touched fifty posts, that preview is the difference between a confident push and a guess.
Then sync back. If you happened to edit one of those posts in the Ghost editor while you were working locally, Specter prompts you about the conflict instead of silently overwriting either version. Push, and your internal links are live across the blog.
The mental model is the same one that runs through the rest of this work, including bulk SEO edits: Ghost stays your publishing home, your Mac holds the source of truth as markdown, and the bulk work happens in the folder where doing something to every post at once is the natural case rather than the impossible one. Internal linking, finally, is one of those things.