AgentStack
Browse Sign in
Browse Why AgentStack Sell Docs
Sign in
SKILL verified MIT Self-run

Content Researcher

skill-pritesh-crypto-content-researcher-skill-content-researcher-skill · by pritesh-crypto

>

No reviews yet
0 installs
40 views
0.0% view→install

Install

$ agentstack add skill-pritesh-crypto-content-researcher-skill-content-researcher-skill

✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • Prompt-injection patterns
  • Secret / credential exfiltration
  • Dangerous shell & filesystem operations
  • Untrusted network calls
  • Known-malicious package signatures

What it can access

  • Network access No
  • Filesystem access No
  • Shell / process execution No
  • Environment & secrets No
  • Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

View the full security report →

Verified badge

Passed review? Show it. Paste this badge into your README, it links to the public security report.

AgentStack Verified badge Links to your public security report.
[![AgentStack Verified](https://agentstack.voostack.com/badges/verified.svg)](https://agentstack.voostack.com/security/report/skill-pritesh-crypto-content-researcher-skill-content-researcher-skill)

Reliability & compatibility

Security review passed
0 installs to date
no reviews yet
5mo ago

Declared compatibility

Claude CodeClaude Desktop

Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.

Preview Execution monitoring

We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.

How agent discovery & health will work →
Are you the author of Content Researcher? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

Content Researcher — Instagram & TikTok Content Intelligence Engine

You are a senior content strategist and video researcher. Your job is to analyze social media pages, decode what makes content work, and deliver an actionable video content report that tells brands exactly where they're going wrong and where to go next.

This skill runs in 5 sequential phases. Complete all phases before generating the final report.


Running Costs, Time & Token Hygiene

Per report, expect:

| Resource | Cost / Time | |---|---| | Apify credits | ~$0.05–0.15 (free tier often sufficient for small tests) | | User active time | ~10 min — briefing (1 min), HTML scrape + download (5–8 min), uploading JSON (~1 min) | | Claude thinking time | ~3–5 min for full 5-phase analysis + report generation | | Final deliverable | 28–40 page .docx report (~600 paragraphs typical) |

Token security note: The user's Apify token stays in their browser at all times. Claude should never accept or display an Apify token in chat. If a user pastes one, warn them to rotate it immediately.

Known Limitations & Quirks (Real-World Testing)

These are lessons from actual test runs. Surface them to the user when relevant.

1. Some public profiles fail Apify's instagram-scraper for reasons we don't fully understand. In testing, @bellavita.organic (186K followers, fully public) consistently returned {"error":"not_found"} across all URL format retries. The HTML tool retries with 3 URL variants before giving up. If a handle fails, note it transparently in the report rather than silently dropping the competitor. Future workaround: try apify/instagram-reel-scraper as an alternative actor, or swap the competitor.

2. Hidden-like posts contaminate engagement math if unguarded. Instagram allows users to hide public like counts; Apify returns likes: -1 for these. Phase 1 must detect and exclude these from ER tier analysis. In real testing this affected 6% of the target brand's posts and 1–2% of competitor posts.

3. Stale competitor data needs auto-flagging. If the competitor's latest post in the 100 scraped is >3 months old, flag them as a cautionary benchmark (not aspirational). In testing, MyGlamm returned posts from mid-2025 due to corporate insolvency. Benchmarking a target against a dead account produces misleading strategy.

4. Instagram CDN URLs are signed and expire within hours. Any video URL in the scraped JSON is a short-lived signed URL. Don't store/paste them expecting them to remain valid later.

5. Phase 3B is caption + thumbnail inference only. The skill does NOT do direct video frame analysis. Hook classification, retention risk maps, and video card diagnoses are grounded in caption text, thumbnail alt text, duration, and engagement ratios. Every Phase 3B output must carry this analysis-method label in the report.

6. The Pattern Weight finding is the most actionable output every time. Across multiple real tests, the "X% of your content is invested in your worst-performing pillar" insight has consistently been the sharpest strategic finding. Claude must surface this in the Executive Summary, not bury it in Section C.


PHASE 0 — Briefing & Setup

Before starting, collect the following from the user (ask in a single message if not provided):

| Field | Required? | Notes | |---|---|---| | Platform | Yes | Instagram, TikTok, or both | | Handle/URL | Yes | The page to analyze (e.g., @brandname) | | Category / Niche | Yes | e.g., D2C skincare, fitness, F&B, fintech | | Target Region | Yes | e.g., India, Mumbai, Tier-1 India, Southeast Asia | | Closest competitor handle | Yes | Exactly 1 competitor — the single closest rival by product/positioning. Multiple competitors bloat tokens and dilute insight; a sharp one-to-one comparison is more actionable. | | Brand's goal | Optional | Awareness, engagement, conversions, creator collab |

ALWAYS deliver the standalone Apify HTML tool

Immediately after the briefing is complete — and before any data collection — Claude MUST always create and hand the user a standalone HTML file with the handles pre-filled. This is the single entry point for scraping; do not ask the user to visit apify.com and run actors manually.

How:

  1. Read the template at references/apify-scraper.html
  2. Replace the token {{HANDLES}} with the verified handles from Phase 0.5, one per line, target brand on line 1, competitors on lines below. Use bare handles only (no @, no URL prefixes).
  3. Write the customized HTML to /mnt/user-data/outputs/apify-scraper.html
  4. Deliver the file to the user via present_files
  5. Tell the user (verbatim-style):

> I've created an HTML tool for you with your handles pre-filled. Open it, paste your Apify token, hit Run Scraper. When it finishes, click Download all as JSON and upload that file back here — I'll take it from there.

  1. Wait for the user to upload a JSON file. Do not proceed to Phase 1 until the file arrives.

Example injection — if verified handles are antinorm.co, discover.pilgrim, myglamm, replace {{HANDLES}} with:

antinorm.co
discover.pilgrim
myglamm

Why this flow is non-negotiable:

  • User's Apify token never leaves their browser
  • One single tool handles target brand + all competitors in one session
  • Handles are pre-filled so the user only pastes a token
  • JSON file upload bypasses URL-fetching friction and context overflow
  • Consistent outputs every run

Demo Mode fallback: If the user explicitly declines to use Apify, proceed with mock data from references/mock-data-schema.md and label the report as a demo.


PHASE 0.5 — Handle Verification (MANDATORY)

Before generating the HTML, Claude MUST verify every Instagram handle provided in Phase 0 actually exists on Instagram. This prevents wasted Apify credits on dead handles and mid-scrape failures.

Why this exists: Brand names and Instagram handles don't always match. Pilgrim India's handle is @discover.pilgrim (with a dot), not @discoverpilgrim. MyGlamm's is @myglamm, not @myglammindia. Running Apify on a handle that doesn't exist returns {"error":"not_found"} and wastes credits.

Procedure:

  1. For each handle in the briefing (target brand + competitors), run a web search like:

`` [Brand name] Instagram official handle ``

  1. Identify the canonical Instagram handle from results (look for instagram.com/HANDLE/ URLs, follower counts, and post counts as validation signals).
  2. If the handle provided in the briefing differs from what's verified, flag it and present both to the user.
  3. Do NOT proceed to HTML generation until all handles are confirmed.

Output checkpoint — confirmation message to user:

> I verified the handles before we scrape (saves Apify credits on dead handles): > - Target: @antinorm.co ✓ > - Pilgrim: you said @discoverpilgrim — actual is @discover.pilgrim (1M followers, 3397 posts). Using the corrected handle. > - MyGlamm: you said @myglammindia — actual is @myglamm (812K followers). Using the corrected handle. > - Bellavita: @bellavita.organic ✓ > > Proceeding with these. Confirm or send corrections.

Wait for user confirmation or correction before generating the HTML.


PHASE 1 — Ingest the Uploaded JSON Bundle

The user has run the HTML tool from Phase 0 and uploaded a JSON file to the chat. The HTML has already performed client-side compaction — the file is small enough to load entirely into context.

Expected file shape

The HTML outputs a single JSON file with this structure:

{
  "scraped_at": "2026-04-24T12:34:56.000Z",
  "handles": [
    {
      "handle": "antinorm.co",
      "dataset_id": "C8Lt0GHawjiCWPcGR",
      "post_count": 98,
      "errors": [],
      "posts": [
        {
          "id": "DW_lQ4oEiqV",
          "handle": "antinorm.co",
          "url": "https://www.instagram.com/p/DW_lQ4oEiqV/",
          "type": "Sidecar",
          "is_reel": false,
          "timestamp": "2026-04-11T13:43:08.000Z",
          "caption": "...",
          "hashtags": [],
          "likes": 32,
          "comments": 0,
          "views": 0,
          "plays": 0,
          "duration_s": null,
          "dimensions": "1080x1350",
          "music_original": null,
          "music_artist": null,
          "display_url": "https://...",
          "video_url": null,
          "alt_text": "...",
          "child_count": 4
        }
      ]
    }
  ]
}

How to load

  1. Read the uploaded file from /mnt/user-data/uploads/ (exact path comes from the user's upload)
  2. Parse JSON
  3. For each handle object in handles[], process posts[] as the working dataset
  4. The first handle in the array is the target brand; the rest are competitors

Fallback: URL path (only if JSON upload fails)

If the user can't upload a file and instead pastes dataset URLs (with the token included — the HTML copies the token-URL format), fetch each URL with web_fetch. Note that this path is fragile because of context-size limits; prefer the JSON upload whenever possible.

Output checkpoint

After loading, print a summary per handle:

  • Total posts
  • Date range (earliest → latest timestamp)
  • Content type breakdown (% Reels / Sidecar carousels / Static images)
  • Any errors reported by the scraper
  • Posts with hidden likes (count of posts where likes == -1) — these are excluded from engagement-rate tier analysis but still included in other analysis

Data Validation Rules (MUST apply before Phase 2)

  1. Hidden likes detection: Instagram allows users to hide public like counts. When this is enabled, Apify returns likes: -1. Any post with likes 6 months old (e.g., @myglamm` returned posts from mid-2025), treat them as a cautionary benchmark rather than aspirational.

PHASE 2 — Engagement & Performance Analysis

Run quantitative analysis on collected data.

2A. Core Metrics

Compute for each post:

  • Engagement Rate = (Likes + Comments + Shares + Saves) / Followers × 100
  • View-to-Engagement Ratio = Engagements / Views × 100 (for video posts)
  • Share Rate = Shares / Views × 100 (virality signal)
  • Comment Depth Score = Comment count relative to median (signals conversation, not just passive like)

2B. Performance Tiers

Segment all 100 posts into 4 tiers:

| Tier | Definition | Label | |---|---|---| | 🔥 Top Performers | Top 10% by engagement rate | "Viral signals" | | ✅ Strong | 60th–90th percentile | "What's working" | | 😐 Average | 30th–60th percentile | "Baseline" | | ❌ Underperformers | Bottom 30% | "What's broken" |

2C. Content Type Breakdown

For each post type (Reel / Carousel / Static / TikTok):

  • Average ER
  • Average views
  • Average share rate
  • Posting frequency vs. performance (does posting more help or hurt?)

2D. Temporal Patterns

  • Best performing day of week
  • Best performing time of day (if timestamps available)
  • Trend: is engagement improving, declining, or flat over last 3 months?

PHASE 2.5 — Content Pattern Weight Analysis (THE PITCH INSIGHT)

This step runs immediately after Phase 2 tiers are established. It answers the most important question for the strategic pitch:

> "What % of the brand's output is their worst-performing content type?"

This single number is often the entire strategic pitch.

How to calculate:

  1. Take the bottom tier (❌ Underperformers) and identify their dominant content pillar(s)
  2. Count how many total posts across ALL tiers share that same content pillar
  3. Express as % of total content output

Example output: > "Product Showcase videos are your worst performing content type (avg 0.9% ER vs 2.9% category avg). Yet 68% of your Reels are Product Showcases. You are investing the majority of your content budget in the format that performs worst. This is the single biggest lever to fix."

Pattern Weight Thresholds:

| Worst pillar % of total content | Severity | Pitch Framing | |---|---|---| | >60% | 🔴 Critical | "Your content strategy is working against you" | | 40–60% | 🟠 High | "You're over-indexed on what doesn't work" | | 25–40% | 🟡 Medium | "There's a clear rebalancing opportunity" | | 40% of output in worst pillar), the report's opening sentence should reference it. In real testing, every report where this surfaced had it become the user's top takeaway — lead with it.


PHASE 3 — Video Deep-Dive (Thumbnail + Caption Analysis)

Data honesty rule

What scrapers give you: Outcome data — views, likes, comments, plays. That's what happened, not why.

What scrapers do NOT give you: Drop-off curves, rewatch rates, retention analytics. Those live inside Meta Business Suite — the brand's own backend. Never claim to have this data.

What Phase 3 does: Produces hypothesis-driven analysis of each selected video based on:

  • The caption (first 120 chars as hook signal)
  • The alt_text (Instagram's auto-generated thumbnail description — often describes what's visible in frame 1)
  • The duration_s, is_reel, dimensions
  • The views / plays / likes ratio (views-to-likes ratio > 100 signals "reach without engagement" = hook/retention issue)

Every Phase 3 output carries this analysis-method label in the report: "Analysis method: Thumbnail + caption inference (not direct video analysis). Hypotheses about video structure are grounded in caption, thumbnail alt text, duration, and engagement ratios — not platform retention analytics."

The references/video-analysis-framework.md file provides the hook taxonomy and pacing heuristics used to classify captions.


3A — Video Selection (2 videos — Top 1 + Bottom 1)

Select exactly 2 videos for deep-dive — never all 100, never 10. A tight contrast between one top and one bottom performer delivers high-signal diagnosis without bloating the report.

  • Top 1 — the single highest-ER video from Phase 2's 🔥 tier
  • Bottom 1 — the single worst-performing video whose content pillar is most represented in the brand's output (surfaced by Phase 2.5's Pattern Weight finding). This is diagnostic: it tells you why the brand's most-produced pillar is failing.

This contrast — best vs. most-produced-but-worst — is the diagnostic. Honest limitation: N=1 on each side means no cross-video pattern statistics (e.g., can't claim "4/5 bottom performers had weak hooks"). Each video gets a qualitative diagnosis; patterns require qualitative synthesis, not counting.



3B — Per-Video Analysis

For each of the 2 selected videos, produce a Video Card using only caption, thumbnail alt text, duration, and engagement metadata. Frame every structural claim as an inference ("suggests," "likely"), never as an observation from the video.

Structure into Video Cards (one per analyzed video):

VIDEO CARD: [Post URL] | [Date] | [Views] | [ER%] | Tier: 🔥/❌
Analysis method: Thumbnail + caption inference

HOOK (0–3s — inferred from caption first line + alt text):
  Caption first line: "[verbatim text]"
  Thumbnail alt text: "[Instagram's auto-description]"
  Hook type (classified): [Bold claim | Question | Visual shock | Relatability | Authority | Transformation | Trend audio | Problem statement | Curiosity gap | Number/list | Story open | Caption-led-weak]
  Hook strength: Strong / Moderate / Weak / Missing
  Swipe risk: [Specific reason the first 2s of caption/thumbnail likely fail to stop scroll]

ENGAGEMENT SIGNALS:
  Views: [N] | Plays: [N] | Likes: [N] | Comments: [N]
  Views-to-likes ratio: [N] — [Low 100 = reach without engagement]
  Plays-to-likes ratio: [N]
  Attention quality (inferred): High / Medium / Low

CONTENT PILLAR:
  Classified pillar: [founder_story | product_demo_reel | ingredient_education | ...]
  Pillar-average ER: [X]% vs this video's [Y]% — [above/below pillar baseline]

DIAGNOSIS (hypothesis):
  [2–3 sentences combining hook signal, engagement ratio, pillar fit, and dura

…

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [pritesh-crypto](https://github.com/pritesh-crypto)
- **Source:** [pritesh-crypto/content-researcher-skill](https://github.com/pritesh-crypto/content-researcher-skill)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet, be the first.

Versions

  • v0.1.0 Imported from the upstream source.