Skip to content
Back to skills

Content Creator

ASecurity

Self-configuring content creation pipeline with geo-lint validation. On first use, scans your project to learn its framework, content schema, categories, and authors, then creates SEO & GEO-optimized content matched to your brand voice. Validates every piece with geo-lint's 92 rules until zero violations. Triggers on: "content-creator", "create content", "write blog", "new post", "content calendar", "brand voice", "content strategy".

  • 39 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added May 27, 2026
data-aipythonrustgobashnode

Security analysis

A100/100

Pro scans all 6 files and shows the line behind each finding

Scanned May 27, 2026

npx -y skills add IJONIS/geo-lint --skill content-creator --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Content Creator?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Content Creator
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/ijonis-content-creator/badge)](https://www.skillsdirectory.com/skills/ijonis-content-creator)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: content-creator
description: >
  Self-configuring content creation pipeline with geo-lint validation.
  On first use, scans your project to learn its framework, content schema,
  categories, and authors, then creates SEO & GEO-optimized content matched
  to your brand voice. Validates every piece with geo-lint's 92 rules until
  zero violations. Triggers on: "content-creator", "create content",
  "write blog", "new post", "content calendar", "brand voice",
  "content strategy".
argument-hint: "setup | create [blog|page|project] | voice | calendar | refresh"
allowed-tools:
  - Bash(npx geo-lint*)
  - Bash(npm *)
  - Bash(node *)
  - Bash(python *brand_voice*)
  - Read
  - Write
  - Edit
  - Grep
  - Glob
  - WebSearch
  - AskUserQuestion
  - Agent
metadata:
  version: 1.0.0
  author: Alireza Rezvani
  contributors:
    - Jamin Mahmood-Wiebe
  category: marketing
  domain: content-creation
  updated: 2026-03-01
---

# 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`:

1. Check if `.claude/skills/content-config/SKILL.md` exists in the project root.
2. If missing → inform the user: "No project content config found. Running setup first..." Then auto-trigger the `setup` workflow.
3. 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.json` dependencies 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.ts` exists → read its `contentPaths`
- 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 `category` and `categories` frontmatter fields across all content
- Cross-reference with `geo-lint.config.ts` `categories` array if present
- Record: canonical category list

**5. Authors**
- Extract unique `author` values from all content frontmatter
- Record: author names

**6. Locales & i18n**
- Detect from: frontmatter `locale` fields, file naming patterns (`.de.mdx`, `.en.mdx`), directory patterns (`/de/`, `/en/`)
- Check `geo-lint.config.ts` i18n config if present
- Record: locales and default locale

**7. Site URL**
- Check in order: `geo-lint.config.ts` siteUrl → `package.json` homepage → framework config `site`/`url` field
- 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 `.mdx` files 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:

1. **Confirm discoveries** — "Here's what I found about your project: [table]. Is this correct? Any corrections?"
2. **Brand voice archetype** — Options from `references/brand_guidelines.md`: The Expert, The Friend, The Innovator, The Guide, The Motivator. Allow primary + secondary selection.
3. **Tone attributes** — Pick 3–5 from: Authoritative, Friendly, Innovative, Trustworthy, Inspiring, Educational, Witty
4. **Target audience** — Free text (e.g., "B2B decision-makers in manufacturing, CTOs")
5. **Content goals** — Free text (e.g., "thought leadership, lead generation, brand awareness")

### Phase 3: Generation

1. **Generate `.claude/skills/content-config/SKILL.md`** in the project root using the Content-Config Template below. Fill all `[placeholders]` with discovered and questionnaire data.

2. **geo-lint.config.ts** — if it does not exist:
   - Generate it with discovered `siteUrl`, `contentPaths`, `categories`, and `geo.brandName` if known
   - Install `@ijonis/geo-lint` as a devDependency if not present

3. **geo-lint.config.ts** — if it exists but is missing discovered data:
   - Propose additions (new categories, new contentPaths) for user confirmation

4. **Validation test** — run `npx geo-lint --format=json` to confirm config loads correctly

5. Report: "Setup complete. Your content pipeline is ready. Run `/content-creator create` to 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:

1. Search for trending angles, competitor coverage, and keyword variations
2. Identify: 1 primary keyword, 3–5 secondary keywords, 10–15 LSI keywords
3. Explicitly mine for purchase-intent keywords (e.g., +pricing/cost, +provider/agency, +comparison/vs/alternative; for German markets also +Kosten, +Anbieter, +Vergleich)
4. 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?
5. 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:

```bash
npx geo-lint --format=json --root=.
```

1. Filter violations to the newly created file
2. Fix ALL violations — **errors first, then warnings**
3. Re-run the linter after fixes
4. Repeat until zero violations for the new post
5. Maximum **5 fix passes** — if violations remain after 5 passes, report which rules still fail and why

**Rules that require human input** (do NOT fix, report to user):
- `geo-low-citation-density` — requires real statistics; never fabricate
- `image-not-found` — image file must exist on disk
- `broken-internal-link` — target page may not exist
- `category-invalid` — must use configured categories

### Step 8: Cross-Link

- Update 1–2 existing related posts with links to the new content
- Verify internal links resolve correctly

### Step 9: Report

Summary: files created, content type, primary keyword, violations fixed, internal links added, any items requiring human attention.

---

## Workflow: voice

Analyze and configure brand voice settings.

1. If Python is available → run the brand voice analyzer from the skill's install directory (`~/.claude/skills/content-creator/scripts/brand_voice_analyzer.py`) on 3–5 recent content files
2. Display current voice profile: formality spectrum, tone attributes, perspective, readability score
3. Compare against the configured voice in `.claude/skills/content-config/SKILL.md`
4. If adjustments needed → ask user via `AskUserQuestion` with archetype and tone options
5. Update `.claude/skills/content-config/SKILL.md` with new voice preferences

If Python is not available, analyze voice manually by reading content and assessing tone, formality, and perspective.

---

## Workflow: calendar

Plan a monthly content calendar.

1. Load `assets/content_calendar_template.md` as the base template
2. Read existing content to identify: publishing cadence, topic gaps, category distribution, seasonal patterns
3. Use `WebSearch` to research trending topics in the project's domain and industry
4. Generate a monthly calendar with: topics, target keywords, content types, suggested templates, publishing dates
5. Follow the 40/25/25/10 content pillar ratio: Educational / Inspirational / Conversational / Promotional
6. Save to a location the user chooses (default: `docs/content-calendar.md`)

---

## Workflow: refresh

Re-scan the project and update content-config.

1. Re-run all auto-discovery steps from the `setup` Phase 1
2. Read existing `.claude/skills/content-config/SKILL.md`
3. Compute diff: new categories, new authors, new components, new locales, new content types, changed directories
4. Present changes as a before/after comparison table
5. If user approves → update content-config, **preserving user-customized sections** (brand voice, audience, goals)
6. If `geo-lint.config.ts` also needs updates (new categories, new contentPaths) → propose those changes separately
7. Report what changed

---

## Content-Config Template

The `setup` workflow generates `.claude/skills/content-config/SKILL.md` in the user's project. The agent fills `[placeholders]` with discovered and questionnaire data:

```markdown
---
name: content-config
description: [ProjectName]-specific content creation rules. Defines content schemas,
  categories, brand voice, and geo-lint validation workflow. Generated by
  /content-creator setup — edit freely to refine.
---

# [ProjectName] Content Config

Generated by `/content-creator setup`. Extends the global `content-creator` skill
with project-specific rules. Edit this file to refine your content pipeline.

## Brand Identity

### Brand Voice
- **Archetypes:** [Primary] (primary) + [Secondary] (secondary)
- **Tone:** [3-5 chosen attributes, comma-separated]
- **Target Audience:** [from questionnaire]
- **Content Goals:** [from questionnaire]

### Authors
| Author | Focus Areas |
|--------|------------|
| [Name] | [inferred from existing content topics, or "General"] |

## Content Schema

### Framework
[Framework name] [version]

### Content Types
| Type | Directory | URL Prefix | Extensions |
|------|-----------|------------|------------|
| [type] | [dir] | [prefix] | [.mdx, .md] |

### Required Frontmatter
[List fields present in >80% of files, with inferred types]

### Optional Frontmatter
[List fields present in <80% of files]

### Canonical Categories
[Comma-separated list, or "None configured — add to geo-lint.config.ts"]

## File Naming
[Convention discovered — e.g., "kebab-case.mdx" or "slug.de.mdx / slug.en.mdx"]

## Languages
[Locales discovered + default locale, or "Single language"]

## Components
[MDX component names found, or "N/A — no MDX components detected"]

## Content Creation Workflow

1. **Duplicate check** — scan existing content for topic overlap before writing
2. **Keyword research** — use WebSearch, purchase-intent first
3. **Write** — follow schema above, apply brand voice, use components where appropriate
4. **Validate** — run `npx geo-lint --format=json`, filter to new file
5. **Fix all violations** — errors AND warnings, max 5 passes
6. **Cross-link** — add 2-3 internal links, update 1-2 existing posts

New content MUST ship with zero geo-lint violations.

## Validation Commands

npx geo-lint --format=json        # Full project lint (JSON output)
npx geo-lint --root=.             # Full project lint (human-readable)
npx geo-lint --rules              # Show all 92 rules with fix strategies
```

---

## Reference Guides

Load these on demand — do not read them all into context at once:

| Reference | When to load |
|-----------|-------------|
| `references/brand_guidelines.md` | During `setup` (voice selection) and `voice` workflow |
| `references/content_frameworks.md` | During `create` (template selection) |
| `references/social_media_optimization.md` | When creating social media content |
| `assets/content_calendar_template.md` | During `calendar` workflow |
| `scripts/brand_voice_analyzer.py` | During `voice` workflow (optional — requires Python) |

Files in this skill

  • SKILL.md14.6 KB
  • assets/content_calendar_template.md1.6 KB
  • references/brand_guidelines.md6 KB
  • references/content_frameworks.md10.6 KB
  • references/social_media_optimization.md8.9 KB
  • scripts/brand_voice_analyzer.py6.5 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.