ghost

Manage Ghost CMS blog posts via Admin API. Supports creating, updating, deleting, and listing posts. NEW: Upload images and set feature images for posts. Use when the user needs to programmatically manage Ghost blog content. Requires a JSON configuration file with API credentials.

3,891 stars

Best use case

ghost is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

Manage Ghost CMS blog posts via Admin API. Supports creating, updating, deleting, and listing posts. NEW: Upload images and set feature images for posts. Use when the user needs to programmatically manage Ghost blog content. Requires a JSON configuration file with API credentials.

Teams using ghost should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/ghost/SKILL.md --create-dirs "https://raw.githubusercontent.com/openclaw/skills/main/skills/alphafactor/ghost/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/ghost/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How ghost Compares

Feature / AgentghostStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

Manage Ghost CMS blog posts via Admin API. Supports creating, updating, deleting, and listing posts. NEW: Upload images and set feature images for posts. Use when the user needs to programmatically manage Ghost blog content. Requires a JSON configuration file with API credentials.

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

Related Guides

SKILL.md Source

# Ghost CMS Admin API

Manage your Ghost blog posts programmatically through the Admin API.

## Features

- 📝 **Create/Update/Delete posts** - Full CRUD operations
- 🖼️ **Upload images** - Upload images to Ghost and get URL
- 🎨 **Feature images** - Set cover images for posts
- 📊 **List posts** - View recent posts with status
- 🏷️ **Tags support** - Add tags to posts

## Prerequisites

### 1. Get Admin API Key

1. Log in to your Ghost Admin panel (`https://your-blog.com/ghost/`)
2. Go to **Settings** → **Integrations**
3. Click **"Add custom integration"**
4. Copy the **Admin API Key** (format: `id:secret`)

### 2. Create Configuration File

**唯一调用方式:自定义配置文件路径(项目隔离)**

Create a JSON config file for your site:

Example: `/Users/ethan/.openclaw/workspace/projects/fuye/ghost-admin.config.json`
```json
{
  "api_url": "https://fu-ye.com/ghost/api/admin",
  "admin_api_key": "your-id:your-secret"
}
```

## CLI Usage

### Method: Custom Config Path (唯一方式)

```bash
python3 scripts/ghost.py list --config "../../projects/fuye/ghost-admin.config.json"
python3 scripts/ghost.py create "Title" "Content" --config "../../projects/fuye/ghost-admin.config.json"
python3 scripts/ghost.py upload image.png --config "../../projects/fuye/ghost-admin.config.json"
```

## Python API Usage

### Method: Custom Config Path (唯一方式)

```python
import sys
import os
sys.path.insert(0, os.path.expanduser("~/.openclaw/workspace/skills/ghost/scripts"))
import ghost

# 唯一方式:通过配置文件路径获取配置
config = ghost.get_config(config_path="../../projects/fuye/ghost-admin.config.json")

# Create post
result = ghost.create_post(
    config=config,
    title="My Article Title",
    content="<h1>Title</h1><p>Content...</p>",
    status="published",
    tags=["tech", "news"]
)
```

### 3. Install Dependencies

```bash
pip3 install requests pyjwt --user
```

## Python API Usage

### Create a Post

```python
import sys
import os
sys.path.insert(0, os.path.expanduser("~/.openclaw/workspace/skills/ghost/scripts"))
import ghost

# 通过配置文件路径获取配置(唯一方式)
config = ghost.get_config(config_path="../../projects/fuye/ghost-admin.config.json")

# Create post with HTML content
result = ghost.create_post(
    config=config,
    title="My Article Title",
    content="<h1>Title</h1><p>Content...</p>",  # HTML format
    status="published",  # or "draft"
    tags=["tech", "news"]
)
```

### Upload Image

```python
# Upload image and get URL
image_url = ghost.upload_image(config, "/path/to/image.jpg")
print(f"Image URL: {image_url}")
```

### Create Post with Feature Image

```python
# Upload cover image first
cover_image_url = ghost.upload_image(config, "cover.jpg")

# Create post with feature image
result = ghost.create_post(
    config=config,
    title="Article with Cover",
    content="<p>Article content...</p>",
    status="published",
    feature_image=cover_image_url,  # Set cover image
    tags=["featured"]
)
```

### List Posts

```python
posts = ghost.list_posts(config, limit=20)
for post in posts:
    print(f"{post['title']} - {post['status']}")
```

### Update Post

```python
ghost.update_post(
    config=config,
    post_id="post-id-here",
    title="New Title",
    status="published"
)
```

## CLI Usage

### Setup

```bash
# Install dependencies
pip3 install requests pyjwt --user
```

### Create a Post

**As draft (default):**
```bash
python3 scripts/ghost.py create "My Article Title" "<p>Article content in HTML</p>" --config "../../projects/fuye/ghost-admin.config.json"
```

**Publish immediately:**
```bash
python3 scripts/ghost.py create "Breaking News" "<p>Content here</p>" --status published --config "../../projects/fuye/ghost-admin.config.json"
```

**With tags:**
```bash
python3 scripts/ghost.py create "Tech News" "<p>Content</p>" --status published --tags "tech,news,ai" --config "../../projects/fuye/ghost-admin.config.json"
```

### Upload Image

```bash
python3 scripts/ghost.py upload cover.png --config "../../projects/fuye/ghost-admin.config.json"
```

### Update a Post

```bash
# Update title
python3 scripts/ghost.py update 5f8c3c2e8c3d2e1f3a4b5c6d --title "New Title" --config "../../projects/fuye/ghost-admin.config.json"

# Update content
python3 scripts/ghost.py update 5f8c3c2e8c3d2e1f3a4b5c6d --content "<p>New content</p>" --config "../../projects/fuye/ghost-admin.config.json"

# Publish a draft
python3 scripts/ghost.py update 5f8c3c2e8c3d2e1f3a4b5c6d --status published --config "../../projects/fuye/ghost-admin.config.json"
```

### Delete a Post

```bash
python3 scripts/ghost.py delete 5f8c3c2e8c3d2e1f3a4b5c6d --config "../../projects/fuye/ghost-admin.config.json"
```

### List Posts

```bash
# List 10 most recent posts (default)
python3 scripts/ghost.py list --config "../../projects/fuye/ghost-admin.config.json"

# List 20 posts
python3 scripts/ghost.py list 20 --config "../../projects/fuye/ghost-admin.config.json"
```

## Common Workflows

### Publish with Cover Image

```python
import sys
import os
sys.path.insert(0, os.path.expanduser("~/.openclaw/workspace/skills/ghost/scripts"))
import ghost

# 唯一方式:通过配置文件路径获取配置
config = ghost.get_config(config_path="../../projects/fuye/ghost-admin.config.json")

# Upload cover image
image_url = ghost.upload_image(config, "/path/to/cover.jpg")

# Create post with cover
result = ghost.create_post(
    config=config,
    title="Featured Article",
    content="<p>Article content...</p>",
    status="published",
    feature_image=image_url,
    tags=["featured", "tech"]
)

print(f"Published: {result['url']}")
```

### Batch Operations

```bash
# List all drafts
python3 scripts/ghost.py list 100 --config "../../projects/fuye/ghost-admin.config.json" | grep "🟡"

# Update specific post
python3 scripts/ghost.py update <id> --tags "featured" --config "../../projects/fuye/ghost-admin.config.json"
```

## API Reference

### ghost.get_config(config_path)

**唯一方式**获取配置。

**Parameters:**
- `config_path` - Path to JSON configuration file (e.g., `"../../projects/fuye/ghost-admin.config.json"`)

**Returns:** Config dict with api_url and admin_api_key

### ghost.create_post(config, title, content, status='draft', tags=None, feature_image=None)

Create a new post.

**Parameters:**
- `config` - Configuration dict from `get_config(config_path)`
- `title` - Post title
- `content` - HTML content
- `status` - 'draft' or 'published'
- `tags` - List of tag names
- `feature_image` - URL of cover image (optional)

**Returns:** Post dict with id, url, status

### ghost.upload_image(config, image_path)

Upload an image to Ghost.

**Parameters:**
- `config` - Configuration dict
- `image_path` - Local path to image file

**Returns:** Image URL string

### ghost.list_posts(config, limit=10)

List recent posts.

**Returns:** List of post dicts

### ghost.update_post(config, post_id, **kwargs)

Update existing post.

**Parameters:**
- `post_id` - Post ID to update
- `title` - New title (optional)
- `content` - New content (optional)
- `status` - New status (optional)
- `tags` - New tags (optional)

### ghost.delete_post(config, post_id)

Delete a post.

## Troubleshooting

**Error: No module named 'jwt'**
→ Install: `pip3 install pyjwt --user`

**Error: 401 Unauthorized**
→ Check your Admin API Key is correct and not expired

**Error: 404 Not Found**
→ Verify api_url in config file ends with `/ghost/api/admin`

**Error: Config file not found**
→ Ensure config_path is correct relative to your working directory

**Image upload fails**
→ Check image file exists and is under 10MB
→ Supported formats: JPG, PNG, GIF

## References

- API Documentation: [references/api.md](references/api.md)
- Ghost Official Docs: https://ghost.org/docs/admin-api/

Related Skills

ghostprint

3891
from openclaw/skills

LLM fingerprint noise injector. Sends behaviorally realistic randomized queries to Anthropic, Z.ai, and any OpenAI-compatible provider on a schedule to depersonalize your usage profile and prevent behavioral fingerprinting. Available as a native OpenClaw plugin (no extra config — reuses your existing provider keys) and a standalone Python script.

ghostbot-aclm

3891
from openclaw/skills

GhostBot ACLM — AI-powered Automated Concentrated Liquidity Manager for Uniswap v4. Manage liquidity positions, auto-rebalance out-of-range positions, optimize LP fees dynamically, execute limit orders (stop-loss, take-profit), and monitor oracle signals — all from chat. Deployed on Ethereum Sepolia with verified contracts. Use this skill when users ask about DeFi liquidity provision, Uniswap v4 hooks, pool management, LP positions, impermanent loss, or automated market making.

ghostling-libghostty-terminal

3819
from openclaw/skills

Build minimal terminal emulators using the libghostty-vt C API with Raylib for windowing and rendering

---

3891
from openclaw/skills

name: article-factory-wechat

Content & Documentation

humanizer

3891
from openclaw/skills

Remove signs of AI-generated writing from text. Use when editing or reviewing text to make it sound more natural and human-written. Based on Wikipedia's comprehensive "Signs of AI writing" guide. Detects and fixes patterns including: inflated symbolism, promotional language, superficial -ing analyses, vague attributions, em dash overuse, rule of three, AI vocabulary words, negative parallelisms, and excessive conjunctive phrases.

Content & Documentation

find-skills

3891
from openclaw/skills

Helps users discover and install agent skills when they ask questions like "how do I do X", "find a skill for X", "is there a skill that can...", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill.

General Utilities

tavily-search

3891
from openclaw/skills

Use Tavily API for real-time web search and content extraction. Use when: user needs real-time web search results, research, or current information from the web. Requires Tavily API key.

Data & Research

baidu-search

3891
from openclaw/skills

Search the web using Baidu AI Search Engine (BDSE). Use for live information, documentation, or research topics.

Data & Research

agent-autonomy-kit

3891
from openclaw/skills

Stop waiting for prompts. Keep working.

Workflow & Productivity

Meeting Prep

3891
from openclaw/skills

Never walk into a meeting unprepared again. Your agent researches all attendees before calendar events—pulling LinkedIn profiles, recent company news, mutual connections, and conversation starters. Generates a briefing doc with talking points, icebreakers, and context so you show up informed and confident. Triggered automatically before meetings or on-demand. Configure research depth, advance timing, and output format. Walking into meetings blind is amateur hour—missed connections, generic small talk, zero leverage. Use when setting up meeting intelligence, researching specific attendees, generating pre-meeting briefs, or automating your prep workflow.

Workflow & Productivity

self-improvement

3891
from openclaw/skills

Captures learnings, errors, and corrections to enable continuous improvement. Use when: (1) A command or operation fails unexpectedly, (2) User corrects Claude ('No, that's wrong...', 'Actually...'), (3) User requests a capability that doesn't exist, (4) An external API or tool fails, (5) Claude realizes its knowledge is outdated or incorrect, (6) A better approach is discovered for a recurring task. Also review learnings before major tasks.

Agent Intelligence & Learning

botlearn-healthcheck

3891
from openclaw/skills

botlearn-healthcheck — BotLearn autonomous health inspector for OpenClaw instances across 5 domains (hardware, config, security, skills, autonomy); triggers on system check, health report, diagnostics, or scheduled heartbeat inspection.

DevOps & Infrastructure