SEO Article Pipeline
Setup
Before 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.
Pipeline Steps
Step 1: Research
Run scripts/research-keyword.sh "keyword" [lang] [location] to get:
- Search volume, CPC, competition
- Related keywords (secondary targets for H2/H3)
- Google Suggest queries
Default locations: 2840 (US), 2250 (France). Requires DATAFORSEO_LOGIN and DATAFORSEO_PASSWORD env vars.
Step 2: Analyze Competition
Search the target keyword on Google (web_search tool). Fetch the top 3-5 results (web_fetch). Note:
- What they all cover (must include in our article)
- What none cover (our differentiator)
- Format and length
- Their H2 structure
Step 2b: Topic Research
Before writing, research the actual subject in depth. Do NOT rely on model knowledge alone.
If the article is about your own product:
- Read your own documentation. Scrape the relevant pages with
web_fetch if they're online.
- Check the actual config options, features, limitations, and examples.
- If the article covers a specific feature, verify against source code or changelog if docs are incomplete.
If the article is about an external topic:
- Search for primary sources first: official documentation, original research papers, company blogs, data reports. Avoid secondary blog posts that just rehash other articles.
- Run 5-10 targeted
web_search queries from different angles (how-to, comparison, stats, problems, trends).
- Fetch and read the top 3-5 most authoritative sources (
web_fetch).
- Look for real data: surveys, case studies, benchmarks, pricing pages, changelogs.
- Check community discussions (Reddit, Stack Overflow, GitHub issues) for real user pain points and questions.
Output: Research Brief
Before moving to Step 3, compile a short research brief (in your working notes, not in the article):
- Key facts and numbers collected (with sources)
- Common user questions/pain points found
- Gaps in existing content you can fill
- Any claims you planned to make that turned out to be wrong or unverifiable
This brief feeds directly into writing. If your brief is thin, do more research — don't start writing.
Step 3: Write Article
Follow references/article-checklist.md if it exists, otherwise use these defaults:
3a: Keyword Map (before writing)
Map keywords to placement before you start:
- Primary keyword → title, H1, intro (first 150 words), conclusion
- Secondary keywords → H2 headings, body paragraphs
- LSI/Related terms → sprinkle throughout naturally
- Question keywords → FAQ section headings
3b: Title & Meta
- Title: Generate 3 title options. For each, note character count and keyword position. Pick the best (keyword near start, under 60 chars, compelling).
- Meta description: 150-160 chars, include primary keyword + a CTA or value prop.
3c: Write with CORE-EEAT Checklist
Apply these while writing (check each one off):
Content Quality:
Structure & Readability:
Credibility & Evidence:
Differentiation:
3d: Links & Snippet Optimization
- Internal links: 2-5 to other blog articles, with descriptive anchor text (not "click here")
- 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.
- Featured snippets: Format FAQ answers at 40-60 words. Use definition/list/table/how-to formats where applicable.
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:
- Use image placeholders:

- Include your CTA at top (after intro) and bottom
- Adapt the CTA text to the article topic (never generic)
- Naturally position your product where relevant, never force it
- Cite stats with sources when possible
- Internal links to other blog articles where relevant
- Length: 1500-2500 words (pillar), 800-1200 (tier 2/3)
Step 4: Generate Images
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:
- Hero: Main visual for the article
- Infographic: Data visualization, comparisons
- Workflow diagram: "How it works" in 3-4 steps
- Screenshots: Capture from relevant websites using agent-browser
Save all generated images to output/[slug]/images/ (staging area).
Step 4b: SEO Self-Score
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.
Step 4c: Fact-Check
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:
- Read official documentation for any product/tool you mention
- Check pricing pages for current prices
- Verify stats and numbers from primary sources
- Read existing top-ranking articles on the keyword for accuracy
- Fetch GitHub repos, changelogs, or release notes when citing features
Don't rely on memory alone. If you're not 100% sure of a fact, look it up before including it.
- Identify claims: Extract every specific factual assertion (stats, features, pricing, technical details, company info, tool capabilities)
- Classify by source:
- Product claims: verify against official docs/websites
- Stats/numbers: verify against a live source or remove
- Technical claims: verify against official documentation
- Pricing: verify against the product's current pricing page
- Community anecdotes: mark as anecdotal or remove if presented as fact
- Verify or fix:
- ✅ Confirmed: keep as-is
- ❌ False: correct with verified info
- ⚠️ Unverifiable: either (a) soften the language ("reportedly", "according to community reports"), (b) remove the claim, or (c) add a source
- Cross-article consistency: If the article references facts from other blog articles, ensure numbers match. Never invent specific numbers.
Common pitfalls:
- GitHub star counts (change daily, never hardcode)
- Plugin/integration counts on marketplaces
- Specific performance claims
- Config syntax (must match official docs)
- Competitor pricing (check their website, not memory)
Rule: When in doubt, leave it out. A wrong fact hurts credibility more than a missing one.
Step 4d: AI-Tone Check & Humanize
After fact-checking, review the entire article for AI writing patterns. This step is mandatory. Do NOT skip it.
Process:
- Read the full article and flag every sentence/section that sounds AI-generated
- Search for each flagged pattern using
web_search if needed (e.g. verify cited sources, check if phrasing is a known AI tell)
- Rewrite flagged sections to sound human, direct, and natural
- Re-read after fixes to make sure the article flows as a whole
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:
- Write like a practitioner sharing experience, not a content marketer optimizing for engagement
- First person is fine and often better than third person
- Short sentences mixed with longer ones (vary rhythm)
- Concrete > abstract. Numbers > adjectives. Examples > claims.
- If a section reads like it could be in any article on any topic, it's too generic. Make it specific.
Product mentions specifically:
- Must feel earned, not forced. If an example feels like a detour just to mention your product, reframe or cut it.
- The best product mentions solve the same problem the article discusses. If the connection isn't obvious, don't force it.
Final check: Read the intro and conclusion out loud. If they sound like a LinkedIn post or a press release, rewrite them.
Step 5: Assemble
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
---
- Remove the H1 title if your blog template displays it automatically
- Replace image paths:
IMAGE_SLOT:xxx → /blog/xxx.webp
- Add your CTA component at the top if applicable
- Inline images:

Git 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
Step 6: Translate
Create translated versions of the article:
- Translate naturally (not literally) to target language
- Slug must be in the target language. Not the English slug in a different folder.
- Rules: lowercase, no accents in slugs, short and descriptive
- Save to the appropriate locale folder with translated frontmatter (title, description, imageAlt, slug)
- Keep the same image paths (images are shared between locales)
- Add
pairSlug in both articles' frontmatter pointing to each other (if your blog supports language switching)
- Git commit & push
Scripts
scripts/research-keyword.sh — Keyword research via DataForSEO API (requires DATAFORSEO_LOGIN + DATAFORSEO_PASSWORD env vars)
Requirements
- DataForSEO account for keyword research (free tier available)
- Image generation tool (nano-banana-pro skill recommended, or any image gen)
- cwebp for image conversion (
brew install webp or apt install webp)
- Git for version control
1---2name: seo-article-pipeline-73description: 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.4---56# SEO Article Pipeline78## Setup910Before first use, configure your project in a `seo-config.md` file in your workspace:1112```markdown13# SEO Pipeline Config1415## Product16- **Name**: Your Product Name17- **URL**: https://yourproduct.com18- **Positioning**: One-line description of what you sell19- **Differentiators**: What makes you different from competitors2021## Blog22- **Articles path**: ./content/blog/{locale}/slug.mdx23- **Images path**: ./public/blog/24- **Repo**: ./25- **Branch**: main26- **Locales**: en, fr (add/remove as needed)2728## Brand Voice29- **Tone**: Professional but direct (customize this)30- **Person**: First person / Third person31- **Avoid**: List words or patterns to avoid3233## Image Style34- **Background**: #1a1a2e (customize)35- **Accent color**: #e94560 (customize)36- **Style**: Semi-flat illustration (customize)37- **Always add**: "No text, no words, no letters"3839## CTA40- **Component**: <YourCTAComponent /> (or markdown CTA block)41- **Placement**: Top (after intro) + Bottom (before FAQ)42```4344If no config file exists, ask the user for these details before starting.4546## Pipeline Steps4748### Step 1: Research49Run `scripts/research-keyword.sh "keyword" [lang] [location]` to get:50- Search volume, CPC, competition51- Related keywords (secondary targets for H2/H3)52- Google Suggest queries5354Default locations: `2840` (US), `2250` (France). Requires `DATAFORSEO_LOGIN` and `DATAFORSEO_PASSWORD` env vars.5556### Step 2: Analyze Competition57Search the target keyword on Google (web_search tool). Fetch the top 3-5 results (web_fetch). Note:58- What they all cover (must include in our article)59- What none cover (our differentiator)60- Format and length61- Their H2 structure6263### Step 2b: Topic Research64Before writing, research the actual subject in depth. Do NOT rely on model knowledge alone.6566**If the article is about your own product:**671. Read your own documentation. Scrape the relevant pages with `web_fetch` if they're online.682. Check the actual config options, features, limitations, and examples.693. If the article covers a specific feature, verify against source code or changelog if docs are incomplete.7071**If the article is about an external topic:**721. Search for **primary sources** first: official documentation, original research papers, company blogs, data reports. Avoid secondary blog posts that just rehash other articles.732. Run 5-10 targeted `web_search` queries from different angles (how-to, comparison, stats, problems, trends).743. Fetch and read the top 3-5 most authoritative sources (`web_fetch`).754. Look for real data: surveys, case studies, benchmarks, pricing pages, changelogs.765. Check community discussions (Reddit, Stack Overflow, GitHub issues) for real user pain points and questions.7778**Output: Research Brief**79Before moving to Step 3, compile a short research brief (in your working notes, not in the article):80- Key facts and numbers collected (with sources)81- Common user questions/pain points found82- Gaps in existing content you can fill83- Any claims you planned to make that turned out to be wrong or unverifiable8485This brief feeds directly into writing. If your brief is thin, do more research — don't start writing.8687### Step 3: Write Article88Follow `references/article-checklist.md` if it exists, otherwise use these defaults:8990#### 3a: Keyword Map (before writing)91Map keywords to placement before you start:92- **Primary keyword** → title, H1, intro (first 150 words), conclusion93- **Secondary keywords** → H2 headings, body paragraphs94- **LSI/Related terms** → sprinkle throughout naturally95- **Question keywords** → FAQ section headings9697#### 3b: Title & Meta98- **Title**: Generate 3 title options. For each, note character count and keyword position. Pick the best (keyword near start, under 60 chars, compelling).99- **Meta description**: 150-160 chars, include primary keyword + a CTA or value prop.100101#### 3c: Write with CORE-EEAT Checklist102Apply these while writing (check each one off):103104**Content Quality:**105- [ ] **Intent Alignment** — title promise matches content delivery exactly106- [ ] **Direct Answer** — core answer/value in the first 150 words107- [ ] **Query Coverage** — cover ≥3 query variants/synonyms of the target keyword108- [ ] **Audience Targeting** — state who this article is for (e.g. "If you're a developer looking to...")109- [ ] **Semantic Closure** — conclusion answers the opening question + gives concrete next steps110111**Structure & Readability:**112- [ ] **Heading Hierarchy** — H1→H2→H3, never skip levels113- [ ] **Summary Box** — include a TL;DR or "Key Takeaways" section near the top114- [ ] **Data Tables** — put comparisons in tables, not paragraphs115- [ ] **Section Chunking** — one topic per section, paragraphs 3-5 sentences max116- [ ] **Information Density** — no filler, consistent terminology throughout117118**Credibility & Evidence:**119- [ ] **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.120- [ ] **Citation Density** — ≥1 external citation per 500 words121- [ ] **Evidence-Claim Mapping** — every claim is backed by evidence or a source122- [ ] **Entity Precision** — full names for people/orgs/products (never "a company" or "a tool")123124**Differentiation:**125- [ ] **Gap Filling** — cover questions/angles that top competitors don't126- [ ] **Practical Tools** — include at least one checklist, template, calculator, or decision framework127128#### 3d: Links & Snippet Optimization129- **Internal links**: 2-5 to other blog articles, with descriptive anchor text (not "click here")130- **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.131- **Featured snippets**: Format FAQ answers at 40-60 words. Use definition/list/table/how-to formats where applicable.132133Article format (markdown with frontmatter):134```markdown135---136title: "Meta Title Here (60 chars max)"137slug: keyword-slug138description: "Meta description (155 chars max)"139keywords: [primary, secondary1, secondary2]140lang: en141date: YYYY-MM-DD142readingTime: X min143---144145# H1 Title146147Intro (2-3 sentences, hook + value promise)148149[CTA: adapt text to article topic]150151## H2 sections...152153## FAQ154**Q: question?**155A: answer156157[CTA: bottom]158```159160Rules:161- Use image placeholders: ``162- Include your CTA at top (after intro) and bottom163- Adapt the CTA text to the article topic (never generic)164- Naturally position your product where relevant, never force it165- Cite stats with sources when possible166- Internal links to other blog articles where relevant167- Length: 1500-2500 words (pillar), 800-1200 (tier 2/3)168169### Step 4: Generate Images170For each `IMAGE_SLOT` in the article, generate an image using nano-banana-pro skill (or any available image generation tool).171172Use the image style defined in your `seo-config.md`. If no config exists, use a clean, professional SaaS style.173174**Always add to prompts**: "No text, no words, no letters"175176Image types:177- **Hero**: Main visual for the article178- **Infographic**: Data visualization, comparisons179- **Workflow diagram**: "How it works" in 3-4 steps180- **Screenshots**: Capture from relevant websites using agent-browser181182Save all generated images to `output/[slug]/images/` (staging area).183184### Step 4b: SEO Self-Score185After writing (before fact-check), score the article on these 10 factors. Each is 0 or 1. Target: ≥8/10.186187| # | Factor | Check |188|---|--------|-------|189| 1 | **Title** | Primary keyword present, under 60 chars, compelling |190| 2 | **Meta description** | 150-160 chars, keyword + CTA |191| 3 | **H1** | Contains target keyword, matches search intent |192| 4 | **Keyword placement** | Primary keyword in intro, ≥1 H2, conclusion |193| 5 | **H2 structure** | Secondary keywords in H2s, logical hierarchy |194| 6 | **Internal links** | 2-5 with descriptive anchor text |195| 7 | **External links** | ≥3 to authoritative sources (BLOCKER if < 3) |196| 8 | **FAQ section** | ≥3 questions, answers 40-60 words, snippet-ready |197| 9 | **Readability** | Short paragraphs, tables for data, no filler |198| 10 | **Word count** | 1500-2500 (pillar) or 800-1200 (supporting) |199200If score < 8, fix the weak areas before proceeding.201202### Step 4c: Fact-Check203Before assembling, verify all factual claims in the article.204205**Process:**2060. **Research first**: Before writing OR fact-checking, actively look up information you're unsure about. Use `web_search` and `web_fetch` to:207 - Read official documentation for any product/tool you mention208 - Check pricing pages for current prices209 - Verify stats and numbers from primary sources210 - Read existing top-ranking articles on the keyword for accuracy211 - Fetch GitHub repos, changelogs, or release notes when citing features212 Don't rely on memory alone. If you're not 100% sure of a fact, look it up before including it.2131. **Identify claims**: Extract every specific factual assertion (stats, features, pricing, technical details, company info, tool capabilities)2142. **Classify by source**:215 - **Product claims**: verify against official docs/websites216 - **Stats/numbers**: verify against a live source or remove217 - **Technical claims**: verify against official documentation218 - **Pricing**: verify against the product's current pricing page219 - **Community anecdotes**: mark as anecdotal or remove if presented as fact2203. **Verify or fix**:221 - ✅ Confirmed: keep as-is222 - ❌ False: correct with verified info223 - ⚠️ Unverifiable: either (a) soften the language ("reportedly", "according to community reports"), (b) remove the claim, or (c) add a source2244. **Cross-article consistency**: If the article references facts from other blog articles, ensure numbers match. Never invent specific numbers.225226**Common pitfalls:**227- GitHub star counts (change daily, never hardcode)228- Plugin/integration counts on marketplaces229- Specific performance claims230- Config syntax (must match official docs)231- Competitor pricing (check their website, not memory)232233**Rule: When in doubt, leave it out.** A wrong fact hurts credibility more than a missing one.234235### Step 4d: AI-Tone Check & Humanize236After fact-checking, review the entire article for AI writing patterns. This step is mandatory. Do NOT skip it.237238**Process:**2391. **Read the full article** and flag every sentence/section that sounds AI-generated2402. **Search for each flagged pattern** using `web_search` if needed (e.g. verify cited sources, check if phrasing is a known AI tell)2413. **Rewrite flagged sections** to sound human, direct, and natural2424. **Re-read after fixes** to make sure the article flows as a whole243244**AI writing patterns to catch and kill:**245246| Pattern | Example | Fix |247|---------|---------|-----|248| Filler openers | "This isn't a hypothetical." / "Let's dive in." / "Here's the thing." | Delete or rewrite with substance |249| Buzzword conclusions | "liberating", "fundamental shift", "game-changer", "paradigm shift" | Use concrete language |250| Symmetric lists | "More important / Less important" with matching bullet counts | Break symmetry, use prose when possible |251| Hedging stacks | "It's worth noting that..." / "It's important to understand that..." | Just say the thing |252| Em dashes (—) | "AI tools — like Claude — can..." | Use periods, commas, or rewrite |253| Overly smooth transitions | "That said," / "With that in mind," / "Here's where it gets interesting:" | Cut or rephrase naturally |254| Gratuitous signposting | "Let's break this down." / "Here's what that looks like in practice:" | Delete, the reader can figure it out |255| Perfect parallel structure | Every section follows the exact same pattern/length | Vary rhythm and section lengths |256| Corporate passive voice | "It should be noted that improvements were observed" | Active voice, first person when appropriate |257| Fake enthusiasm | "incredibly powerful", "truly remarkable", "absolutely essential" | Tone down, be specific instead |258| Template FAQ | Generic Q&A that restates the article | Make answers add new info or perspective |259260**Tone targets:**261- Write like a practitioner sharing experience, not a content marketer optimizing for engagement262- First person is fine and often better than third person263- Short sentences mixed with longer ones (vary rhythm)264- Concrete > abstract. Numbers > adjectives. Examples > claims.265- If a section reads like it could be in any article on any topic, it's too generic. Make it specific.266267**Product mentions specifically:**268- Must feel earned, not forced. If an example feels like a detour just to mention your product, reframe or cut it.269- The best product mentions solve the same problem the article discusses. If the connection isn't obvious, don't force it.270271**Final check:** Read the intro and conclusion out loud. If they sound like a LinkedIn post or a press release, rewrite them.272273### Step 5: Assemble274Convert the draft article into final format for your blog:2752761. **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.2772782. **Create the article file** with your blog's frontmatter format:279 ```yaml280 ---281 title: "..."282 description: "..."283 category: "guide"284 tags: ["tag1", "tag2"]285 publishedAt: "YYYY-MM-DD"286 author: "Your Name"287 image: "/blog/hero-image.webp"288 imageAlt: "..."289 draft: true290 ---291 ```292 - Remove the H1 title if your blog template displays it automatically293 - Replace image paths: `IMAGE_SLOT:xxx` → `/blog/xxx.webp`294 - Add your CTA component at the top if applicable295 - Inline images: ``2962973. **Git commit & push**:298 ```bash299 cd your-project300 git add content/blog/en/slug.mdx public/blog/*.webp301 git commit -m "feat(blog): add EN article — slug"302 git push origin main303 ```304305### Step 6: Translate306Create translated versions of the article:3073081. Translate naturally (not literally) to target language3092. **Slug must be in the target language.** Not the English slug in a different folder.310 - Rules: lowercase, no accents in slugs, short and descriptive3113. Save to the appropriate locale folder with translated frontmatter (title, description, imageAlt, slug)3124. Keep the same image paths (images are shared between locales)3135. Add `pairSlug` in both articles' frontmatter pointing to each other (if your blog supports language switching)3146. Git commit & push315316## Scripts317- `scripts/research-keyword.sh` — Keyword research via DataForSEO API (requires DATAFORSEO_LOGIN + DATAFORSEO_PASSWORD env vars)318319## Requirements320- **DataForSEO account** for keyword research (free tier available)321- **Image generation tool** (nano-banana-pro skill recommended, or any image gen)322- **cwebp** for image conversion (`brew install webp` or `apt install webp`)323- **Git** for version control