Content Creator
Self-configuring content creation pipeline. Creates SEO & GEO-optimized content matched to your project and brand voice, then validates with geo-lint until clean.
For project-specific rules (components, file naming, categories), the skill
generates a local content-config skill on first use via the setup workflow.
Command Router
Parse $ARGUMENTS and route to the matching workflow:
| Argument | Workflow |
|---|---|
setup | Auto-discover project, questionnaire, generate content-config |
create [blog|page|project] | Full content creation pipeline |
voice | Analyze and configure brand voice |
calendar | Plan monthly content calendar |
refresh | Re-scan project, update content-config |
| (no args) | If no config exists → auto-trigger setup. Otherwise show commands. |
Pre-Flight Check
Before any workflow except setup:
- Check if
.claude/skills/content-config/SKILL.mdexists in the project root. - If missing → inform the user: "No project content config found. Running setup first..." Then auto-trigger the
setupworkflow. - If found → read it into context and proceed with the requested workflow.
Workflow: setup
Three phases: auto-discover → questionnaire → generate.
Phase 1: Auto-Discovery
Run these steps silently, collecting results into a discovery report:
1. Framework Detection
- Read
package.jsondependencies and devDependencies for:next,astro,@astrojs/*,gatsby,hugo,nuxt,vite,remix,@11ty/eleventy - Check for config files:
next.config.*,astro.config.*,nuxt.config.*,gatsby-config.*,.eleventy.js - Record: framework name + version
2. Content Directories
- Search for common patterns:
content/,src/content/,posts/,blog/,pages/,articles/,src/pages/ - If
geo-lint.config.tsexists → read itscontentPaths - Record: all content directories and file extensions (
.md,.mdx,.astro,.html)
3. Frontmatter Schema
- Read 5–10 representative content files across detected directories
- Parse YAML frontmatter (lines between
---delimiters) - Compute the union of all field names; classify each as required (present in >80% of files) or optional
- Record: field schema with types inferred from values
4. Categories
- Extract unique values from
categoryandcategoriesfrontmatter fields across all content - Cross-reference with
geo-lint.config.tscategoriesarray if present - Record: canonical category list
5. Authors
- Extract unique
authorvalues from all content frontmatter - Record: author names
6. Locales & i18n
- Detect from: frontmatter
localefields, file naming patterns (.de.mdx,.en.mdx), directory patterns (/de/,/en/) - Check
geo-lint.config.tsi18n config if present - Record: locales and default locale
7. Site URL
- Check in order:
geo-lint.config.tssiteUrl →package.jsonhomepage → framework configsite/urlfield - Record: URL or "not found"
8. Image Directories
- Search for:
public/images/,static/images/,assets/images/,src/assets/ - Record: directories found
9. Components (MDX projects only)
- If
.mdxfiles exist → scan for JSX component usage patterns (<ComponentName) - Exclude standard HTML tags
- Record: component names found
Phase 2: Questionnaire
Present the discovery summary as a formatted table. Then use AskUserQuestion to gather:
- Confirm discoveries — "Here's what I found about your project: [table]. Is this correct? Any corrections?"
- Brand voice archetype — Options from
references/brand_guidelines.md: The Expert, The Friend, The Innovator, The Guide, The Motivator. Allow primary + secondary selection. - Tone attributes — Pick 3–5 from: Authoritative, Friendly, Innovative, Trustworthy, Inspiring, Educational, Witty
- Target audience — Free text (e.g., "B2B decision-makers in manufacturing, CTOs")
- Content goals — Free text (e.g., "thought leadership, lead generation, brand awareness")
Phase 3: Generation
-
Generate
.claude/skills/content-config/SKILL.mdin the project root using the Content-Config Template below. Fill all[placeholders]with discovered and questionnaire data. -
geo-lint.config.ts — if it does not exist:
- Generate it with discovered
siteUrl,contentPaths,categories, andgeo.brandNameif known - Install
@ijonis/geo-lintas a devDependency if not present
- Generate it with discovered
-
geo-lint.config.ts — if it exists but is missing discovered data:
- Propose additions (new categories, new contentPaths) for user confirmation
-
Validation test — run
npx geo-lint --format=jsonto confirm config loads correctly -
Report: "Setup complete. Your content pipeline is ready. Run
/content-creator createto start."
Workflow: create
Full content creation pipeline with built-in validation.
Step 1: Load Project Config
Read .claude/skills/content-config/SKILL.md for project-specific rules: content schema, brand voice, categories, components, file naming conventions, languages.
Step 2: Topic & Type
Ask the user for:
- Topic or title for the new content piece
- Content type — blog, page, or project (default: blog)
Step 3: Duplicate & Overlap Gate (MANDATORY)
Scan ALL existing content (titles, slugs, descriptions) before proceeding:
| Finding | Action |
|---|---|
| Exact duplicate (same topic + angle) | Stop. Suggest updating the existing post instead. |
| Substantial overlap (same topic, different angle) | Stop. Propose a clearly differentiated angle. Get user approval before proceeding. |
| Tangential overlap (related topic, distinct focus) | Proceed. Note the related post for cross-linking. |
| No overlap | Proceed. |
Report which existing posts were checked and the gate result.
Step 4: Keyword & Search Research (MANDATORY)
Use WebSearch to research the topic. Follow the purchase-intent-first strategy:
- Search for trending angles, competitor coverage, and keyword variations
- Identify: 1 primary keyword, 3–5 secondary keywords, 10–15 LSI keywords
- Explicitly mine for purchase-intent keywords (e.g., +pricing/cost, +provider/agency, +comparison/vs/alternative; for German markets also +Kosten, +Anbieter, +Vergleich)
- Run the SERP Viability Filter for the primary keyword:
- Authority Check — are top results Wikipedia/Forbes (red flag) or mid-size blogs (green flag)?
- Intent Check — are ranking results blog posts (match) or product pages (mismatch)?
- Coverage Check — does the site already rank for this? (
site:domain "[keyword]") - Long-Tail Check — does a long-tail variant have community demand?
- Document: confirmed primary keyword with 2–3 sentence rationale, intent classification, differentiation angle
Step 5: Select Template
Load references/content_frameworks.md. Choose the best template for the topic:
- How-To Guide — prerequisites → steps → troubleshooting → results
- Listicle — introduction → items → action plan
- Case Study — challenge → solution → results → takeaways
- Thought Leadership — current state → trend → implications → recommendations
Step 6: Write Content
Follow the project schema from content-config:
- Use correct frontmatter fields (all required fields populated)
- Follow file naming conventions (locale suffixes if bilingual)
- Apply brand voice (archetypes, tone attributes, target audience)
- Use available MDX components where they enhance the content (if applicable)
- SEO targets: keyword density 1–3%, proper heading hierarchy (one H1, no skipped levels), 1,500–2,500 words for blog posts
- Add 2–3 internal links to related existing posts
- Add 1–2 external links to authoritative sources
Step 7: Validate (MANDATORY)
Run the geo-lint validation loop:
npx geo-lint --format=json --root=.
- Filter violations to the newly created file
- Fix A