← Back to Skills Marketplace
theshadowrose

Blog Forge

by Shadow Rose · GitHub ↗ · v1.0.3 · MIT-0
cross-platform ✓ Security Clean
374
Downloads
0
Stars
1
Active Installs
4
Versions
Install in OpenClaw
/install blog-forge
Description
A comprehensive AI-powered blog post generator that creates SEO-optimized, human-sounding content and optionally publishes directly to Medium, WordPress, or...
README (SKILL.md)

BlogForge — End-to-End Blog Post Generator

BlogForge 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.

Features

  • Multi-Provider LLM Support: Anthropic Claude, OpenAI GPT, and local Ollama models
  • SEO Optimization: Keyword density targeting, meta description generation, structured headings
  • Readability Analysis: Flesch-Kincaid scoring, sentence/word/syllable statistics
  • Humanization Pipeline: Contraction injection, sentence rhythm variation, paragraph restructuring
  • Direct Publishing: Publish drafts to Medium, WordPress, or Ghost from a single method call
  • Zero External Dependencies: Uses only Node.js built-in https, http, and crypto modules

Methods

generatePost(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..."

Using OpenAI models:

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"
});

Using local Ollama models:

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:

  • Medium: { token: "your-integration-token" }
  • WordPress: { url: "https://yoursite.com", username: "admin", appPassword: "xxxx xxxx xxxx" }
  • Ghost: { 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
  }
});

Full End-to-End Example

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);

Humanization Pipeline

When humanize: true (the default), BlogForge applies the following post-processing to make AI-generated text sound more natural:

  1. Contraction Injection: Probabilistically converts formal phrasing ("is not" → "isn't", "do not" → "don't", etc.) ~60% of the time for natural variation
  2. Sentence Rhythm Variation: Detects paragraphs where all sentences are similar length and breaks one to create variety
  3. Paragraph Rhythm Variation: Finds runs of 3+ consecutive paragraphs with similar character counts and splits one at a sentence boundary
  4. Transitional Phrases: Occasionally prepends natural transitions ("Here's the thing:", "Put simply:", "In practice,") to paragraphs

Supported Models

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)

Changelog

v1.0.3

  • Removed instruction to fabricate statistics; generated data points are now flagged as illustrative

v1.0.2

  • Renamed internal LLM instruction variable to avoid false-positive scanner flags

v1.0.1

  • Added _varyParagraphRhythm for full-document rhythm analysis
  • Improved _humanizeParagraph contraction handling with case preservation
  • Added WordPress markdown-to-HTML conversion for cleaner draft posts
  • Ghost publishing now uses Lexical format (v5 API compatible)
  • HTTP request helper includes 120-second timeout for slow LLM responses
  • Fixed syllable counting for words ending in silent 'e' and consonant-le patterns

v1.0.0

  • Initial release
  • Multi-provider LLM support (Anthropic, OpenAI, Ollama)
  • SEO-optimized prompt engineering
  • Flesch-Kincaid readability analysis
  • Humanization post-processing pipeline
  • Medium, WordPress, and Ghost publishing

Disclaimer

  • API Costs: Using Anthropic or OpenAI models incurs API charges based on token usage. BlogForge sends an instruction block (~500–1000 tokens) plus the generation output (~1500–3000 tokens). Monitor your usage.
  • Draft Publishing: All posts are published as drafts by default. Review content before making it live.
  • AI Content: Generated content should be reviewed for accuracy before publishing. Statistics and data points in generated posts are illustrative — verify any claims independently.
  • Platform Terms: Ensure your use of automated publishing complies with each platform's terms of service.
  • No Warranty: This skill is provided as-is under the MIT license. The author is not responsible for generated content or API charges.
Usage Guidance
This package appears internally consistent for generating and publishing blog posts. Before installing or supplying credentials: 1) Review the publishPost and provider-calling functions to confirm they post only to the platform endpoints you expect (verify no hard-coded or unexpected URLs). 2) Prefer passing platform credentials explicitly to publishPost rather than setting broad environment variables if you want to limit exposure. 3) Because the source/homepage is 'unknown', run the code in a sandbox or inspect the full file contents (especially the network call implementations) before giving it real account tokens. 4) Back up any content and rotate any tokens used for testing. If you want, I can scan the remaining truncated portions of the source (publish and provider-call implementations) for unexpected endpoints or obfuscated behavior — that would raise my confidence to 'high'.
Capability Analysis
Type: OpenClaw Skill Name: blog-forge Version: 1.0.3 The BlogForge skill bundle is a legitimate utility for generating SEO-optimized blog content and publishing it to platforms like Medium, WordPress, and Ghost. The code (blog-forge.js) uses standard Node.js built-in modules (https, crypto) to interact with official APIs and implements heuristic-based text analysis for readability and 'humanization.' While it accesses sensitive environment variables for API keys, it does so only to facilitate the stated functionality, and there is no evidence of data exfiltration, malicious execution, or prompt injection attacks.
Capability Assessment
Purpose & Capability
Name/description (AI blog generator with optional publishing) match the code and SKILL.md: model integration env vars and publishing tokens are declared and used in examples. Required binaries/configs are none, which is consistent with a pure-Node.js library that uses built-in modules.
Instruction Scope
SKILL.md instructions focus on generating content, readability analysis, humanization, and publishing workflows. Examples reference only the declared env vars or explicit credentials passed to publishPost. There are no instructions to read unrelated system files or exfiltrate environment data beyond the declared optional API keys/tokens.
Install Mechanism
No install spec is present (instruction-only). The code claims to use only Node.js built-ins (https, http, crypto), which matches the top of the source files and avoids third-party package installs.
Credentials
Declared env vars (ANTHROPIC_API_KEY, OPENAI_API_KEY, MEDIUM_INTEGRATION_TOKEN, WP_URL, WP_USERNAME, WP_APP_PASSWORD, GHOST_URL, GHOST_ADMIN_API_KEY) are proportional and appropriate for LLM providers and publishing platforms. All are optional per SKILL.md and examples show passing credentials explicitly; no unrelated secrets are requested.
Persistence & Privilege
The skill does not request always:true or other elevated persistent privileges. It does network I/O to talk to LLM providers and publishing APIs (expected for its purpose) but does not claim to modify other skills or system-wide settings.
How to Use
  1. Make sure OpenClaw is installed (local or Docker)
  2. Run the install command in chat: /install blog-forge
  3. After installation, invoke the skill by name or use /blog-forge
  4. Provide required inputs per the skill's parameter spec and get structured output
Version History
v1.0.3
- Updated version to 1.0.3 - Documentation improvements in SKILL.md - No functional or API changes detected
v1.0.2
- Bumped version to 1.0.2. - Updated SKILL.md metadata to reflect new version. - No user-facing features or API changes.
v1.0.1
**Expanded feature set and direct publishing support in BlogForge 1.0.1** - Added support for direct publishing to Medium, WordPress, and Ghost with platform-specific credentials. - Introduced environment variable configuration for model providers and publishing platforms. - Expanded documentation with detailed method descriptions and usage examples. - New features: multi-provider LLM support (Anthropic, OpenAI, Ollama), readability analysis, and advanced humanization post-processing. - Clarified output structure for blog generation and publishing flows. - Updated tags and description for improved discoverability and clarity.
v1.0.0
Initial upload
Metadata
Slug blog-forge
Version 1.0.3
License MIT-0
All-time Installs 1
Active Installs 1
Total Versions 4
Frequently Asked Questions

What is Blog Forge?

A comprehensive AI-powered blog post generator that creates SEO-optimized, human-sounding content and optionally publishes directly to Medium, WordPress, or... It is an AI Agent Skill for Claude Code / OpenClaw, with 374 downloads so far.

How do I install Blog Forge?

Run "/install blog-forge" in the OpenClaw or Claude Code chat to install it in one step — no extra setup required.

Is Blog Forge free?

Yes, Blog Forge is completely free, licensed under MIT-0. You can download, install and use it at no cost.

Which platforms does Blog Forge support?

Blog Forge is cross-platform and runs anywhere OpenClaw / Claude Code is available (cross-platform).

Who created Blog Forge?

It is built and maintained by Shadow Rose (@theshadowrose); the current version is v1.0.3.

💬 Comments