| name | competitor-content-intel |
| description | Weekly competitor tracking + content pipeline. Scans YouTube and X for creators in your niche, finds the top trending topics, writes full video scripts in your voice, drafts one X article, creates tasks in Todoist, and posts a summary to Discord. One run, full job. |
Competitor Content Intel → Full Content Pipeline
One run does everything: scrape competitors → identify trending topics → write video scripts in your voice → draft X article → create Todoist tasks → post Discord summary.
Setup
Before running, configure the following in your environment:
X_BEARER_TOKEN=
NOTION_API_KEY=
TODOIST_API_KEY=
DISCORD_CHANNEL_ID=
NOTION_SCRIPTS_PARENT_ID=
NOTION_SWIPE_FILE_ID=
TODOIST_PROJECT_ID=
TODOIST_SECTION_ID=
Competitors to Track
Edit this list to match your niche. The default list is for the AI tools / coding / indie hacking space:
| Creator | YouTube Channel | X Handle |
|---|
| Alex Finn | @alexfinndev | @alexfinndev |
| NoCode MBA | @nocodemba | @nocodemba |
| Drake Surach | Search "Drake Surach AI" | @drakesurach |
| Matt Berman | @MattVidPro | @mattberman_ |
| Cole Medin | @ColeMedin | @ColeMedin |
| Nick Dobos | @NickDobos | @NickDobos |
| McKay Wrigley | @McKayWrigley | @mckaywrigley |
| Greg Isenberg | @GregIsenberg | @gregisenberg |
| Pieter Levels | @levelsio | @levelsio |
| Andrej Karpathy | @AndrejKarpathy | @karpathy |
| Riley Brown | @rileybrown_ai | @rileybrown_ai |
| Nick St. Pierre | Search "Nick St Pierre AI" | @nickstPierre |
| Ammaar Reshi | @ammaar | @ammaar |
| David Shapiro | @DavidShapiroAI | @DavidShapiroAI |
| Sam Witteveen | @samwitteveenai | @samwitteveen |
| The AI Advantage | @TheAIAdvantage | @AI_Advantage |
| Fireship | @Fireship | @fireship_dev |
| NetworkChuck | @NetworkChuck | @NetworkChuck |
| Tina Huang | @TinaHuang1 | @_tinahuang |
| All About AI | @AllAboutAI | @allabtai |
| Unconventional Coding | @UnconventionalCoding | — |
| Logan Kilpatrick | — | @OfficialLoganK |
Add your own niche-specific creators to this table. The more targeted your list, the better the topic recommendations.
Your Channel Profile
Update this section to reflect your channel before running:
Channel: YOUR_YOUTUBE_HANDLE
Subscribers: X
Niche: [e.g. AI tools, SaaS, coding tutorials, crypto]
Top performing content: [e.g. tool comparisons, hands-on builds, tutorials]
Style: [e.g. casual, technical, documentary]
X handle: YOUR_X_HANDLE
X followers: X
The agent uses this profile when writing scripts to make sure the angle matches YOUR voice and competitive position — not a generic creator.
Step 1 — YouTube Research (last 7 days only)
For each competitor, use web_fetch on their YouTube channel's videos tab:
https://www.youtube.com/@{handle}/videos
Extract: video title, view count, publish date, URL. Only include videos published in the last 7 days. Skip anything older.
Pick the 1-2 highest-view videos per creator. If a creator posted nothing in the last 7 days, skip them.
Step 2 — X Research (last 7 days, X API only)
Use the X API directly. Do NOT use web_search for X data — it returns unreliable results.
curl -s -X GET "https://api.twitter.com/2/tweets/search/recent?query=YOUR_KEYWORD_1%20OR%20YOUR_KEYWORD_2%20OR%20YOUR_KEYWORD_3&max_results=50&tweet.fields=public_metrics,created_at,author_id&sort_order=relevancy" \
-H "Authorization: Bearer $X_BEARER_TOKEN"
curl -s -X GET "https://api.twitter.com/2/tweets/search/recent?query=from%3A{handle}&max_results=10&tweet.fields=public_metrics,created_at&sort_order=relevancy" \
-H "Authorization: Bearer $X_BEARER_TOKEN"
Pull top posts by likes. Note topic, engagement, and why it performed.
Step 3 — Identify Top 3 Topics
After pulling YouTube + X data, identify the 3 topics with the most engagement this week. For each:
- What is the specific angle?
- Why is it performing? (novelty, controversy, tutorial demand)
- What's YOUR unique version? (what do you have that they don't — access, receipts, live builds, real numbers)
Write to a local state file for handoff to downstream steps:
mkdir -p ./state
python3 << PYEOF
import json, datetime
topics = [
{"title": "TOPIC_1", "source": "SOURCE / PLATFORM", "url": "URL"},
{"title": "TOPIC_2", "source": "SOURCE / PLATFORM", "url": "URL"},
{"title": "TOPIC_3", "source": "SOURCE / PLATFORM", "url": "URL"},
]
data = {"updatedAt": datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ'), "topics": topics}
json.dump(data, open('./state/trending-topics.json', 'w'), indent=2)
print("Written")
PYEOF
Step 4 — Load Your Voice (MANDATORY before writing anything)
Before writing a single word:
- Read your voice/style guide (a SKILL.md or markdown file describing your tone, vocabulary, sentence structure, hooks, and what you never do)
- Pull your swipe files — examples of your best performing content
curl -s "https://api.notion.com/v1/blocks/$NOTION_SWIPE_FILE_ID/children" \
-H "Authorization: Bearer $NOTION_API_KEY" \
-H "Notion-Version: 2022-06-28"
Apply hook patterns and structural patterns from the swipe files. If you skip this step, the scripts will sound generic — the whole point of this pipeline is content that sounds like you, not like an AI wrote it.
Step 5 — Write Video Scripts in Notion (3 scripts)
For each of the 3 topics, create a Notion page under $NOTION_SCRIPTS_PARENT_ID.
Script page structure:
- Date + Why Now — today's date, why this topic is hot this specific week
- Title — punchy, search-optimized YouTube title
- Hook (first 30 seconds) — must match a pattern from your swipe files. Never generic.
- Outline — 6-8 bullet points (talking points, not word-for-word)
- CTA — what to say at the end
- Thumbnail concept — one sentence
- Why it'll perform — your unique angle vs the competitor version
- Original inspiration — embed the competitor video/tweet that sparked the idea
Embedding Links (MANDATORY for tweets and YouTube links)
Never paste raw URLs. Use Notion embed blocks:
{
"object": "block",
"type": "embed",
"embed": { "url": "TWEET_OR_YOUTUBE_URL" }
}
Use "type": "embed" for Twitter/X posts and YouTube videos.
Use plain paragraph text for regular article links.
Notion API — Create Script Page:
curl -s -X POST "https://api.notion.com/v1/pages" \
-H "Authorization: Bearer $NOTION_API_KEY" \
-H "Notion-Version: 2022-06-28" \
-H "Content-Type: application/json" \
-d '{
"parent": {"page_id": "'"$NOTION_SCRIPTS_PARENT_ID"'"},
"properties": {"title": {"title": [{"text": {"content": "TITLE"}}]}},
"children": [BLOCKS]
}'
Save the returned page ID for each script.
Step 6 — Write X Article Draft (ONE only — best topic)
Pick the ONE topic with the most depth, strongest opinion, or clearest how-to that reads well as a standalone post. Ask: "could someone learn something real just from reading this?" If yes, that's the one.
X Format Rules (no exceptions):
- NEVER write a thread — one post only, always
- NEVER use hashtags
- NEVER add links in the body
- Write in your authentic voice — match your swipe files exactly
- No corporate language, no hedging, no AI slop phrases
X Article Format:
Long-form post — no character limit on X articles. Write as long as it takes to do the topic justice.
- Hook first line — make someone stop scrolling
- Multiple short paragraphs, each its own line break
- Technical but readable — explain the thing properly
- Real numbers, real examples, real context
- Punchy one-line closer
Quality Rules:
- No artificial length caps — stop when you've said everything worth saying
- Go deep technically — explain how it actually works
- Never "here's how" without actually explaining how
- Minimum 800 characters — if shorter, you haven't said enough
- Teach something concrete — reader should know something they didn't before
Paid Tier Suggestion (optional)
If you have a paid subscription tier, add a 💰 callout at the bottom of each script page suggesting what to put behind the paywall for that topic.
The rule: 99% is free (the concept, the explanation, the how-to). Paid = the actual artifact (the file, template, config, exact prompt, the thing they'd spend hours building themselves).
Create X article as child page under the chosen script page:
curl -s -X POST "https://api.notion.com/v1/pages" \
-H "Authorization: Bearer $NOTION_API_KEY" \
-H "Notion-Version: 2022-06-28" \
-H "Content-Type: application/json" \
-d '{
"parent": {"page_id": "CHOSEN_SCRIPT_PAGE_ID"},
"properties": {"title": {"title": [{"text": {"content": "[X ARTICLE] TITLE"}}]}},
"children": [BLOCKS]
}'
Step 7 — Create Todoist Tasks
curl -s -X POST "https://api.todoist.com/rest/v2/tasks" \
-H "Authorization: Bearer $TODOIST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"content": "🎬 TITLE",
"description": "Script: NOTION_URL",
"project_id": "'"$TODOIST_PROJECT_ID"'",
"section_id": "'"$TODOIST_SECTION_ID"'",
"due_string": "today"
}'
curl -s -X POST "https://api.todoist.com/rest/v2/tasks" \
-H "Authorization: Bearer $TODOIST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"content": "🐦 review x article — CHOSEN_TITLE",
"description": "X article draft: X_DRAFT_URL",
"project_id": "'"$TODOIST_PROJECT_ID"'",
"due_string": "today"
}'
Step 8 — Post to Discord
Post a single message to $DISCORD_CHANNEL_ID.
Format — links only, no content dumped into Discord:
content pipeline ran ✅
**{topic 1 title}** — 📝 {notion_url}
**{topic 2 title}** — 📝 {notion_url}
**{topic 3 title}** — 📝 {notion_url} + 🐦 x article: {x_draft_url}
nothing posted. x article ready for review.
Rules
- 7 days max — nothing older. Trending content is perishable.
- X API only — never web_search for X/Twitter data.
- Load your voice before writing — every single run, no exceptions.
- Embed tweets and YouTube links — never raw URLs in Notion.
- NEVER write a thread — one X post only, always.
- NEVER post to X directly — Notion drafts only. Human reviews and approves.
- Max 3 topics per run — quality over quantity.
- One X article draft — pick the best topic, write one post.
- Save script IDs to state file before posting to Discord — ensures output is recoverable if the session dies.
- ONE message to Discord — combine all output into a single message.
- 10 minute hard limit — if not done in 10 minutes, post whatever you have and stop.
Running as a Cron
This skill is designed to run daily via a cron job. Example OpenClaw cron config:
{
"name": "competitor-content-intel",
"schedule": { "kind": "cron", "expr": "0 10 * * *", "tz": "America/Chicago" },
"payload": {
"kind": "agentTurn",
"message": "Run the competitor-content-intel skill. Research competitors, identify top 3 topics from the last 7 days, write 3 video scripts and 1 X article draft to Notion, create Todoist tasks, post summary to Discord.",
"timeoutSeconds": 600
},
"sessionTarget": "isolated"
}
File Structure
competitor-content-intel/
├── SKILL.md ← this file
└── state/
├── trending-topics.json ← output from Step 3, input to content-factory
└── script-ids.json ← Notion page IDs written after Step 5
The state/trending-topics.json file is designed to be consumed by a downstream content-factory skill or cron if you want to chain pipelines.