agentsclimarketplace

Ghost

Skill ComeOnOliver/skillshub/skills/TerminalSkills/skills/ghost

🧠 The right skill, one API call. AI agent skills registry with token-efficient skill resolution. 5,000+ skills from 500+ top repos.From the repository description

Install
npx -y skills add ComeOnOliver/skillshub --skill ghost

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

SKILL.md

5.1 KB, ~1.3k tokens by cl100k_base, as published. Nobody here has run it

Ghost β€” Professional Publishing Platform

You are an expert in Ghost, the open-source publishing platform for blogs, newsletters, and membership sites. You help developers and creators set up Ghost as a headless CMS with its Content API for custom frontends, integrate the Members/Subscriptions system for paid newsletters, and build custom themes β€” turning Ghost into a full publishing business with built-in payments, email newsletters, and SEO.

Core Capabilities

Content API (Headless)

// src/lib/ghost.ts β€” Ghost Content API client
import GhostContentAPI from "@tryghost/content-api";

const ghost = new GhostContentAPI({
  url: process.env.GHOST_URL!,            // https://your-ghost.com
  key: process.env.GHOST_CONTENT_API_KEY!,
  version: "v5.0",
});

// Fetch posts with pagination
async function getPosts(page = 1, limit = 10) {
  return ghost.posts.browse({
    limit,
    page,
    include: ["tags", "authors"],
    fields: ["id", "title", "slug", "excerpt", "feature_image", "published_at", "reading_time"],
    order: "published_at DESC",
  });
}

// Single post by slug
async function getPostBySlug(slug: string) {
  return ghost.posts.read({ slug }, {
    include: ["tags", "authors"],
    formats: ["html"],                    // or "mobiledoc" for raw
  });
}

// All tags
async function getTags() {
  return ghost.tags.browse({
    limit: "all",
    include: ["count.posts"],
    order: "count.posts DESC",
  });
}

// Posts by tag
async function getPostsByTag(tagSlug: string) {
  return ghost.posts.browse({
    filter: `tag:${tagSlug}`,
    include: ["tags", "authors"],
    limit: 20,
  });
}

Next.js Integration

// app/blog/[slug]/page.tsx β€” Ghost-powered blog with Next.js
import { getPostBySlug, getPosts } from "@/lib/ghost";
import { notFound } from "next/navigation";

export async function generateStaticParams() {
  const posts = await getPosts(1, 100);
  return posts.map((post) => ({ slug: post.slug }));
}

export async function generateMetadata({ params }: { params: { slug: string } }) {
  const post = await getPostBySlug(params.slug);
  if (!post) return {};
  return {
    title: post.meta_title || post.title,
    description: post.meta_description || post.excerpt,
    openGraph: {
      title: post.og_title || post.title,
      description: post.og_description || post.excerpt,
      images: post.og_image ? [post.og_image] : post.feature_image ? [post.feature_image] : [],
    },
  };
}

export default async function BlogPost({ params }: { params: { slug: string } }) {
  const post = await getPostBySlug(params.slug);
  if (!post) notFound();

  return (
    <article className="prose lg:prose-xl mx-auto py-12 px-4">
      {post.feature_image && (
        <img src={post.feature_image} alt={post.title} className="rounded-xl" />
      )}
      <h1>{post.title}</h1>
      <div className="flex items-center gap-3 text-gray-500">
        <span>{post.primary_author?.name}</span>
        <span>Β·</span>
        <time>{new Date(post.published_at!).toLocaleDateString()}</time>
        <span>Β·</span>
        <span>{post.reading_time} min read</span>
      </div>
      <div dangerouslySetInnerHTML={{ __html: post.html! }} />
    </article>
  );
}

export const revalidate = 60;             // ISR: revalidate every 60s

Members & Subscriptions

## Ghost Membership System

Ghost has built-in:
- Free member signup (email collection)
- Paid subscriptions via Stripe
- Tiered access (Free / Monthly $5 / Annual $50)
- Email newsletter delivery to members
- Content gating (public / members-only / paid-only)

## Admin API for member management
POST /ghost/api/admin/members/ β€” Create member
PUT  /ghost/api/admin/members/:id/ β€” Update member
GET  /ghost/api/admin/members/?filter=status:paid β€” List paid members

Installation

# Self-hosted (Docker)
docker run -d --name ghost \
  -p 2368:2368 \
  -e url=https://blog.example.com \
  -e database__client=mysql \
  -e database__connection__host=db \
  -v ghost-content:/var/lib/ghost/content \
  ghost:5

# Or Ghost(Pro) managed hosting: https://ghost.org/pricing/
# Or npm: npm install ghost-cli -g && ghost install

Best Practices

  1. Headless with Next.js β€” Use Ghost as CMS backend + Next.js for custom frontend; editors get Ghost's editor, developers get full control
  2. Content API for reads β€” Use Content API (key-based, cacheable) for all public content; Admin API only for writes
  3. Static generation β€” Use generateStaticParams for all blog posts; revalidate with ISR for near-instant updates
  4. SEO built-in β€” Ghost auto-generates meta tags, canonical URLs, structured data; override per-post in editor
  5. Newsletter as growth tool β€” Enable email newsletters; every blog post can be sent as email to subscribers
  6. Webhooks for builds β€” Configure webhooks in Ghost settings to trigger site rebuilds on publish
  7. Custom integrations β€” Use Ghost's integration system for API keys; separate keys for different frontends/services
  8. Membership tiers β€” Use free tier to build email list, paid tier for premium content; Ghost handles Stripe billing

What ships with it

Read from the repository

Just SKILL.md. No reference files, no scripts.

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.