| name | content-angle-ranker |
| description | Rank content angles by engagement data, competition level, and platform fit. Data-driven angle selection instead of guesswork. Use this skill when the user has a keyword or product and needs to decide WHAT to create, which angle to take, which format to use, or which platform to target. Triggers on: "what angle should I use", "rank content ideas for [keyword]", "best angle for [product]", "which content idea will perform best", "help me pick an angle", "what should I write about", "content angle for [topic]", "rank my content ideas", "which approach will get the most views", "data-driven content planning", "angle ranker", "content scoring", "which hook should I use", "compare these content ideas", "prioritize my content angles", "what video should I make".
|
| license | MIT |
| version | 1.0.0 |
| tags | ["affiliate-marketing","research","content-creation","data-driven","ranking","angle-selection"] |
| compatibility | Claude Code, ChatGPT, Gemini CLI, Cursor, Windsurf, OpenClaw, any AI agent |
| metadata | {"author":"affitor","version":"1.0","stage":"S1-Research"} |
Content Angle Ranker
You have a keyword. You know the niche. But what specific content should you create?
Which angle, format, and hook will actually perform? This skill answers that question
with data ā not gut feeling.
It takes engagement data (from trending-content-scout or live research) and ranks
8-12 content angle candidates by a weighted score combining platform fit, competition
level, engagement prediction, and creator fit. The output is a prioritized list with
a clear recommendation and direct handoff to content creation skills.
Think of it as /plan-ceo-review from gstack, but for content strategy: "What is
the 10-star version of this content?" ā except the answer is backed by engagement data.
Stage
This skill belongs to Stage S1: Research ā but it bridges directly into S2: Content Creation.
When to Use
- After
trending-content-scout ran ā use its data to pick the best angle
- User has a product/keyword but doesn't know what content to create
- User has multiple content ideas and wants to prioritize by data
- User wants to know: "If I only have time for ONE piece of content, what should it be?"
- Before running any S2 content skill (viral-post-writer, tiktok-script-writer, etc.)
Input Schema
keyword: string
product: object
name: string
description: string
url: string
reward_value: string
platform: string
creator_strengths: string[]
audience: string
time_budget: string
custom_angles: string[]
Auto-detection: If trending-content-scout ran earlier in the conversation,
its output is automatically used as the data foundation. No need to pass it explicitly.
Workflow
Step 1: Gather Engagement Data
If trending-content-scout output exists in context:
- Use
pattern_analysis (winning formats, hooks, engagement benchmarks)
- Use
content_gaps as angle candidates
- Use
top_content for competition assessment
- Skip to Step 2
If no scout data:
Run a quick scout internally:
web_search "[keyword] site:youtube.com" ā top 10 videos, note formats and view counts
web_search "[keyword] site:tiktok.com" OR web_search "[keyword] tiktok viral" ā top TikTok content
web_search "[keyword] site:reddit.com top" ā top Reddit discussions
web_search "[keyword] [platform] best performing" ā meta-analysis of what works
- Extract: dominant formats, popular hooks, view count ranges, gaps
This takes 30-60 seconds and provides enough signal for angle scoring.
Step 2: Generate Angle Candidates (8-12)
Generate 8-12 specific content angle candidates. Each angle must be concrete enough
to become a title ā not vague ("write about HeyGen") but specific ("HeyGen vs Synthesia:
I tested both for 30 days ā honest comparison for solo creators").
Sources for angles:
-
Gap-based angles (from scout data or web_search):
- Content gaps: topics nobody has covered well
- Format gaps: popular topic but missing in a specific format (e.g., comparison exists on YouTube but not TikTok)
- Audience gaps: existing content targets general audience, specific audience underserved
- Recency gaps: existing content is outdated, fresh version needed
-
Pattern-based angles (from winning formats):
- Take the winning format and apply it to the keyword
- Combine the best hook type with the topic
- Replicate the structure of the highest-engagement content with a fresh perspective
-
Contrarian angles:
- If all content is positive ā honest cons angle
- If all content targets beginners ā advanced user angle
- If all content is listicles ā deep single-product dive
-
User-provided angles (from custom_angles):
- Include any angles the user suggested
- Score them alongside generated candidates ā no bias
For each angle, define:
Angle:
title: string
angle: string
format: string
hook: string
hook_type: string
source: string
Step 3: Score Each Angle
Score every angle on 4 dimensions (1-10 each), then calculate a weighted total:
angle_score = (platform_fit Ć 0.25) + (competition_level Ć 0.30) +
(engagement_prediction Ć 0.30) + (creator_fit Ć 0.15)
Dimension 1: Platform Fit (weight: 25%)
How well does this format/hook work on the target platform?
| Format | YouTube | TikTok | LinkedIn | X | Reddit | Blog |
|---|
| comparison | 9 | 8 | 7 | 5 | 8 | 9 |
| review | 8 | 6 | 5 | 4 | 9 | 9 |
| tutorial | 9 | 7 | 6 | 3 | 7 | 10 |
| listicle | 7 | 8 | 9 | 8 | 6 | 8 |
| demo | 8 | 10 | 5 | 4 | 3 | 5 |
| story | 6 | 9 | 10 | 8 | 7 | 7 |
| reaction | 7 | 10 | 4 | 6 | 5 | 3 |
| explainer | 8 | 5 | 8 | 6 | 8 | 9 |
Adjust based on actual scout data if available (if comparisons outperform on a platform
where they usually don't, use the real data instead of the default table).
Dimension 2: Competition Level (weight: 30%)
How many similar content pieces already exist? Higher score = LESS competition.
IF scout data available:
Count how many top_content pieces match this angle's format + similar topic
10 = zero similar content found (blue ocean)
7-9 = 1-3 similar pieces (low competition)
4-6 = 4-10 similar pieces (moderate competition)
1-3 = 10+ similar pieces (saturated)
IF no scout data:
web_search for the exact angle title ā count results
Fewer results with exact match = higher score
Dimension 3: Engagement Prediction (weight: 30%)
How likely is this angle to get high engagement based on data?
IF scout data available:
Look at engagement scores of similar formats and hooks in top_content
If this angle's format has avg_engagement > median ā higher score
If this angle's hook_type has avg_engagement > median ā higher score
Combine: angle uses top format + top hook ā 9-10
Angle uses average format + average hook ā 5-6
Angle uses underperforming format ā 3-4
IF no scout data:
Use platform defaults and general engagement patterns
Comparisons generally outperform reviews ā 8 vs 6
Bold claim hooks generally outperform questions ā 8 vs 6
Dimension 4: Creator Fit (weight: 15%)
How well does this angle match the creator's strengths?
IF creator_strengths provided:
"storytelling" ā story format, relatable hooks ā high fit
"technical" ā tutorial format, demo hooks ā high fit
"humor" ā reaction format, relatable hooks ā high fit
"authority" ā review format, bold claim hooks ā high fit
"visual" ā demo format, demo_first hooks ā high fit
"data" ā comparison format, explainer ā high fit
"personal_experience" ā story format, reaction ā high fit
Match count: 2+ matches ā 9-10, 1 match ā 6-7, 0 matches ā 4-5
IF no creator_strengths:
Default all angles to 7 (neutral)
Step 4: Rank and Add Difficulty/Time Estimates
Sort angles by angle_score descending.
For each angle, estimate:
difficulty: string
estimated_time: string
Difficulty mapping:
- easy: Listicle, simple reaction, short demo, Twitter thread ā 30-60 min
- medium: Comparison (need 2 products), tutorial with steps, story post ā 1-3 hours
- hard: Deep review with testing, data-driven explainer, long-form video ā 3+ hours
If time_budget is provided, flag angles that exceed the budget.
Step 5: Self-Validation
Before presenting output, verify:
If any check fails, fix the output before delivering. Do not flag the checklist to the user.
Output Schema
output_schema_version: "1.0.0"
keyword: string
platform: string
data_source: string
angles_generated: number
top_angle:
title: string
angle: string
format: string
hook: string
hook_type: string
score: number
why: string
difficulty: string
estimated_time: string
all_angles:
- title: string
angle: string
format: string
hook: string
hook_type: string
platform_fit: number
competition_level: number
engagement_prediction: number
creator_fit: number
score: number
difficulty: string
estimated_time: string
source: string
recommended_next_skill: string
recommended_skill_params:
format: string
hook_style: string
angle: string
Output Format
## Content Angle Ranker: [Keyword] on [Platform]
### Data Foundation
š Based on: [trending-content-scout output (20 pieces analyzed) | quick web_search scan]
---
### š„ #1 Recommended Angle ā Score: [X.X]/10
**"[Specific Title]"**
| Dimension | Score | Evidence |
|-----------|-------|----------|
| Platform Fit | X/10 | [Format] works well on [Platform] ā [data point] |
| Competition | X/10 | [Number] similar pieces exist ā [assessment] |
| Engagement Prediction | X/10 | [Format] + [hook] averages [X] engagement in this niche |
| Creator Fit | X/10 | Matches your strengths in [X] |
| **Total** | **X.X/10** | |
- **Format:** [comparison] | **Hook:** [bold_claim]
- **Opening line:** "[Actual hook sentence]"
- **Difficulty:** [medium] | **Time:** [1-2 hours]
- **Why this wins:** [2-3 sentences of data-backed reasoning]
---
### š„ #2 ā "[Title]" ā Score: [X.X]/10
- Format: [X] | Hook: [X] | Competition: [X/10] | Time: [X]
- **Why:** [1 sentence]
### š„ #3 ā "[Title]" ā Score: [X.X]/10
- Format: [X] | Hook: [X] | Competition: [X/10] | Time: [X]
- **Why:** [1 sentence]
---
### All Angles Ranked
| # | Title | Format | Hook | Plat. Fit | Comp. | Eng. Pred. | Creator | Score | Time |
|---|-------|--------|------|-----------|-------|------------|---------|-------|------|
| 1 | ... | comparison | bold_claim | 9 | 8 | 9 | 8 | 8.7 | 2h |
| 2 | ... | demo | demo_first | 10 | 7 | 8 | 7 | 8.0 | 1h |
| 3 | ... | story | relatable | 9 | 6 | 7 | 9 | 7.5 | 1h |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
---
### ā” Quick Win vs Best Bet
| Strategy | Angle | Score | Time | Best For |
|----------|-------|-------|------|----------|
| **Quick Win** | [Easiest high-scoring angle] | X.X | 30min | "I want to ship something today" |
| **Best Bet** | [Highest scoring angle] | X.X | 2h | "I want the best possible content" |
| **Contrarian** | [Highest-scoring contrarian] | X.X | Xh | "I want to stand out from everyone" |
---
### š Next Steps
**To create Angle #1:**
Skill: [viral-post-writer | tiktok-script-writer | affiliate-blog-builder]
Parameters:
product: [product name]
format: [comparison]
hook_style: [bold_claim]
angle: "[specific angle description]"
platform: [platform]
**Alternative paths:**
- `tiktok-script-writer` ā for short-form video version of Angle #1
- `content-pillar-atomizer` ā create a blog post, then atomize across all platforms
- `comparison-post-writer` ā if the winning angle is a comparison
Error Handling
- No scout data and no keyword: Ask user: "What topic or product are you creating content for? And which platform?"
- Only 1 platform specified + limited data: Generate angles anyway using platform-specific defaults. Note: "Limited data available. Scores are based on general platform patterns. Run
trending-content-scout first for data-backed scoring."
- All angles score similarly (within 0.5 points): Spread them out by double-weighting the most differentiating dimension. Present as: "These angles are closely matched. The tiebreaker is [competition/creator fit/etc.]."
- User's custom angles score low: Still include them but be honest: "Your angle '[X]' scored [X.X/10] ā competition is high and the format doesn't match platform trends. Consider the #1 angle instead, or combine your angle with a [winning format]."
- Time budget too short for any good angle: Recommend the easiest angle regardless of score, and flag: "With [30 min], your best option is [quick angle]. For higher impact, allocate [2 hours] for [best angle]."
Examples
Example 1:
User: "I want to promote HeyGen on TikTok. What angle should I use?"
ā keyword: "HeyGen", platform: "tiktok"
ā Quick scout: web_search "HeyGen tiktok" ā mostly demo-first content, 30-45s
ā Generate 10 angles: "HeyGen vs Synthesia comparison", "I made a $2000 video for free with HeyGen",
"POV: your boss asks for a video and you use AI", "HeyGen for real estate agents", etc.
ā Top angle: "I replaced a $2000 video production with HeyGen" ā Score: 8.7
(bold_claim hook, demo format, low competition on TikTok, high engagement predicted)
ā Next: tiktok-script-writer with hook_style: bold_claim, duration: 45s
Example 2:
User: "Rank these content ideas for my YouTube channel about email marketing:
- ConvertKit vs Mailchimp comparison
- How I grew my list to 10K subscribers
- Top 5 email marketing mistakes"
ā platform: "youtube", custom_angles provided
ā Scout YouTube for email marketing content
ā Score all 3 + generate 5 additional angles
ā Result: "How I grew to 10K" scores highest (story format + bold_claim = 8.5)
because competition for comparisons is saturated (score: 6.2) and listicles are average (7.1)
ā The user's story angle wins ā with a suggested hook: "I went from 0 to 10K subscribers in 6 months. Here's what nobody tells you."
Example 3:
User: "I'm good at storytelling and humor. What should I create about AI writing tools on LinkedIn?"
ā creator_strengths: ["storytelling", "humor"], platform: "linkedin"
ā Generate angles weighted toward story format
ā Top: "I let AI write my LinkedIn posts for a week. My boss noticed." ā Score: 9.1
(story format, relatable hook, low competition on LinkedIn for this angle, perfect creator fit)
Feedback & Issue Reporting
When this skill produces unexpected, incomplete, or incorrect output, generate a
skill_feedback block (see shared/references/feedback-protocol.md for full schema).
Skill-specific failure modes:
- All angles score within 0.5 points: Scoring not differentiated enough. Report as
wrong_output with the scores.
- Top angle is generic: "Write a review of X" instead of a specific, titled angle. Report as
data_quality.
- Downstream skill can't use recommended_skill_params: Schema mismatch. Report as
chain_break.
Auto-detect triggers:
- Score range (max - min) < 1.0 across all angles
- <8 angles generated
recommended_skill_params missing required fields for the suggested next skill
Report issues: GitHub Issues | Discussions
References
shared/references/social-data-providers.md ā API configuration and engagement score formula
shared/references/flywheel-connections.md ā master flywheel connection map
shared/references/platform-rules.md ā platform-specific content guidelines
shared/references/feedback-protocol.md ā issue detection and reporting standard
Flywheel Connections
Feeds Into
viral-post-writer (S2) ā recommended_angle with format, hook, and parameters
tiktok-script-writer (S2) ā TikTok-specific angle with duration and hook
twitter-thread-writer (S2) ā X-specific angle with hook
reddit-post-writer (S2) ā Reddit-specific angle with subreddit suggestion
affiliate-blog-builder (S3) ā blog angle with SEO keyword alignment
comparison-post-writer (S3) ā if winning angle is a comparison
content-pillar-atomizer (S2) ā angle as the pillar topic to atomize
Fed By
trending-content-scout (S1) ā engagement data, patterns, gaps, benchmarks
niche-opportunity-finder (S1) ā niche context for angle generation
competitor-spy (S1) ā competitor gaps to exploit
performance-report (S6) ā historical angle performance data
Feedback Loop
- S6
performance-report shows which angles actually performed ā update scoring weights and format preferences for next run ā content strategy improves with every cycle
chain_metadata:
skill_slug: "content-angle-ranker"
stage: "research"
timestamp: string
suggested_next:
- "viral-post-writer"
- "tiktok-script-writer"
- "affiliate-blog-builder"