Install
openclaw skills install blog-forgeA comprehensive AI-powered blog post generator that creates SEO-optimized, human-sounding content and optionally publishes directly to Medium, WordPress, or...
openclaw skills install blog-forgeBlogForge is a skill for AI-assisted agents that generates complete, SEO-optimized blog posts from a simple topic, optional keywords, and a desired tone. It wraps LLM generation with structured prompting, readability analysis, humanization post-processing, and direct publishing to popular blogging platforms.
https, http, and crypto modulesgeneratePost(options)Generate a complete blog post.
Parameters:
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
topic | string | ✅ | — | The blog post topic |
keywords | string[] | ❌ | [] | SEO keywords to target |
tone | string | ❌ | 'conversational' | Writing tone (e.g. 'professional', 'casual', 'technical') |
wordCount | number | ❌ | 1500 | Target word count |
model | string | ❌ | 'anthropic/claude-sonnet-4-20250514' | Model identifier with provider prefix |
humanize | boolean | ❌ | true | Apply humanization post-processing |
Returns: { content, title, meta, readability, wordCount }
Example:
const forge = new BlogForge();
const post = await forge.generatePost({
topic: "The Future of Remote Work in 2025",
keywords: ["remote work", "hybrid office", "productivity"],
tone: "conversational",
wordCount: 1800,
model: "anthropic/claude-sonnet-4-20250514"
});
console.log(post.title);
// "Why Remote Work Isn't Going Anywhere — And What's Coming Next"
console.log(post.readability);
// { fleschKincaid: 8.2, avgSentenceLength: 16.4, avgSyllablesPerWord: 1.4 }
console.log(post.meta);
// "Explore the future of remote work in 2025..."
const post = await forge.generatePost({
topic: "Beginner's Guide to Container Gardening",
keywords: ["container gardening", "small spaces", "urban garden"],
tone: "friendly",
model: "openai/gpt-4o"
});
const post = await forge.generatePost({
topic: "Understanding Rust's Ownership Model",
tone: "technical",
model: "ollama/llama3"
});
analyzeReadability(text)Analyze the readability of any text.
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
text | string | ✅ | The text to analyze |
Returns: { fleschKincaid, avgSentenceLength, avgSyllablesPerWord }
Example:
const forge = new BlogForge();
const stats = forge.analyzeReadability(
"Short sentences work. They are punchy. Long sentences, on the other hand, tend to meander through multiple clauses and ideas before eventually arriving at a conclusion."
);
console.log(stats);
// { fleschKincaid: 7.1, avgSentenceLength: 12.3, avgSyllablesPerWord: 1.5 }
publishPost(options)Publish a generated (or any) blog post to Medium, WordPress, or Ghost.
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
content | string | ✅ | Markdown blog post content |
title | string | ✅ | Post title |
platform | string | ✅ | 'medium', 'wordpress', or 'ghost' |
credentials | object | ✅ | Platform-specific credentials (see below) |
Credentials by platform:
{ token: "your-integration-token" }{ url: "https://yoursite.com", username: "admin", appPassword: "xxxx xxxx xxxx" }{ url: "https://yoursite.com", adminApiKey: "id:secret" }Returns: { success, url, id, platform }
Example — Medium:
const forge = new BlogForge();
const post = await forge.generatePost({
topic: "10 Lessons from Building a SaaS",
tone: "personal"
});
const result = await forge.publishPost({
content: post.content,
title: post.title,
platform: "medium",
credentials: {
token: process.env.MEDIUM_INTEGRATION_TOKEN
}
});
console.log(result);
// { success: true, url: "https://medium.com/@you/10-lessons-abc123", id: "abc123", platform: "medium" }
Example — WordPress:
const result = await forge.publishPost({
content: post.content,
title: post.title,
platform: "wordpress",
credentials: {
url: process.env.WP_URL,
username: process.env.WP_USERNAME,
appPassword: process.env.WP_APP_PASSWORD
}
});
Example — Ghost:
const result = await forge.publishPost({
content: post.content,
title: post.title,
platform: "ghost",
credentials: {
url: process.env.GHOST_URL,
adminApiKey: process.env.GHOST_ADMIN_API_KEY
}
});
const BlogForge = require('./blogforge');
const forge = new BlogForge();
async function createAndPublish() {
// Generate the post
const post = await forge.generatePost({
topic: "Why Every Developer Should Learn SQL in 2025",
keywords: ["SQL", "databases", "developer skills", "backend"],
tone: "conversational",
wordCount: 2000,
model: "anthropic/claude-sonnet-4-20250514",
humanize: true
});
console.log(`Generated: "${post.title}" (${post.wordCount} words)`);
console.log(`Readability: Flesch-Kincaid Grade ${post.readability.fleschKincaid}`);
// Publish to Medium as a draft
const result = await forge.publishPost({
content: post.content,
title: post.title,
platform: "medium",
credentials: { token: process.env.MEDIUM_INTEGRATION_TOKEN }
});
console.log(`Published draft: ${result.url}`);
}
createAndPublish().catch(console.error);
When humanize: true (the default), BlogForge applies the following post-processing to make AI-generated text sound more natural:
| Provider | Prefix | Example | API Key Required |
|---|---|---|---|
| Anthropic | anthropic/ | anthropic/claude-sonnet-4-20250514 | Yes (ANTHROPIC_API_KEY) |
| OpenAI | openai/ | openai/gpt-4o | Yes (OPENAI_API_KEY) |
| Ollama | ollama/ | ollama/llama3 | No (local) |
_varyParagraphRhythm for full-document rhythm analysis_humanizeParagraph contraction handling with case preservation