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.

🔒 runs on your machine — key never leaves it 🧱 markup-safe — edits mobiledoc text only 🔄 zero dependencies — Node 18+

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

  1. Get an Admin API key: Ghost Admin → Settings → Integrations → Add custom integration → copy the Admin API key (format id:secret).
  2. Dry run (no writes):
    GHOST_URL=https://yourblog.com GHOST_ADMIN_KEY=id:secret node clean.js --dry-run
  3. 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