A Claude Code skill (packaged as a plugin + marketplace) for implementing a **headless Ghost CMS blog in a Next.js App Router site**, with battle-tested patterns and copy-paste templates.
> /plugin marketplace add kasuncfdo/ghost-headless-blog-skill> /plugin install ghost-headless-blog@kasuncfdo-skills
Repo: kasuncfdo/ghost-headless-blog-skill
What's inside
A Claude Code skill (packaged as a plugin + marketplace) for implementing a headless Ghost CMS blog in a Next.js App Router site, with battle-tested patterns and copy-paste templates.
Once installed, Claude loads it automatically whenever you ask things like "add a Ghost-powered blog to this site" or when debugging an existing headless Ghost integration (empty blog, stale pages, broken images/cards).
skills/ghost-headless-blog/
├── SKILL.md # Architecture, 11 non-negotiable decisions, pitfalls
├── references/
│ ├── setup.md # Ghost Admin, env vars, next.config images, webhook, verification
│ ├── pages.md # Routes, ISR, metadata, JSON-LD, sitemap patterns
│ └── ghost-docs.md # Official Ghost docs lookup (llms-full.txt workflow, API reference URLs)
└── templates/ # Portable copy-paste code (no project-specific deps)
├── ghost.ts # Typed Content API client (posts, tags, authors; fetch + retry, graceful degradation)
├── ghost-html.ts # Blur-up images + LCP fix for Ghost-rendered HTML
├── revalidate-route.ts # Ghost webhook to instant ISR purge
├── ghost-content.css # Full .gh-content prose + koenig card styles (--ghost-accent)
└── components/ # BlurImage, ToggleCards, ReadingProgress
Highlights baked into the skill:
Accept-Version: v6.0), no @tryghost/content-api dependencyNEXT_PUBLIC_), all fetching in server componentsrevalidate = 3600) + Ghost webhook for instant purges on publish/update/unpublish/deletedynamicParams for new contentcanonical_url, JSON-LD for BlogPosting, Blog, CollectionPage, and ProfilePage/Person with sameAs social profiles, plus an honest sitemap covering posts, tags, and authorsdangerouslySetInnerHTML + dedicated koenig-card CSS, blur-up images via inline onload, first-image LCP promotion, toggle-card JS re-implementationIn any Claude Code session:
/plugin marketplace add kasuncfdo/ghost-headless-blog-skill
/plugin install ghost-headless-blog@kasuncfdo-skills
Update later with:
/plugin marketplace update kasuncfdo-skills
Installs into Claude Code, Cursor, Codex, and other agents supported by the skills ecosystem:
npx skills add kasuncfdo/ghost-headless-blog-skill
Add -g for a global (user-level) install instead of the current project.
Copy the skill folder into your user skills directory:
git clone git@github.com:kasuncfdo/ghost-headless-blog-skill.git
mkdir -p ~/.claude/skills
cp -R ghost-headless-blog-skill/skills/ghost-headless-blog ~/.claude/skills/
Ship it with one repo only (teammates get it too):
mkdir -p .claude/skills
cp -R ghost-headless-blog-skill/skills/ghost-headless-blog .claude/skills/
The skill triggers automatically on matching requests, or invoke it explicitly:
/ghost-headless-blog
Typical prompts:
params is a Promise)revalidatePath (e.g. Vercel) for the webhook flowMIT
FAQ
ghost-headless-blog is a Claude Code plugin with 1 hand-picked skill for development work, indexed on Flowy. Install it with the command on its page. It includes ghost-headless-blog. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.
Is this plugin yours?
Claim it with GitHubSubmit a pluginPromote it