Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add kasuncfdo/ghost-headless-blog-skill --skill ghost-headless-bloggit clone --depth 1 https://github.com/kasuncfdo/ghost-headless-blog-skillWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/kasuncfdo/ghost-headless-blog-skill/ghost-headless-blog)<a href="https://agentmods.dev/skills/kasuncfdo/ghost-headless-blog-skill/ghost-headless-blog"><img src="https://agentmods.dev/badge/skills/kasuncfdo/ghost-headless-blog-skill/ghost-headless-blog/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/kasuncfdo/ghost-headless-blog-skill/ghost-headless-blog"><img src="https://agentmods.dev/badge/skills/kasuncfdo/ghost-headless-blog-skill/ghost-headless-blog.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00097 | $0.02040 |
| Opus 5 | $0.00048 | $0.01020 |
| Sonnet 5 | $0.00019 | $0.00408 |
| Haiku 4.5 | $0.00010 | $0.00204 |
Grade A, and why
ghost-headless-blog scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 11d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 116 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Headless Ghost blog in Next.js (App Router)
Battle-tested patterns from a live production site (Next.js 16 / React 19 / Tailwind v4, Ghost Content API v6.0). Everything below was learned the hard way — follow the decisions, not just the code.
Architecture at a glance
- No
@tryghost/content-apidependency. Call the Content API REST endpoints directly ({GHOST_URL}/ghost/api/content/posts/?key=...) with anAccept-Version: v6.0header. The SDK adds weight and hides errors. - All Ghost fetching is server-side (server components, route handlers,
generateStaticParams, sitemap). Content API keys only expose public data, but keep them server-only anyway: env varsGHOST_URL/GHOST_CONTENT_API_KEYwith noNEXT_PUBLIC_prefix. - ISR everywhere + instant webhook purge. Every blog route exports
export const revalidate = 3600andexport const dynamicParams = true; a Ghost Admin webhook hits/api/revalidate?secret=...on post publish/update/unpublish/delete for instant purges. Hourly ISR is only the safety net. - Ghost post HTML is rendered verbatim via
dangerouslySetInnerHTMLinside<article className="gh-content">, styled by a dedicatedghost-content.css, with a small HTML post-processing pass (blur-up images, LCP fix) and tiny client components re-adding Ghost's interactive card JS (toggle cards).
Routes to build
| Route | Purpose |
|---|---|
/blog |
Index: hero + feed. Only the Ghost-fetching part is an async component behind <Suspense> with a skeleton fallback. |
/blog/[slug] |
Post page: metadata from Ghost SEO fields, BlogPosting JSON-LD, rendered gh-content, related posts. |
/blog/tag/[slug] |
Tag archive (CollectionPage JSON-LD). Statically generated for crawlers even if the UI filters client-side. |
/blog/author/[slug] |
Author archive: bio, avatar/cover, location, social links, post feed. ProfilePage + Person JSON-LD with sameAs socials. |
/blog/page/[page] |
Paged feed archive; page 1 redirect("/blog"). |
/api/revalidate |
Ghost webhook receiver → revalidatePath purges. |
sitemap.ts |
Include posts (with real lastModified) + tag + author pages; Ghost outage must not break the sitemap (.catch(() => [])). |
What ships with it
10 files beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
- references/ghost-docs.md 2.6 KB
- references/pages.md 11 KB
- references/setup.md 4.5 KB
- templates/components/BlurImage.tsx 1.1 KB
- templates/components/ReadingProgress.tsx 1.4 KB
- templates/components/ToggleCards.tsx 1018 B
- templates/ghost-content.css 13 KB
- templates/ghost-html.ts 897 B runs code
- templates/ghost.ts 16 KB runs code
- templates/revalidate-route.ts 1.9 KB runs code
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 11d ago First seen · 116 lines · 97 tokens per session scan A 6ec822d4d1ac
ghost-headless-blog is a skill published in the GitHub repository kasuncfdo/ghost-headless-blog-skill (5 stars, last pushed 1mo ago), licensed MIT. It adds 97 tokens to every session and 2,040 once invoked, about $0.0005 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other skills, from other repositories
nextjs-caching
Configure Next.js cache layers, invalidation, and cache-component APIs. Use when choosing fetch caching, use cache, tags, or stale-data debugging in Next.js.
nextjs-pages-router
Implement Pages Router data fetching with getServerSideProps, getStaticProps, and API routes in Next.js legacy projects. Use when working in a pages/ directory project, adding SSR/SSG data fetching, or creating API routes.
nextjs-server-actions
Implement secure Next.js Server Actions for mutations, forms, and optimistic UI. Use when building actions, form flows, auth checks, or revalidation after writes.
copilotkit-upgrade
Use when migrating a CopilotKit v1 application to v2 -- updating package imports, replacing deprecated hooks and components, switching from GraphQL runtime to AG-UI protocol runtime, and resolving breaking API changes.
nextjs-app-router
Full end-to-end tRPC setup for Next.js App Router. Covers route handler with fetchRequestHandler (GET + POST exports), TRPCProvider with QueryClientProvider, createTRPCOptionsProxy for RSC prefetching, HydrateClient/HydrationBoundary for hydration, useSuspenseQuery for Suspense, and server-side callers.
nextjs-pages-router
Set up tRPC in Next.js Pages Router with createNextApiHandler, createTRPCNext, withTRPC HOC, SSR via ssr option and ssrPrepass, SSG via createServerSideHelpers with getStaticProps, and server-side helpers for getServerSideProps prefetching.