Ghost integration
Clean your Ghost posts, in bulk.
Ghost doesn't support plugins, so NoAtMark ships a zero-dependency Node script that connects to the Ghost Admin API and strips invisible characters — zero-width spaces, BOMs, soft hyphens — from every post's title, excerpt, and body, without touching your markup.
Free, open source. No account, no upload.
📚 Admin API bulk clean
Pulls every post (paginated) and cleans the ones that contain invisible characters — with a --dry-run preview first.
🧱 Markup-safe
Edits mobiledoc text markers only, so cards, atoms, and formatting survive — unlike an HTML round-trip, which can drop Ghost content.
🔒 Private
Everything runs locally. Your Admin API key is sent only to your own Ghost server.
Run it in 3 steps
- Get an Admin API key: Ghost Admin → Settings → Integrations → Add custom integration → copy the Admin API key (format
id:secret). - Dry run (no writes):
GHOST_URL=https://yourblog.com GHOST_ADMIN_KEY=id:secret node clean.js --dry-run - Run for real:
GHOST_URL=https://yourblog.com GHOST_ADMIN_KEY=id:secret node clean.js
Requires Node 18+. No npm install needed — the script has zero dependencies.
What it strips
- Zero-width spaces (U+200B), joiners (U+200C/U+200D), non-joiner, word joiner (U+2060)
- BOM (U+FEFF), soft hyphen (U+00AD), direction marks (U+200E/U+200F)
- Combining grapheme joiner (U+034F), variation selectors, special spaces, non-breaking space
No auto-clean on save? Use the extension
Ghost has no save hook, so this script is for bulk cleanup. For real-time stripping as you paste into the Ghost editor, install the free NoAtMark browser extension — it cleans invisible characters automatically on copy.
More
- Web tools: noatmark.com/tools/
- Text hygiene API: noatmark.com/api/
- WordPress plugin: noatmark.com/wordpress-plugin/