Install
openclaw skills install cook-a-skill-content-blog-socialFull end-to-end SEO + GEO content creation pipeline for crypto/Web3 teams. Trigger this skill when the user wants to: write a blog post or article, research...
openclaw skills install cook-a-skill-content-blog-socialEnd-to-end pipeline: trending topic → keyword research → brief → UGC enrichment → human-style draft → visual & link enrichment → SEO + GEO optimization → scored QA report.
[0] X TREND MONITOR → auto-run on session start, propose hot keywords
[1] KEYWORD RESEARCH → scored, data-backed selection
[2] CONTENT BRIEF → outline + keyword map + UGC insertion points
[3] UGC ENRICHMENT → mine comments → ready-to-paste blog sections
[4] DRAFT → human-style, data-backed, zero AI patterns
[4.5] VISUAL & LINKS → data charts (matplotlib) + inline hyperlinks on every citation
[5] SEO + GEO → on-page checklist + AI-bot-friendly formatting
[6] QA REPORT → rubric score + publish verdict
Enter at any stage. Run all stages from scratch. Start at Stage 5 for existing drafts.
Quick commands:
run full pipeline → Stage 0 → Stage 6start from stage [N] → enter at any stagescore my draft → Stage 5 → Stage 6enrich my draft → Stage 4.5 only (charts + links on existing draft)Reference files (read when detail is needed):
references/scoring-rubrics.md — all scoring tables (trend, keyword, UGC, SEO, GEO)references/ai-patterns-blacklist.md — full list of AI phrases to never writereferences/output-templates.md — exact output format for each stagereferences/example-run.md — real example: keyword "what is liquid staking"Required: project_spec (.md) + keyword_or_topic
Optional: ugc_urls (skip Stage 3 if absent), blog_draft, language (default: English), word_count (default: 1500–2000), tone (default: auto-detect from spec)
If project_spec is missing: stop and ask for it before starting.
Run automatically at the start of every new session, before the user says anything.
project_spec.md → extract: domain/niche, audience, product themes, competitor namessite:x.com [domain keyword] -filter:replies[domain keyword] trending twitter 2025[domain keyword] discussion OR debate twitter[competitor name] twitter sentiment 2025crypto twitter trending today[domain keyword] CT crypto twitter discussionreferences/scoring-rubrics.md Stage 0references/output-templates.md Stage 0Fallback if web search off: skip, say "Stage 0 unavailable. Provide a keyword to start Stage 1." Fallback if no trends found: list 3 evergreen topics from spec context.
google trends [keyword] 2025 → directionsite:x.com [keyword] + [keyword] trending twitter 2025 → buzz + debate angle[keyword] search volume 2025 + ubersuggest [keyword] → volume estimate[keyword] → extract People Also Ask + Related Searchesreferences/scoring-rubrics.md Stage 1[estimated].references/output-templates.md Stage 1Edge cases: keyword too broad → suggest 3–5 long-tail alternatives. Doesn't match spec → warn + confirm.
← UGC: community counterpoints / ← UGC: case studies / ← UGC: FAQreferences/output-templates.md Stage 2FAQ section: minimum 5 entries. Mandatory for GEO.
Skip if no ugc_urls. Note "UGC: Missing" in QA report.
Why it matters: Reddit ~21% of Google AI Overview citations. Real UGC = 2–3x AI search visibility. E-E-A-T "Experience" signal = cannot be faked by AI content.
For each URL:
web_fetch → extract post body + all comments with engagement metrics
references/scoring-rubrics.md Stage 3references/output-templates.md Stage 3Hard rules: never fabricate, never include usernames, never include spam/memes, max 6 FAQs + 4 case studies.
Edge cases: <10 comments → warn "limited data". All score <3 → "No high-value comments, try different URL."
Write full article: follow Stage 2 outline exactly, insert Stage 3 UGC blocks at flagged points.
Before writing: write Meta Title (≤60 chars, primary keyword near front) + Meta Description (≤160 chars, primary keyword + hook)
Intro: specific fact or bold claim opener. Primary keyword within first 100 words. Write featured snippet candidate block (40–60 words, direct definition or numbered steps) — place within first H2.
Body: answer-first each H2 (1–2 sentence direct answer before elaboration). Min 1 data point per major section. Find real stats first: search [topic] statistics 2025. If unavailable: [DATA NEEDED: search "[query]"]. Source format: stat — Source, Year. UGC blocks at exact insertion points.
Data minimum: 3 data points total per article. Never invent statistics.
Paragraphs: 3–4 lines max. Define technical terms inline on first use.
AI patterns: never write any phrase from references/ai-patterns-blacklist.md. If caught: stop, rewrite with fact or direct claim.
Conclusion: synthesize 2–3 takeaways. Do not restate all H2s as bullet points. Specific CTA.
Internal links: suggest 2–3, anchor text uses secondary keywords.
Output format → see references/output-templates.md Stage 4
Runs automatically after Stage 4 is complete. Cannot be skipped — required for publish-ready output.
— Source, Year is a missed E-E-A-T trust signalScan the draft for data points that meet at least one of these criteria:
| Criterion | Example |
|---|---|
| Change over time (2+ periods) | "TVL grew from $2B to $8B in 6 months" |
| Compares 2+ assets or metrics | "Lido APY 3.8% vs solo staking 3.2%" |
| Inflow / outflow trend | "$1.2B ETF inflows in Q1 2025" |
| Index or score over time | "Fear & Greed Index: 12/100" |
| Ratio that changed | "ETH staking ratio: 18% → 27% in 12 months" |
| 3+ data points in a series | Monthly DEX volume figures |
Chart types by data shape:
| Data type | Chart type |
|---|---|
| Performance over time | Line chart with fill-under |
| Inflows / outflows | Bar chart — green positive, red negative |
| Index or score over time | Bar chart with color-coded zones |
| Ratio or comparison over time | Line or area chart |
| Single-point comparison | Horizontal bar or stat callout box |
Chart design standards (apply to every chart):
#F7F7F7 (light gray), no heavy gridlines#E8650A (orange, default for crypto/Web3 — adjust to project brand if spec defines one)Source: [Name] | [Notes]Maximum 6 charts per article. More than 6 slows page load. Excess data points → stat callout boxes instead.
If no qualifying data points found: output a styled stat callout box for that statistic instead of a chart.
Use Python + matplotlib. Execute in the computing environment.
For each chart, produce:
Chart [N]: [What it shows]. [Time period]. Sources: [Name].[Chart type] showing [metric] from [start] to [end]. [Key finding in one sentence].Place each chart immediately after the paragraph that first introduces its data. Never stack two charts back-to-back without body text between them.
Scan the entire draft for every inline source citation. Patterns to find:
| Pattern | Example |
|---|---|
— [Source, Year] | — CoinDesk, Jan 2025 |
per [Source] | per DeFiLlama |
according to [Source] | according to Messari |
[Source] reports | Dune Analytics reports |
([Source]) | (CoinGecko) |
For each citation:
[publication] [topic] [approximate date][VERIFY URL][SOURCE NEEDED] — never invent a sourceLink rules:
Append this block to the enriched draft:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
STAGE 4.5 — VISUAL & LINK ENRICHMENT SUMMARY
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Charts generated: [N] / [max 6]
- Chart 1: [title] → placed after [section name]
- Chart 2: [title] → placed after [section name]
Source links resolved: [N] / [total citations found]
- [Source name] → [URL] ✅
- [Source name] → [URL] ⚠️ [VERIFY URL — linked to homepage]
Unlinked citations flagged: [N]
- "[claim]" → [SOURCE NEEDED]
Alt text strings:
Chart 1: "[alt text]"
Chart 2: "[alt text]"
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
GEO = Generative Engine Optimization. Goal: easy for Perplexity, Google SGE, ChatGPT Search to parse and cite.
number unit — Source, Year, no pronoun ambiguityGEO output block → see references/output-templates.md Stage 5
Scoring rubric → see references/scoring-rubrics.md Stage 5
Score using 100-point rubric → see references/scoring-rubrics.md Stage 6
Thresholds: 85–100 = Publish-ready | 70–84 = Minor fixes | Below 70 = Needs revision
Output format → see references/output-templates.md Stage 6
| Case | Action |
|---|---|
project_spec missing | Stop. Ask for spec before starting. |
| Keyword too broad | Stop. Suggest 3–5 long-tail alternatives. Wait for choice. |
| Keyword doesn't match spec | Warn. Ask for confirmation. |
| Deep technical content | Flag [SME REVIEW]. Never fabricate. |
| User requests Vietnamese | Switch all output to Vietnamese. Same formats. |
| Word count <500 or >5000 | Warn. Recommend 800–2500. |
| SEO score below 70 | List specific fixes with section references. |
| Web search unavailable | Skip Stage 0. Flag affected stages. Fall back to training knowledge, label [estimated]. |
| UGC URL behind login wall | Skip URL. Ask: "Paste comment text directly." |
| No high-value UGC comments | "No high-value comments. Try a different URL." |
| No ugc_urls provided | Skip Stage 3. Mark UGC = Missing in QA. |
| Stage 0 finds no trends | List 3 evergreen topics from spec context. |
| User enters mid-pipeline | Start at appropriate stage. Ask what they have. |
| Stage 4.5: no chart-worthy data | Output stat callout boxes for all key numbers. Flag: "No time-series or comparison data found — consider adding benchmark data in Stage 4 revision." |
| Stage 4.5: more than 6 chart-worthy points | Prioritize: (1) comparisons, (2) trends, (3) index scores. Remainder → stat callout boxes. |
| Stage 4.5: all source URLs paywalled | Link to publisher homepages. Flag every instance [VERIFY URL]. List all in enrichment summary. |
| Stage 4.5: source article not found | Link to publication homepage + flag [SOURCE NEEDED — could not verify]. |
| Stage 4.5: citation is vague ("analysts say") | Flag [SOURCE NEEDED]. Never invent a source. |
| Stage 4.5: web search unavailable | Skip link resolution. Flag all citations [HYPERLINK NEEDED — web search off]. Charts still generated from in-draft data. |
[VERIFY], [DATA NEEDED], [SOURCE NEEDED], and [VERIFY URL] flags require human review before publishing