{"skill":{"slug":"seo-article-pipeline","displayName":"SEO Article Pipeline","summary":"End-to-end SEO article pipeline for any blog. Research keywords → analyze competition → write article → generate images → fact-check → humanize → assemble →...","description":"---\nname: seo-article-pipeline\ndescription: End-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.\nmetadata:\n  openclaw:\n    requires:\n      env: [\"DATAFORSEO_LOGIN\", \"DATAFORSEO_PASSWORD\"]\n---\n\n# SEO Article Pipeline\n\n## Setup\n\nBefore first use, configure your project in a `seo-config.md` file in your workspace:\n\n```markdown\n# SEO Pipeline Config\n\n## Product\n- **Name**: Your Product Name\n- **URL**: https://yourproduct.com\n- **Positioning**: One-line description of what you sell\n- **Differentiators**: What makes you different from competitors\n\n## Blog\n- **Articles path**: ./content/blog/{locale}/slug.mdx\n- **Images path**: ./public/blog/\n- **Repo**: ./\n- **Branch**: main\n- **Locales**: en, fr (add/remove as needed)\n\n## Brand Voice\n- **Tone**: Professional but direct (customize this)\n- **Person**: First person / Third person\n- **Avoid**: List words or patterns to avoid\n\n## Image Style\n- **Background**: #1a1a2e (customize)\n- **Accent color**: #e94560 (customize)\n- **Style**: Semi-flat illustration (customize)\n- **Always add**: \"No text, no words, no letters\"\n\n## CTA\n- **Component**: <YourCTAComponent /> (or markdown CTA block)\n- **Placement**: Top (after intro) + Bottom (before FAQ)\n```\n\nIf no config file exists, ask the user for these details before starting.\n\n## Pipeline Steps\n\n### Step 1: Research\nRun `scripts/research-keyword.sh \"keyword\" [lang] [location]` to get:\n- Search volume, CPC, competition\n- Related keywords (secondary targets for H2/H3)\n- Google Suggest queries\n\nDefault locations: `2840` (US), `2250` (France). Requires `DATAFORSEO_LOGIN` and `DATAFORSEO_PASSWORD` env vars.\n\n### Step 2: Analyze Competition\nSearch the target keyword on Google (web_search tool). Fetch the top 3-5 results (web_fetch). Note:\n- What they all cover (must include in our article)\n- What none cover (our differentiator)\n- Format and length\n- Their H2 structure\n\n### Step 2b: Topic Research\nBefore writing, research the actual subject in depth. Do NOT rely on model knowledge alone.\n\n**If the article is about your own product:**\n1. Read your own documentation. Scrape the relevant pages with `web_fetch` if they're online.\n2. Check the actual config options, features, limitations, and examples.\n3. If the article covers a specific feature, verify against source code or changelog if docs are incomplete.\n\n**If the article is about an external topic:**\n1. Search for **primary sources** first: official documentation, original research papers, company blogs, data reports. Avoid secondary blog posts that just rehash other articles.\n2. Run 5-10 targeted `web_search` queries from different angles (how-to, comparison, stats, problems, trends).\n3. Fetch and read the top 3-5 most authoritative sources (`web_fetch`).\n4. Look for real data: surveys, case studies, benchmarks, pricing pages, changelogs.\n5. Check community discussions (Reddit, Stack Overflow, GitHub issues) for real user pain points and questions.\n\n**Output: Research Brief**\nBefore moving to Step 3, compile a short research brief (in your working notes, not in the article):\n- Key facts and numbers collected (with sources)\n- Common user questions/pain points found\n- Gaps in existing content you can fill\n- Any claims you planned to make that turned out to be wrong or unverifiable\n\nThis brief feeds directly into writing. If your brief is thin, do more research — don't start writing.\n\n### Step 3: Write Article\nFollow `references/article-checklist.md` if it exists, otherwise use these defaults:\n\n#### 3a: Keyword Map (before writing)\nMap keywords to placement before you start:\n- **Primary keyword** → title, H1, intro (first 150 words), conclusion\n- **Secondary keywords** → H2 headings, body paragraphs\n- **LSI/Related terms** → sprinkle throughout naturally\n- **Question keywords** → FAQ section headings\n\n#### 3b: Title & Meta\n- **Title**: Generate 3 title options. For each, note character count and keyword position. Pick the best (keyword near start, under 60 chars, compelling).\n- **Meta description**: 150-160 chars, include primary keyword + a CTA or value prop.\n\n#### 3c: Write with CORE-EEAT Checklist\nApply these while writing (check each one off):\n\n**Content Quality:**\n- [ ] **Intent Alignment** — title promise matches content delivery exactly\n- [ ] **Direct Answer** — core answer/value in the first 150 words\n- [ ] **Query Coverage** — cover ≥3 query variants/synonyms of the target keyword\n- [ ] **Audience Targeting** — state who this article is for (e.g. \"If you're a developer looking to...\")\n- [ ] **Semantic Closure** — conclusion answers the opening question + gives concrete next steps\n\n**Structure & Readability:**\n- [ ] **Heading Hierarchy** — H1→H2→H3, never skip levels\n- [ ] **Summary Box** — include a TL;DR or \"Key Takeaways\" section near the top\n- [ ] **Data Tables** — put comparisons in tables, not paragraphs\n- [ ] **Section Chunking** — one topic per section, paragraphs 3-5 sentences max\n- [ ] **Information Density** — no filler, consistent terminology throughout\n\n**Credibility & Evidence:**\n- [ ] **Data Precision (HARD REQUIREMENT)** — include ≥5 precise numbers with units (not \"many users\" but \"12,000+ users\"). If you can't hit 5, research harder. Use web_search to find real stats. This is non-negotiable.\n- [ ] **Citation Density** — ≥1 external citation per 500 words\n- [ ] **Evidence-Claim Mapping** — every claim is backed by evidence or a source\n- [ ] **Entity Precision** — full names for people/orgs/products (never \"a company\" or \"a tool\")\n\n**Differentiation:**\n- [ ] **Gap Filling** — cover questions/angles that top competitors don't\n- [ ] **Practical Tools** — include at least one checklist, template, calculator, or decision framework\n\n#### 3d: Links & Snippet Optimization\n- **Internal links**: 2-5 to other blog articles, with descriptive anchor text (not \"click here\")\n- **External links (HARD REQUIREMENT)**: Minimum 3 external links to authoritative sources. Each must back a specific claim in the article. If you can't find 3 credible sources to link, your article lacks enough verifiable claims. Fix the content, not the link count.\n- **Featured snippets**: Format FAQ answers at 40-60 words. Use definition/list/table/how-to formats where applicable.\n\nArticle format (markdown with frontmatter):\n```markdown\n---\ntitle: \"Meta Title Here (60 chars max)\"\nslug: keyword-slug\ndescription: \"Meta description (155 chars max)\"\nkeywords: [primary, secondary1, secondary2]\nlang: en\ndate: YYYY-MM-DD\nreadingTime: X min\n---\n\n# H1 Title\n\nIntro (2-3 sentences, hook + value promise)\n\n[CTA: adapt text to article topic]\n\n## H2 sections...\n\n## FAQ\n**Q: question?**\nA: answer\n\n[CTA: bottom]\n```\n\nRules:\n- Use image placeholders: `![alt text](IMAGE_SLOT:description-of-needed-image)`\n- Include your CTA at top (after intro) and bottom\n- Adapt the CTA text to the article topic (never generic)\n- Naturally position your product where relevant, never force it\n- Cite stats with sources when possible\n- Internal links to other blog articles where relevant\n- Length: 1500-2500 words (pillar), 800-1200 (tier 2/3)\n\n### Step 4: Generate Images\nFor each `IMAGE_SLOT` in the article, generate an image using nano-banana-pro skill (or any available image generation tool).\n\nUse the image style defined in your `seo-config.md`. If no config exists, use a clean, professional SaaS style.\n\n**Always add to prompts**: \"No text, no words, no letters\"\n\nImage types:\n- **Hero**: Main visual for the article\n- **Infographic**: Data visualization, comparisons\n- **Workflow diagram**: \"How it works\" in 3-4 steps\n- **Screenshots**: Capture from relevant websites using agent-browser\n\nSave all generated images to `output/[slug]/images/` (staging area).\n\n### Step 4b: SEO Self-Score\nAfter writing (before fact-check), score the article on these 10 factors. Each is 0 or 1. Target: ≥8/10.\n\n| # | Factor | Check |\n|---|--------|-------|\n| 1 | **Title** | Primary keyword present, under 60 chars, compelling |\n| 2 | **Meta description** | 150-160 chars, keyword + CTA |\n| 3 | **H1** | Contains target keyword, matches search intent |\n| 4 | **Keyword placement** | Primary keyword in intro, ≥1 H2, conclusion |\n| 5 | **H2 structure** | Secondary keywords in H2s, logical hierarchy |\n| 6 | **Internal links** | 2-5 with descriptive anchor text |\n| 7 | **External links** | ≥3 to authoritative sources (BLOCKER if < 3) |\n| 8 | **FAQ section** | ≥3 questions, answers 40-60 words, snippet-ready |\n| 9 | **Readability** | Short paragraphs, tables for data, no filler |\n| 10 | **Word count** | 1500-2500 (pillar) or 800-1200 (supporting) |\n\nIf score < 8, fix the weak areas before proceeding.\n\n### Step 4c: Fact-Check\nBefore assembling, verify all factual claims in the article.\n\n**Process:**\n0. **Research first**: Before writing OR fact-checking, actively look up information you're unsure about. Use `web_search` and `web_fetch` to:\n   - Read official documentation for any product/tool you mention\n   - Check pricing pages for current prices\n   - Verify stats and numbers from primary sources\n   - Read existing top-ranking articles on the keyword for accuracy\n   - Fetch GitHub repos, changelogs, or release notes when citing features\n   Don't rely on memory alone. If you're not 100% sure of a fact, look it up before including it.\n1. **Identify claims**: Extract every specific factual assertion (stats, features, pricing, technical details, company info, tool capabilities)\n2. **Classify by source**:\n   - **Product claims**: verify against official docs/websites\n   - **Stats/numbers**: verify against a live source or remove\n   - **Technical claims**: verify against official documentation\n   - **Pricing**: verify against the product's current pricing page\n   - **Community anecdotes**: mark as anecdotal or remove if presented as fact\n3. **Verify or fix**:\n   - ✅ Confirmed: keep as-is\n   - ❌ False: correct with verified info\n   - ⚠️ Unverifiable: either (a) soften the language (\"reportedly\", \"according to community reports\"), (b) remove the claim, or (c) add a source\n4. **Cross-article consistency**: If the article references facts from other blog articles, ensure numbers match. Never invent specific numbers.\n\n**Common pitfalls:**\n- GitHub star counts (change daily, never hardcode)\n- Plugin/integration counts on marketplaces\n- Specific performance claims\n- Config syntax (must match official docs)\n- Competitor pricing (check their website, not memory)\n\n**Rule: When in doubt, leave it out.** A wrong fact hurts credibility more than a missing one.\n\n### Step 4d: AI-Tone Check & Humanize\nAfter fact-checking, review the entire article for AI writing patterns. This step is mandatory. Do NOT skip it.\n\n**Process:**\n1. **Read the full article** and flag every sentence/section that sounds AI-generated\n2. **Search for each flagged pattern** using `web_search` if needed (e.g. verify cited sources, check if phrasing is a known AI tell)\n3. **Rewrite flagged sections** to sound human, direct, and natural\n4. **Re-read after fixes** to make sure the article flows as a whole\n\n**AI writing patterns to catch and kill:**\n\n| Pattern | Example | Fix |\n|---------|---------|-----|\n| Filler openers | \"This isn't a hypothetical.\" / \"Let's dive in.\" / \"Here's the thing.\" | Delete or rewrite with substance |\n| Buzzword conclusions | \"liberating\", \"fundamental shift\", \"game-changer\", \"paradigm shift\" | Use concrete language |\n| Symmetric lists | \"More important / Less important\" with matching bullet counts | Break symmetry, use prose when possible |\n| Hedging stacks | \"It's worth noting that...\" / \"It's important to understand that...\" | Just say the thing |\n| Em dashes (—) | \"AI tools — like Claude — can...\" | Use periods, commas, or rewrite |\n| Overly smooth transitions | \"That said,\" / \"With that in mind,\" / \"Here's where it gets interesting:\" | Cut or rephrase naturally |\n| Gratuitous signposting | \"Let's break this down.\" / \"Here's what that looks like in practice:\" | Delete, the reader can figure it out |\n| Perfect parallel structure | Every section follows the exact same pattern/length | Vary rhythm and section lengths |\n| Corporate passive voice | \"It should be noted that improvements were observed\" | Active voice, first person when appropriate |\n| Fake enthusiasm | \"incredibly powerful\", \"truly remarkable\", \"absolutely essential\" | Tone down, be specific instead |\n| Template FAQ | Generic Q&A that restates the article | Make answers add new info or perspective |\n\n**Tone targets:**\n- Write like a practitioner sharing experience, not a content marketer optimizing for engagement\n- First person is fine and often better than third person\n- Short sentences mixed with longer ones (vary rhythm)\n- Concrete > abstract. Numbers > adjectives. Examples > claims.\n- If a section reads like it could be in any article on any topic, it's too generic. Make it specific.\n\n**Product mentions specifically:**\n- Must feel earned, not forced. If an example feels like a detour just to mention your product, reframe or cut it.\n- The best product mentions solve the same problem the article discusses. If the connection isn't obvious, don't force it.\n\n**Final check:** Read the intro and conclusion out loud. If they sound like a LinkedIn post or a press release, rewrite them.\n\n### Step 5: Assemble\nConvert the draft article into final format for your blog:\n\n1. **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.\n\n2. **Create the article file** with your blog's frontmatter format:\n   ```yaml\n   ---\n   title: \"...\"\n   description: \"...\"\n   category: \"guide\"\n   tags: [\"tag1\", \"tag2\"]\n   publishedAt: \"YYYY-MM-DD\"\n   author: \"Your Name\"\n   image: \"/blog/hero-image.webp\"\n   imageAlt: \"...\"\n   draft: true\n   ---\n   ```\n   - Remove the H1 title if your blog template displays it automatically\n   - Replace image paths: `IMAGE_SLOT:xxx` → `/blog/xxx.webp`\n   - Add your CTA component at the top if applicable\n   - Inline images: `![alt](/blog/image-name.webp)`\n\n3. **Git commit & push**:\n   ```bash\n   cd your-project\n   git add content/blog/en/slug.mdx public/blog/*.webp\n   git commit -m \"feat(blog): add EN article — slug\"\n   git push origin main\n   ```\n\n### Step 6: Translate\nCreate translated versions of the article:\n\n1. Translate naturally (not literally) to target language\n2. **Slug must be in the target language.** Not the English slug in a different folder.\n   - Rules: lowercase, no accents in slugs, short and descriptive\n3. Save to the appropriate locale folder with translated frontmatter (title, description, imageAlt, slug)\n4. Keep the same image paths (images are shared between locales)\n5. Add `pairSlug` in both articles' frontmatter pointing to each other (if your blog supports language switching)\n6. Git commit & push\n\n## Scripts\n- `scripts/research-keyword.sh` — Keyword research via DataForSEO API (requires DATAFORSEO_LOGIN + DATAFORSEO_PASSWORD env vars)\n\n## Requirements\n- **DataForSEO account** for keyword research (free tier available)\n- **Image generation tool** (nano-banana-pro skill recommended, or any image gen)\n- **cwebp** for image conversion (`brew install webp` or `apt install webp`)\n- **Git** for version control\n","topics":["Pipeline"],"tags":{"article":"1.1.2","blog":"1.1.2","content":"1.1.2","eeat":"1.1.2","fact-check":"1.1.2","humanize":"1.1.2","keyword-research":"1.1.2","latest":"1.1.2","pipeline":"1.1.2","seo":"1.1.2","translation":"1.1.2","writing":"1.1.2","marketing":"1.0.1"},"stats":{"comments":0,"downloads":628,"installsAllTime":24,"installsCurrent":1,"stars":1,"versions":5},"createdAt":1772727087958,"updatedAt":1778491738336},"latestVersion":{"version":"1.1.2","createdAt":1772733276309,"changelog":"- Added structured metadata in SKILL.md to declare required environment variables: `DATAFORSEO_LOGIN` and `DATAFORSEO_PASSWORD`\n- No functional or content changes to the pipeline itself","license":null},"metadata":{"setup":[{"key":"DATAFORSEO_LOGIN","required":true},{"key":"DATAFORSEO_PASSWORD","required":true}],"os":null,"systems":null},"owner":{"handle":"nirusan","userId":"s175qcas3980xpan8r9f3fmmdn83ncy9","displayName":"Jean-Solopreneur","image":"https://avatars.githubusercontent.com/u/26328098?v=4"},"moderation":null}