competitor-pr-finder
Give it your product URL or description. It finds your top 5 competitors, runs three-track PR research across all of them (editorial, podcasts, communities), identifies which channels appear most frequently, looks up the journalist or host for each, and returns a tiered outreach list with story angles and ready-to-send cold pitch drafts tailored to your product. Use when asked to find PR opportunities, discover where competitors got featured, build a media outreach list, find which journalists cover my space, or get pitch templates for press coverage.
npx skills add Varnan-Tech/opendirectory --skill competitor-pr-finder --agent claude-code
Same command for any agent — swap --agent for codex, cursor, copilot.
Weekly change comes from our own snapshots, not the repository page — it measures attention, not adoption.
What it does
Competes by taking a product URL or description, finds the top 5 competitors, and performs three-track PR research across each competitor (editorial, podcasts, communities). It identifies channels that appear across multiple competitors, locates journalists or hosts for those channels, and drafts a tiered outreach list with story angles and ready-to-send cold pitch drafts tailored to the product. Triggered when asked to find PR opportunities, discover where competitors were featured, build a media outreach list, identify reporters in the space, or obtain pitch templates for coverage.
How it works
- Step 1: Setup checks for API keys and required environment. If missing TAVILY_API_KEY, the workflow instructs stopping with a specific message; if only FIRECRAWL_API_KEY is missing, Tavily extract is used as fallback.
- Step 2: Parse input to obtain product URL or description, optional product name, geography, and derive a product slug. If only a pasted description is provided, the flow uses it as product_content and marks page_source as user_description.
- Step 3: Fetch product page content via Firecrawl (preferred) or Tavily extract as fallback, saving raw content to /tmp/cprf-product-raw.md and validating content length.
- Step 4: Analyze the product page to produce a structured JSON (/tmp/cprf-product-analysis.json) including product_name, one_line_description (under 20 words, non-marketing), industry_taxonomy (l1/l2/l3), differentiators (2-3 exact items), icp (buyer_persona, company_type, company_size), geography_bias, and page_source.
- Step 4b: Phase 1 – Competitor Discovery uses a research script to identify 5 competitors based on the product analysis, collecting name, url, description, and source_url per competitor.
- Step 5: Present discovered competitors to the user and await confirmation, allowing edits. Store confirmed candidates and later the confirmed list as /tmp/cprf-competitors-confirmed.json.
- Step 6: Phase 2 – Three-Track PR Research runs PR searches for each confirmed competitor in three tracks (Editorial, Podcasts, Communities) and prints a summary, then proceeds to pattern analysis.
- Step 7: Pattern Analysis builds a channel frequency map, normalizes URLs, tallies channel appearances across competitors, and classifies channels into Tier 1 (3+ competitors), Tier 2 (2), and Tier 3 (1). It extracts story angles from titles and classifies angles into categories like funding-announcement, product-launch, founder-story, etc. Results are saved to /tmp/cprf-pr-patterns.json.
- Step 8: For Tier 1 channels (up to 7), perform targeted Tavily searches to lookup journalists/hosts and verify sources for a final list of outreach targets.
When to use it
Use when asked to find PR opportunities, discover where competitors got featured, build a media outreach list, find which journalists cover the space, or obtain pitch templates for press coverage. The workflow is designed to require explicit confirmation of competitors before proceeding to PR research.
What it can touch
- Tools: claude-code, copilot
- Inputs/outputs are handled via scripts and JSON files in /tmp (e.g., /tmp/cprf-product-analysis.json, /tmp/cprf-competitors-confirmed.json, /tmp/cprf-pr-patterns.json).
- It relies on external services: Firecrawl (POST to https://api.firecrawl.dev/v1/scrape) or Tavily extract (POST to https://api.tavily.com/extract).
Caveats
- Requires TAVILY_API_KEY for competitor PR research; if missing, the process halts with instructions. Specific error messaging is included in the shell steps.
- Zero-hallucination policy mandates all channels, journalist names, angles, and pitches trace to Tavily search results or fetched product pages; no use of memory or generic knowledge for names or URLs.
- If fewer than 3 Tier 1 channels emerge, the system notes this normality for niche markets and may promote Tier 2 channels to reach a broader outreach set. The data_quality_flags field is used to annotate such adjustments.
- Outputs depend on user confirmation to finalize competitor lists before proceeding with PR research.
# Competitor PR Finder Give it your product URL. It finds your competitors, researches every PR channel they used (news, podcasts, communities), surfaces the channels that appear across multiple competitors (your proven targets), finds the journalist or host for each, and drafts a personalized cold pitch for your product at every tier-1 channel. --- **Zero-hallucination policy:** Every channel, journalist name, story angle, and pitch detail in the output must trace to a specific Tavily search result or the fetched product page. This applies to: - Competitor names: must appear in Tavily search results, not AI training knowledge - Channel names: must have a URL in the search results - Journalist/host names: must appear verbatim in a Tavily snippet - Story angles: extracted from article/episode titles in search results only - Pitch drafts: reference specific evidence from search data + product analysis --- ## Common Mistakes | The agent will want to... | Why that's wrong | |---|---| | Name a journalist from training knowledge | Every journalist name must trace to a search result snippet. Writing "Sarah Perez covers startups at TechCrunch" from memory is hallucination. | | List channel
- Common Mistakes
- Read Reference Files Before Each Run
- Step 1: Setup Check
- Step 2: Parse Input
- Step 3: Fetch Product Page
- Step 4: Product Analysis (AI)
- Step 4b: Phase 1 -- Competitor Discovery
- Step 5: Competitor Confirmation
- Step 6: Three-Track PR Research (Phase 2)
- Step 7: Pattern Analysis (AI)
- Step 8: Journalist / Host Lookup
- Step 9: Synthesis -- Generate Outreach Packages (AI)
- Step 10: Self-QA, Present, and Save
cat references/pr-channel-types.md
cat references/pitch-guide.md
cat references/tier-scoring.md
echo "TAVILY_API_KEY: ${TAVILY_API_KEY:+set}${TAVILY_API_KEY:-NOT SET -- required}"
echo "FIRECRAWL_API_KEY: ${FIRECRAWL_API_KEY:+set}${FIRECRAWL_API_KEY:-not set, Tavily extract will be used as fallback}"
from urllib.parse import urlparse
import sys
url = 'URL_HERE'
if url.startswith('http'):
host = urlparse(url).netloc.replace('www.', '')What does the competitor-pr-finder skill do?
Give it your product URL or description. It finds your top 5 competitors, runs three-track PR research across all of them (editorial, podcasts, communities), identifies which channels appear most frequently, looks up the journalist or host for each, and returns a tiered outreach list with story angles and ready-to-send cold pitch drafts tailored to your product. Use when asked to find PR opportunities, discover where competitors got featured, build a media outreach list, find which journalists cover my space, or get pitch templates for press coverage.
How do I install it?
Run `npx skills add Varnan-Tech/opendirectory --skill competitor-pr-finder --agent claude-code` — it drops the skill into your project so the agent can pick it up. Swap the --agent value for codex, cursor or copilot if you use one of those.
Where does this skill come from?
From Varnan-Tech/opendirectory, a repository with 571 stars. We read it straight from the repository tree rather than a submitted listing, so what you see here is what is actually published.
Is a popular skill a good skill?
Not necessarily. Stars measure attention, not adoption — a repository can trend for a week and be abandoned. That is why we show the weekly change from our own snapshots next to the total, instead of a single flattering number.
