Loading...
Loading...
SEO & content marketing automation toolkit with keyword research, content audits, technical SEO analysis, and AI-powered content workflows
npx skill4agent add aradotso/marketing-skills radian-layer-41-seo-content-marketing-skill-suiteSkill by ara.so — Marketing Skills collection.
hesreallyhim/awesome-claude-code# Clone into Claude Code skills directory
git clone https://github.com/RadianLayer41/r01-hesreallyhim-awesome-claude-code-seo.git \
~/.claude/skills/radian-seo-marketing
# Or copy into your agent's skills path
cp -r r01-hesreallyhim-awesome-claude-code-seo ~/.cursor/skills/seo-marketing# Claude Code
/read ~/.claude/skills/radian-seo-marketing/SKILL.md
# Cursor
@skills import ~/.cursor/skills/seo-marketing
# Cody
/skills load seo-marketing# Basic usage
/keyword-research "project management software"
# Advanced with filters
/keyword-research "project management software" \
--min-volume 500 \
--max-difficulty 40 \
--intent commercial \
--output json
# Export to CSV
/keyword-research "SaaS tools" --export keywords.csv┌─────────────────────────┬────────┬────────┬──────────┬──────────┐
│ Keyword │ Volume │ KD │ Intent │ Priority │
├─────────────────────────┼────────┼────────┼──────────┼──────────┤
│ best project management │ 14,800 │ 38 │ Comm. │ 🔴 High │
│ project management tool │ 8,100 │ 42 │ Comm. │ 🟠 Med │
│ free project software │ 4,400 │ 29 │ Info │ 🟢 Low │
└─────────────────────────┴────────┴────────┴──────────┴──────────┘# Full site audit
/content-audit --scope full --domain example.com
# Specific path
/content-audit --path /blog --min-quality 60
# Export findings
/content-audit --output audit-report.md --format markdown## Content Audit Results — example.com
**Pages Analyzed:** 1,204 | **Issues Found:** 347 | **Score:** 72/100
### Critical Issues (🔴)
- 24 pages with thin content (<300 words)
- 8 duplicate title tags
- 12 pages cannibalized by similar content
### Recommendations
- [ ] Consolidate 12 cannibalizing pages into 4 authoritative guides
- [ ] Expand 24 thin pages to 800+ words or noindex
- [ ] Rewrite 8 duplicate titles with unique value props# Full technical audit
/technical-seo https://example.com
# Specific checks
/technical-seo https://example.com \
--checks crawlability,schema,vitals \
--output technical-seo.json
# Mobile-first audit
/technical-seo https://example.com --mobile --user-agent googlebot-mobile╔══════════════════════════════════════════════════╗
║ Technical SEO Audit — example.com ║
╠══════════════════════════════════════════════════╣
║ Crawling sitemap … [██████████] 100% ✓ ║
║ Checking robots.txt … [██████████] 100% ✓ ║
║ Validating schema … [████████░░] 80% ⚠ ║
║ Core Web Vitals … [██████████] 100% ✓ ║
╚══════════════════════════════════════════════════╝
┌──────────────────┬──────────┬──────────┬──────────┐
│ Metric │ Current │ Target │ Status │
├──────────────────┼──────────┼──────────┼──────────┤
│ LCP │ 2.1s │ <2.5s │ ✓ Pass │
│ FID │ 45ms │ <100ms │ ✓ Pass │
│ CLS │ 0.08 │ <0.1 │ ✓ Pass │
│ Indexed pages │ 1,204 │ 1,505 │ ⚠ 80% │
│ Schema coverage │ 892 │ 1,204 │ ⚠ 74% │
└──────────────────┴──────────┴──────────┴──────────┘# Compare against competitors
/competitor-gap --target example.com \
--competitors competitor1.com,competitor2.com,competitor3.com
# Topic gap only
/competitor-gap --target example.com \
--competitors competitor1.com \
--analysis topic-gap
# Export opportunities
/competitor-gap --target example.com \
--competitors competitor1.com \
--export gap-opportunities.csv// Programmatic usage via API
const { competitorGap } = require('radian-seo-marketing');
const analysis = await competitorGap({
target: 'example.com',
competitors: ['competitor1.com', 'competitor2.com'],
metrics: ['backlinks', 'topics', 'snippets'],
minDR: 40
});
console.log(`Found ${analysis.backlink_gaps.length} backlink opportunities`);
console.log(`Found ${analysis.topic_gaps.length} content gaps`);# Generate brief
/content-brief "how to choose project management software"
# With competitor analysis
/content-brief "project management best practices" \
--analyze-serp \
--top-n 10 \
--include-questions
# Export as template
/content-brief "SaaS onboarding guide" \
--template markdown \
--output brief-onboarding.md# Content Brief: How to Choose Project Management Software
## Target Keyword
**Primary:** how to choose project management software
**Volume:** 2,900/mo | **KD:** 35 | **Intent:** Informational
## Recommended Structure
1. Introduction (150 words)
2. Key Features to Look For (800 words)
- Task management capabilities
- Collaboration tools
- Reporting and analytics
- Integration options
3. Evaluation Checklist (400 words)
4. Top Tools Comparison (600 words)
5. Conclusion & Next Steps (200 words)
**Target Length:** 2,150–2,500 words
## NLP Terms to Include
- project tracking, team collaboration, workflow automation
- Gantt charts, Kanban boards, sprint planning
- resource allocation, time tracking, budget management
## Questions to Answer
- What features should I prioritize?
- How much does project management software cost?
- What's the difference between Asana and Monday?# Track keywords
/serp-monitor --keywords "seo tools,keyword research,rank tracker" \
--domain example.com \
--frequency daily
# Set up alerts
/serp-monitor --keywords keywords.csv \
--domain example.com \
--alert-threshold 3 \
--notify-email ${ALERT_EMAIL}
# Historical comparison
/serp-monitor --keywords "seo audit" \
--domain example.com \
--compare 30-days-ago# serp-monitor-config.yml
domain: example.com
keywords:
- seo tools
- keyword research tool
- rank tracking software
alerts:
volatility_threshold: 3 # positions
notification:
email: ${ALERT_EMAIL}
slack_webhook: ${SLACK_WEBHOOK}
frequency: daily
retain_history: 90-days# Find prospects
/link-prospecting --topic "project management" \
--min-dr 40 \
--max-dr 80 \
--types guest-post,resource-page
# Export with contact info
/link-prospecting --topic "SaaS marketing" \
--include-contacts \
--export prospects.csv
# Generate outreach templates
/link-prospecting --topic "content marketing" \
--generate-templates \
--tone professional┌─────────────────────────┬─────┬──────────────────┬─────────────┐
│ Prospect │ DR │ Opportunity │ Contact │
├─────────────────────────┼─────┼──────────────────┼─────────────┤
│ marketingblog.com/res.. │ 64 │ Resource page │ ✓ Found │
│ saasinsider.io/contrib..│ 58 │ Guest post │ ✓ Found │
│ projectmgmt.guide/links │ 52 │ Link roundup │ ⚠ Manual │
└─────────────────────────┴─────┴──────────────────┴─────────────┘
**Outreach Template (Guest Post):**
Subject: Guest Post Idea for [Site Name]
Hi [First Name],
I've been following [Site Name] and loved your recent piece on [Topic].
I'd like to contribute a guest post on [Specific Topic] that would
complement your existing content on [Related Topic].
Proposed outline:
- [Point 1]
- [Point 2]
- [Point 3]
Let me know if this interests you!
Best,
[Your Name]# Analyze page speed
/page-speed-seo https://example.com/page
# Mobile-specific
/page-speed-seo https://example.com \
--device mobile \
--connection 4g
# Batch analysis
/page-speed-seo --urls urls.txt \
--output speed-report.json╔══════════════════════════════════════════════════╗
║ Page Speed SEO — example.com/blog/post ║
╠══════════════════════════════════════════════════╣
║ Performance Score: 68/100 — ⚠ Needs Work ║
╚══════════════════════════════════════════════════╝
┌────────────────────┬──────────┬──────────┬──────────────┐
│ Metric │ Current │ Target │ SEO Impact │
├────────────────────┼──────────┼──────────┼──────────────┤
│ LCP │ 3.8s │ <2.5s │ 🔴 High │
│ FID │ 180ms │ <100ms │ 🟠 Medium │
│ CLS │ 0.15 │ <0.1 │ 🟠 Medium │
│ Render-blocking │ 8 res │ 0 │ 🔴 High │
└────────────────────┴──────────┴──────────┴──────────────┘
### Fixes Prioritized by Ranking Impact
🔴 **Critical (Est. +12% ranking potential)**
- [ ] Defer 8 render-blocking JS resources → -1.2s LCP
- [ ] Preload LCP image → -0.8s LCP
🟠 **Important (Est. +6% ranking potential)**
- [ ] Fix layout shift in header → -0.08 CLS
- [ ] Reduce JS execution time → -90ms FID# Full local audit
/local-seo --business "Acme Plumbing" \
--location "Seattle, WA" \
--gmb-id ${GMB_ID}
# NAP consistency check
/local-seo --business "Acme Plumbing" \
--check nap-consistency \
--citations 100
# Citation opportunities
/local-seo --business "Acme Plumbing" \
--location "Seattle, WA" \
--find-citations \
--category plumbing## Local SEO Audit — Acme Plumbing (Seattle, WA)
### NAP Consistency: 82% ⚠
**Inconsistencies Found:**
- Yelp: "Acme Plumbing LLC" vs. "Acme Plumbing"
- YellowPages: Phone (206) 555-0100 vs. (206) 555-0101
- Manta: Missing suite number in address
### Google Business Profile Score: 76/100
**Optimization Opportunities:**
- [ ] Add 15+ photos (current: 8)
- [ ] Respond to 4 unanswered reviews
- [ ] Complete all attributes (current: 12/18)
- [ ] Add Q&A section (current: 0 questions)
### Citation Opportunities (23 found)
| Directory | DA | Status |
|--------------------|----|-------------|
| HomeAdvisor | 91 | Not listed |
| Angi | 88 | Not listed |
| Porch | 72 | Listed ✓ |# Generate calendar
/content-calendar --topic "content marketing" \
--duration 90-days \
--frequency 2-per-week
# Include seasonality
/content-calendar --topic "tax software" \
--duration 12-months \
--analyze-seasonality \
--export calendar.csv
# Team assignment
/content-calendar --topics topics.yml \
--duration 60-days \
--assign-team team.json# Content Calendar — Content Marketing (Q1 2026)
## Week 1 (Jan 6-12)
### 📅 Monday, Jan 6
**Topic:** Content Marketing Trends 2026
- **Keyword:** content marketing trends (vol: 3,600, KD: 45)
- **Search Demand:** ↗ Rising +40% (seasonal peak)
- **Format:** Listicle (2,200 words)
- **Assigned:** Sarah M.
### 📅 Thursday, Jan 9
**Topic:** How to Build a Content Strategy
- **Keyword:** content strategy guide (vol: 1,900, KD: 38)
- **Search Demand:** → Stable
- **Format:** How-to guide (2,800 words)
- **Assigned:** Mike T.
## Week 2 (Jan 13-19)
### 📅 Monday, Jan 13
**Topic:** Content Distribution Channels Comparison
- **Keyword:** content distribution (vol: 2,400, KD: 42)
- **Search Demand:** ↗ Rising +15%
- **Format:** Comparison (1,800 words)
- **Assigned:** Sarah M.# Launch full sprint
/workflows:full-seo-sprint example.com --scope comprehensive
# Custom sprint
/workflows:full-seo-sprint example.com \
--steps audit,keywords,content,technical \
--duration 4-weeks# Pre-launch validation
/workflows:launch-seo staging.example.com \
--production example.com \
--checklist full
# Quick check
/workflows:launch-seo staging.example.com \
--checklist critical-only# Find refresh candidates
/workflows:content-refresh example.com \
--decline-threshold 5-positions \
--timeframe 90-days
# Execute refresh
/workflows:content-refresh example.com \
--pages pages-to-refresh.csv \
--generate-briefs# Launch campaign
/workflows:authority-building \
--topic "project management best practices" \
--target-dr-increase 15 \
--duration 90-days
# Track progress
/workflows:authority-building --campaign-id abc123 --status# Set up pipeline
/workflows:ai-content-pipeline \
--keywords keywords.csv \
--auto-generate-briefs \
--auto-draft \
--review-mode manual
# Fully automated (use with caution)
/workflows:ai-content-pipeline \
--keywords keywords.csv \
--auto-publish \
--cms wordpress \
--api-key ${WP_API_KEY}# ai-content-pipeline.yml
input:
keywords_source: keywords.csv
priority_filter: high,medium
generation:
brief_template: seo-brief-v2
draft_model: claude-3-opus
tone: professional
min_word_count: 1500
optimization:
include_nlp_terms: true
internal_linking: auto
image_suggestions: true
schema_markup: auto-generate
review:
mode: manual # or auto-approve
quality_threshold: 85
publishing:
cms: wordpress
api_endpoint: ${WP_API_URL}
api_key: ${WP_API_KEY}
status: draft # or publish
category: blog# Required for API integrations
export SEO_MARKETING_API_KEY="your-api-key"
export GOOGLE_SEARCH_CONSOLE_CREDENTIALS="path/to/credentials.json"
export AHREFS_API_KEY="your-ahrefs-key"
export SEMRUSH_API_KEY="your-semrush-key"
# Optional integrations
export SLACK_WEBHOOK="https://hooks.slack.com/..."
export ALERT_EMAIL="alerts@example.com"
export WP_API_URL="https://example.com/wp-json"
export WP_API_KEY="your-wordpress-key"
# Configuration
export SEO_MARKETING_CONFIG_PATH="~/.config/seo-marketing"
export SEO_MARKETING_OUTPUT_FORMAT="markdown" # or json, csv~/.config/seo-marketing/config.yml# Global settings
defaults:
output_format: markdown
progress_bars: true
color_output: true
# API credentials (prefer env vars)
apis:
google_search_console:
credentials_path: ${GOOGLE_SEARCH_CONSOLE_CREDENTIALS}
ahrefs:
api_key: ${AHREFS_API_KEY}
semrush:
api_key: ${SEMRUSH_API_KEY}
# Command defaults
commands:
keyword_research:
min_volume: 100
max_difficulty: 60
default_country: us
content_audit:
min_quality_score: 60
check_duplicates: true
check_cannibalization: true
technical_seo:
check_schema: true
check_vitals: true
mobile_first: true
# Workflows
workflows:
full_seo_sprint:
duration_weeks: 4
include_competitor_analysis: true
content_refresh:
decline_threshold_positions: 5
timeframe_days: 90
# Notifications
notifications:
slack:
webhook_url: ${SLACK_WEBHOOK}
enabled: true
email:
smtp_server: smtp.gmail.com
smtp_port: 587
from_address: ${ALERT_EMAIL}
enabled: false#!/bin/bash
# monthly-seo-report.sh
DOMAIN="example.com"
MONTH=$(date +%Y-%m)
OUTPUT_DIR="./reports/$MONTH"
mkdir -p "$OUTPUT_DIR"
# Run core audits
/technical-seo "$DOMAIN" --output "$OUTPUT_DIR/technical.json"
/content-audit --domain "$DOMAIN" --output "$OUTPUT_DIR/content.md"
/serp-monitor --domain "$DOMAIN" --compare 30-days-ago --export "$OUTPUT_DIR/rankings.csv"
# Competitor tracking
/competitor-gap --target "$DOMAIN" \
--competitors competitors.txt \
--export "$OUTPUT_DIR/gaps.csv"
# Consolidate report
echo "# SEO Report — $MONTH" > "$OUTPUT_DIR/report.md"
cat "$OUTPUT_DIR/technical.json" "$OUTPUT_DIR/content.md" >> "$OUTPUT_DIR/report.md"
# Send notification
curl -X POST "$SLACK_WEBHOOK" \
-H 'Content-Type: application/json' \
-d "{\"text\":\"SEO report for $MONTH ready: $OUTPUT_DIR/report.md\"}"// new-content-workflow.js
const { contentBrief, aiContentPipeline } = require('radian-seo-marketing');
async function createNewContent(keyword) {
// 1. Generate brief
const brief = await contentBrief({
keyword: keyword,
analyzeSERP: true,
topN: 10,
includeQuestions: true
});
console.log(`Brief created: ${brief.wordCount} words recommended`);
// 2. Generate draft
const draft = await aiContentPipeline.generate({
brief: brief,
tone: 'professional',
includeNLPTerms: true,
internalLinking: 'auto'
});
console.log(`Draft created: ${draft.wordCount} words`);
// 3. Optimize
const optimized = await aiContentPipeline.optimize(draft, {
minQualityScore: 85,
addSchema: true,
suggestImages: true
});
console.log(`Optimization score: ${optimized.score}/100`);
// 4. Save for review
await optimized.save({
path: `./drafts/${keyword.replace(/\s+/g, '-')}.md`,
status: 'review'
});
return optimized;
}
// Usage
createNewContent('how to do keyword research')
.then(content => console.log('Content ready for review'))
.catch(err => console.error(err));# link_prospecting_automation.py
from radian_seo_marketing import link_prospecting, outreach
def run_link_campaign(topic, target_links=50):
# Find prospects
prospects = link_prospecting.find(
topic=topic,
min_dr=40,
max_dr=80,
types=['guest-post', 'resource-page'],
include_contacts=True
)
print(f"Found {len(prospects)} prospects")
# Filter and prioritize
qualified = [p for p in prospects if p.has_contact and p.relevance > 0.7]
qualified.sort(key=lambda x: x.dr, reverse=True)
# Generate personalized outreach
for prospect in qualified[:target_links]:
template = outreach.generate_template(
prospect=prospect,
tone='professional',
personalize=True
)
# Save for review
outreach.save_draft(
prospect=prospect,
template=template,
path=f'./outreach/{prospect.domain}.txt'
)
# Create tracking sheet
outreach.export_csv(
prospects=qualified[:target_links],
path='./outreach/prospects.csv',
include_fields=['domain', 'dr', 'contact', 'opportunity', 'template']
)
print(f"Outreach templates ready: ./outreach/")
# Run campaign
run_link_campaign('content marketing tools', target_links=50)#!/bin/bash
# page-speed-monitor.sh
URLS_FILE="critical-pages.txt"
THRESHOLD=75 # Minimum acceptable score
ALERT_WEBHOOK="${SLACK_WEBHOOK}"
while IFS= read -r url; do
echo "Checking: $url"
score=$(/page-speed-seo "$url" --format json | jq '.performance_score')
if [ "$score" -lt "$THRESHOLD" ]; then
# Alert on low scores
message="⚠️ Page speed alert: $url scored $score/100 (threshold: $THRESHOLD)"
curl -X POST "$ALERT_WEBHOOK" \
-H 'Content-Type: application/json' \
-d "{\"text\":\"$message\"}"
# Generate detailed report
/page-speed-seo "$url" --output "speed-issues-$(date +%s).json"
else
echo "✓ $url passed ($score/100)"
fi
sleep 2 # Rate limiting
done < "$URLS_FILE"# Add rate limiting
/keyword-research "topic" --rate-limit 1-per-second
# Or use caching
/keyword-research "topic" --cache 24h --cache-dir ~/.cache/seo-marketing# Re-authenticate
export GOOGLE_SEARCH_CONSOLE_CREDENTIALS="/path/to/credentials.json"
# Verify credentials
/technical-seo https://example.com --verify-gsc-access
# Manual OAuth flow
/auth:google-search-console --interactive# Use sampling
/content-audit --domain example.com --sample 1000
# Or incremental audit
/content-audit --domain example.com --path /blog --incremental
# Parallelize (requires API key for headless browser)
/content-audit --domain example.com --parallel 5 --api-key ${SEO_API_KEY}# Force refresh
/serp-monitor --keywords "keyword" --no-cache --force-refresh
# Check data source status
/serp-monitor --status
# Use alternative provider
/serp-monitor --keywords "keyword" --provider serpapi # or brightdata# Resume from specific step
/workflows:full-seo-sprint example