Install
openclaw skills install seo-article-pipelineEnd-to-end SEO article pipeline for any blog. Research keywords → analyze competition → write article → generate images → fact-check → humanize → assemble → translate. Use when asked to write a blog article, create SEO content, or generate articles. Input is a target keyword or list of keywords.
openclaw skills install seo-article-pipelineBefore first use, configure your project in a seo-config.md file in your workspace:
# SEO Pipeline Config
## Product
- **Name**: Your Product Name
- **URL**: https://yourproduct.com
- **Positioning**: One-line description of what you sell
- **Differentiators**: What makes you different from competitors
## Blog
- **Articles path**: ./content/blog/{locale}/slug.mdx
- **Images path**: ./public/blog/
- **Repo**: ./
- **Branch**: main
- **Locales**: en, fr (add/remove as needed)
## Brand Voice
- **Tone**: Professional but direct (customize this)
- **Person**: First person / Third person
- **Avoid**: List words or patterns to avoid
## Image Style
- **Background**: #1a1a2e (customize)
- **Accent color**: #e94560 (customize)
- **Style**: Semi-flat illustration (customize)
- **Always add**: "No text, no words, no letters"
## CTA
- **Component**: <YourCTAComponent /> (or markdown CTA block)
- **Placement**: Top (after intro) + Bottom (before FAQ)
If no config file exists, ask the user for these details before starting.
Run scripts/research-keyword.sh "keyword" [lang] [location] to get:
Default locations: 2840 (US), 2250 (France). Requires DATAFORSEO_LOGIN and DATAFORSEO_PASSWORD env vars.
Search the target keyword on Google (web_search tool). Fetch the top 3-5 results (web_fetch). Note:
Before writing, research the actual subject in depth. Do NOT rely on model knowledge alone.
If the article is about your own product:
web_fetch if they're online.If the article is about an external topic:
web_search queries from different angles (how-to, comparison, stats, problems, trends).web_fetch).Output: Research Brief Before moving to Step 3, compile a short research brief (in your working notes, not in the article):
This brief feeds directly into writing. If your brief is thin, do more research — don't start writing.
Follow references/article-checklist.md if it exists, otherwise use these defaults:
Map keywords to placement before you start:
Apply these while writing (check each one off):
Content Quality:
Structure & Readability:
Credibility & Evidence:
Differentiation:
Article format (markdown with frontmatter):
---
title: "Meta Title Here (60 chars max)"
slug: keyword-slug
description: "Meta description (155 chars max)"
keywords: [primary, secondary1, secondary2]
lang: en
date: YYYY-MM-DD
readingTime: X min
---
# H1 Title
Intro (2-3 sentences, hook + value promise)
[CTA: adapt text to article topic]
## H2 sections...
## FAQ
**Q: question?**
A: answer
[CTA: bottom]
Rules:
For each IMAGE_SLOT in the article, generate an image using nano-banana-pro skill (or any available image generation tool).
Use the image style defined in your seo-config.md. If no config exists, use a clean, professional SaaS style.
Always add to prompts: "No text, no words, no letters"
Image types:
Save all generated images to output/[slug]/images/ (staging area).
After writing (before fact-check), score the article on these 10 factors. Each is 0 or 1. Target: ≥8/10.
| # | Factor | Check |
|---|---|---|
| 1 | Title | Primary keyword present, under 60 chars, compelling |
| 2 | Meta description | 150-160 chars, keyword + CTA |
| 3 | H1 | Contains target keyword, matches search intent |
| 4 | Keyword placement | Primary keyword in intro, ≥1 H2, conclusion |
| 5 | H2 structure | Secondary keywords in H2s, logical hierarchy |
| 6 | Internal links | 2-5 with descriptive anchor text |
| 7 | External links | ≥3 to authoritative sources (BLOCKER if < 3) |
| 8 | FAQ section | ≥3 questions, answers 40-60 words, snippet-ready |
| 9 | Readability | Short paragraphs, tables for data, no filler |
| 10 | Word count | 1500-2500 (pillar) or 800-1200 (supporting) |
If score < 8, fix the weak areas before proceeding.
Before assembling, verify all factual claims in the article.
Process:
0. Research first: Before writing OR fact-checking, actively look up information you're unsure about. Use web_search and web_fetch to:
Common pitfalls:
Rule: When in doubt, leave it out. A wrong fact hurts credibility more than a missing one.
After fact-checking, review the entire article for AI writing patterns. This step is mandatory. Do NOT skip it.
Process:
web_search if needed (e.g. verify cited sources, check if phrasing is a known AI tell)AI writing patterns to catch and kill:
| Pattern | Example | Fix |
|---|---|---|
| Filler openers | "This isn't a hypothetical." / "Let's dive in." / "Here's the thing." | Delete or rewrite with substance |
| Buzzword conclusions | "liberating", "fundamental shift", "game-changer", "paradigm shift" | Use concrete language |
| Symmetric lists | "More important / Less important" with matching bullet counts | Break symmetry, use prose when possible |
| Hedging stacks | "It's worth noting that..." / "It's important to understand that..." | Just say the thing |
| Em dashes (—) | "AI tools — like Claude — can..." | Use periods, commas, or rewrite |
| Overly smooth transitions | "That said," / "With that in mind," / "Here's where it gets interesting:" | Cut or rephrase naturally |
| Gratuitous signposting | "Let's break this down." / "Here's what that looks like in practice:" | Delete, the reader can figure it out |
| Perfect parallel structure | Every section follows the exact same pattern/length | Vary rhythm and section lengths |
| Corporate passive voice | "It should be noted that improvements were observed" | Active voice, first person when appropriate |
| Fake enthusiasm | "incredibly powerful", "truly remarkable", "absolutely essential" | Tone down, be specific instead |
| Template FAQ | Generic Q&A that restates the article | Make answers add new info or perspective |
Tone targets:
Product mentions specifically:
Final check: Read the intro and conclusion out loud. If they sound like a LinkedIn post or a press release, rewrite them.
Convert the draft article into final format for your blog:
Convert images to webp: Use cwebp (preferred) or ffmpeg to convert all images from output/[slug]/images/ to webp format. Copy to your blog's image directory.
Create the article file with your blog's frontmatter format:
---
title: "..."
description: "..."
category: "guide"
tags: ["tag1", "tag2"]
publishedAt: "YYYY-MM-DD"
author: "Your Name"
image: "/blog/hero-image.webp"
imageAlt: "..."
draft: true
---
IMAGE_SLOT:xxx → /blog/xxx.webpGit commit & push:
cd your-project
git add content/blog/en/slug.mdx public/blog/*.webp
git commit -m "feat(blog): add EN article — slug"
git push origin main
Create translated versions of the article:
pairSlug in both articles' frontmatter pointing to each other (if your blog supports language switching)scripts/research-keyword.sh — Keyword research via DataForSEO API (requires DATAFORSEO_LOGIN + DATAFORSEO_PASSWORD env vars)brew install webp or apt install webp)