From competitor-research
Comprehensive competitor research pipeline that consolidates scattered sources into curated market briefs. Pulls existing NotebookLM sources, searches the web via Google AI Mode MCP, verifies accuracy, and produces structured per-section markdown files plus a combined brief for NotebookLM upload. Use this skill whenever the user wants to research a competitor, build a competitor profile, create a market brief, consolidate competitor sources, audit competitive intelligence, or mentions "competitor research", "market brief", "competitive analysis", "competitor profile", "competitive landscape", or "market intelligence". Also trigger when the user asks to compare their product to another company, research a specific company (e.g., "research Greenlight", "find out about Finch"), asks "who are our competitors", wants to analyze the competition, or asks to clean up or consolidate NotebookLM sources about a specific company. Includes a setup mode (/competitor-research setup) for first-run dependency configuration.
How this skill is triggered — by the user, by Claude, or both
Slash command
/competitor-research:competitor-researchThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Build comprehensive, verified competitor briefs from multiple source types — existing NotebookLM content,
Build comprehensive, verified competitor briefs from multiple source types — existing NotebookLM content, web research, and local project documents — then consolidate everything into structured markdown files organized by section.
The goal is dual-purpose output: briefs that serve investor pitch materials (market sizing, funding, threat assessment) AND product strategy decisions (feature gaps, user sentiment, positioning).
/competitor-research setup)Read references/setup.md and follow the 8-step setup wizard. Setup runs once per environment to
configure Node.js, VNC (headless), NotebookLM CLI, Google AI Mode MCP, notebook selection,
critique tool, and persistent config at ~/.config/competitor-research/config.json.
Setup supports named profiles for researching competitors across multiple projects or notebooks.
The skill accepts:
FinchFinch, Greenlight, BusyKid
Comma separation is required for multi-word names (e.g., Hello Fresh, Greenlight).
When multiple names are provided, the skill runs in parallel mode (see below).{project_path}/competitors/{competitor_name}/
├── 00-index.md # Table of contents with reading paths
├── 01-company-overview.md # Section 1
├── 02-funding-and-financials.md # Section 2
├── 03-product-and-features.md # Section 3
├── 04-pricing-and-monetization.md # Section 4
├── 05-user-base-and-traction.md # Section 5
├── 06-target-market-and-positioning.md # Section 6
├── 07-user-sentiment-and-reviews.md # Section 7
├── 08-strengths-and-weaknesses.md # Section 8
├── 09-threat-assessment.md # Section 9
├── 10-sources-and-data-quality.md # Section 10
├── {competitor_name}-full-brief.md # Combined file (all sections, for NotebookLM)
├── .status.json # Pipeline progress (for resume capability)
└── raw/ # Raw source texts (for audit trail)
├── notebooklm/ # Fulltexts pulled from NotebookLM
│ ├── {source_id_short}.md
│ └── ...
└── web/ # Google AI Mode MCP research results
├── search-{topic}.md
└── ...
Read references/section-definitions.md for the complete section template and all 10
section descriptions. That file is the single source of truth — use it when writing
sections (Step 6) and when constructing parallel agent prompts.
Execute these steps in order. Each step has a clear checkpoint before proceeding.
This step validates the environment, selects the profile, and prepares the output directories.
1a. Config check:
test -f ~/.config/competitor-research/config.json
If missing: inform the user and run /competitor-research setup automatically.
Do NOT proceed with research until setup completes.
If present: read the config and quick-validate:
notebooklm status — if auth expired, invoke /vnc-service:run and re-authmcp__google-ai-search__search_ai is in available tools — if missing, inform user to restart session1b. CAPTCHA pre-warming:
Run a test search before any research begins — this clears any pending CAPTCHA so that subsequent searches (both single-competitor and parallel agents) proceed without interruption:
mcp__google-ai-search__search_ai(query="test", headless=true)
If CAPTCHA triggers: invoke /vnc-service:run, retry with headless: false, user solves
in VNC, then verify headless works. The MCP browser is shared — one cleared session benefits
all subsequent searches.
1c. Profile selection:
Load the default profile from config. If multiple profiles exist, or if the user's current context doesn't match the default, ask:
Using profile: "chorestory" (notebook: ChoreStory Investor Research)
Use this profile, or switch? Available profiles: chorestory, [other...]
Or: create a new profile for this research
If no profile matches, create a new one inline (ask for notebook + path).
1d. Notebook verification:
Set NotebookLM context: notebooklm use {profile.notebook_id}
If the notebook no longer exists, ask user to pick a new one and update the profile.
1e. Project path verification:
Check if {profile.project_path} exists on disk. If not set or missing: ask the user for
the output base directory. If the active rawgentic project path differs from the profile,
ask: "Use {rawgentic_path} or {profile.project_path}?"
1f. Competitor parsing and confirmation:
Parse competitor names: split input by commas, trim whitespace. For each competitor:
{project_path}/competitors/{competitor_name}/For multiple competitors, present all at once for confirmation:
Competitors to research:
1. Finch (self-care pet app) — keywords: gamified wellness self-care
Output: ./competitors/finch/
2. Greenlight (kids debit card) — keywords: kids fintech debit card
Output: ./competitors/greenlight/
Confirm all, or modify any? (confirm / modify #)
1g. Resume detection:
For each competitor, check if {output_dir}/.status.json exists with partial completion:
Found partial research for {name} (completed through Step {N}).
Resume from Step {N+1}, or start fresh? (resume / fresh)
If "resume": skip completed steps, proceed from the next one.
If "fresh": delete .status.json and raw/ directory, start from Step 3.
1h. Create directory structure:
For each competitor: mkdir -p {output_dir}/raw/notebooklm {output_dir}/raw/web
1i. Determine execution mode:
Write initial .status.json: {"step": 1, "completed": true}
Checkpoint: Profile loaded, notebook context set, all competitors disambiguated with domain keywords, directories created, execution mode determined.
Before analyzing competitors, understand the user's own product so that Sections 3, 6, 8, and 9 produce strategic comparisons, not generic profiles.
1. Check config for cached project context:
If config.profiles[profile].project_context exists and is populated, load it and present:
Project context loaded from config:
Product: {product_name} — {one_liner}
Audience: {primary_user} (buyer: {buyer})
Stage: {stage}
Use this context, or refresh it? (use / refresh)
If "use": proceed to Step 3 with this context. If "refresh": continue to sub-step 2 below.
2. Search NotebookLM for project documents:
Run notebooklm source list --json and filter for sources matching patterns like:
executive_summary, executive-summary, overviewpitch_deck, pitch-deck, investor_briefproduct_spec, product-spec, prd, product_requirementsREADME, CLAUDE_*.md (AI context files)brainstorm, concept, vision3a. If project context found in NotebookLM:
3b. If NO project context found:
Present options:
No project context found. Competitor briefs are much more useful when I
understand your product. Would you like to:
1. Quick briefing (Recommended) — Answer 5-7 questions
2. Upload existing docs — Point me to local files
3. Skip — Sections 8-9 will be generic competitive analysis
Option 1 (Quick briefing): Ask 7 questions about the product (name, audience, problem,
differentiators, monetization, stage, category). Generate a Project Context Brief (300-500 words),
save to {project_path}/project-context.md, and upload to NotebookLM.
Option 2 (Upload docs): Ask for file paths. Read files, extract structured context, confirm.
Option 3 (Skip): Add caveats to Sections 8-9 headers and index.
4. Save project context to config:
Update config.profiles[profile].project_context with the extracted fields.
Write .status.json: {"step": 2, "completed": true}
Checkpoint: Project context loaded and confirmed (or skipped with caveats noted).
notebooklm source list --json to get all sourcesnotebooklm source fulltext {source_id} --jsonraw/notebooklm/{source_id_first8chars}.md with YAML headerWrite .status.json: {"step": 3, "completed": true}
Checkpoint: Fulltexts saved. Source IDs recorded. Section gap analysis complete.
Run targeted searches using the mcp__google-ai-search__search_ai MCP tool.
Use domain keywords from Step 1 to make searches competitor-specific.
Required searches (adapt competitor name + domain keywords):
"{competitor} {domain_keywords} company overview founding team funding {year}" → company-overview.md"{competitor} {domain_keywords} revenue users downloads metrics {year}" → traction-metrics.md"{competitor} {domain_keywords} pricing subscription model free vs paid {year}" → pricing.md"{competitor} {domain_keywords} reviews user sentiment Reddit complaints {year}" → user-sentiment.md"{competitor} {domain_keywords} competitors market position comparison {year}" → market-position.mdLinkedIn searches (rich source for team, hiring, culture, and growth signals):
6. "{competitor} site:linkedin.com/company employees team size headquarters" → linkedin-company.md
7. "{competitor} site:linkedin.com CEO founder CTO leadership executive" → linkedin-leadership.md
8. "{competitor} site:linkedin.com hiring jobs open positions engineering product" → linkedin-hiring.md
9. "{competitor} site:linkedin.com funding raised series investors announcement" → linkedin-funding.md
10. "{competitor} {domain_keywords} site:linkedin.com product launch update announcement" → linkedin-updates.md
LinkedIn data extraction guidance:
Gap-targeted searches (based on Step 3 section gap analysis): 11-13. Additional searches targeting specific sections that are data-thin
Save each result to raw/web/search-{topic}.md with YAML header (query, date, source).
CAPTCHA handling: If a search returns captchaRequired: true:
/vnc-service:run for connection infoheadless: falseheadless: trueWrite .status.json: {"step": 4, "completed": true}
Checkpoint: At least 10 web research files saved (5 general + 5 LinkedIn).
Read ALL raw sources (both NotebookLM and web) and:
Write .status.json: {"step": 5, "completed": true}
Checkpoint: User informed of wrong-company sources, gaps, and conflicts.
Read references/section-definitions.md for the section template and all 10 section definitions.
Write each section file following those definitions.
Write files 01 through 10, then:
00-index.md with executive summary, reading paths (investor track / product track),
table of contents, and key numbers at a glance{competitor_name}-full-brief.md concatenating all sections with --- dividersWrite .status.json: {"step": 6, "completed": true}
Run BEFORE deleting NotebookLM sources — if the critique finds fatal flaws, the original sources are still available.
Read critique_tool from config. Prefer the configured tool; fall back gracefully if
unavailable (e.g., BMAD path no longer exists, reflexion plugin was uninstalled). If falling
back, inform the user which tool was used and why the configured tool was unavailable.
Fallback cascade: configured tool → self-critique (always available).
If critique_tool = "bmad":
{bmad_path}/_config/agent-manifest.csv{bmad_path}/core/config.yaml{bmad_path}/core/skills/bmad-party-mode/workflow.mdIf critique_tool = "reflexion":
Invoke /reflexion:critique with the same evaluation topic as above.
If critique_tool = "self":
Re-read the full brief and evaluate against: factual accuracy, source quality, completeness, analytical rigor, actionability, bias check. Write a 5-10 bullet point critique and present to the user.
After critique: If significant issues found, offer to revise affected sections. Regenerate the combined file if revisions are made.
Write .status.json: {"step": 7, "completed": true}
Checkpoint: Critique completed. Report which tool was used:
Critique completed using: {actual_tool_used} (configured: {config_value})
Upload BEFORE deleting old sources — this eliminates the data loss window. If upload fails, the original sources are still intact.
notebooklm source add {path_to_full_brief}notebooklm source wait {source_id}notebooklm source listIf upload fails: inform user the brief is available locally at {path} and can be manually
uploaded later. Do NOT proceed to deletion.
Write .status.json: {"step": 8, "completed": true}
Requires user confirmation. Only proceed after Step 8 (upload) is verified.
notebooklm source delete {source_id}/vnc-service:run and retry failed deletions.Write .status.json: {"step": 9, "completed": true}
Report:
Uploaded: {competitor_name}-full-brief.md
Status: ready
NotebookLM sources: was {old_count}, now {new_count} (freed {delta} slots)
When multiple competitor names are provided, the skill uses a fan-out / fan-in pattern:
Read references/agent-prompt-template.md for the full template. Also read
references/section-definitions.md and include the section definitions inline in each
agent prompt (agents cannot read reference files — they need self-contained prompts).
Spawn all competitor agents in a single message using multiple Agent tool calls. The Agent tool runs them concurrently, but the orchestrator blocks until ALL agents complete (there is no incremental notification — this is how Claude Code's Agent tool works).
Each agent runs Steps 3-6 (pull sources, web research, analyze, write sections).
Important constraints:
{output_dir} — no file conflictsAfter ALL agents complete, process each competitor sequentially through Steps 7-9:
Check .status.json for each competitor:
completed: true: proceed to critiquecompleted: false or file missing: agent failed. Offer to retry or complete manually.captcha_blocked: true: resolve CAPTCHA interactively (invoke /vnc-service:run),
then run missing searches from the main session and re-analyze/rewrite affected sections.Step 7: Critique — using the configured critique tool.
Step 8: Upload — upload each combined brief to NotebookLM
Step 9: Clean up — delete old sources (with user confirmation, can batch: "Delete all old sources for Finch, Greenlight, and BusyKid? (y/n)")
If an agent fails or produces partial output:
.status.json to determine which step failed.status.json): inform user, offer manual completion.Competitor Research Progress:
● Finch — Steps 3-6 running (agents active, waiting for all to complete)
● Greenlight — Steps 3-6 running
● BusyKid — Steps 3-6 running
---
All agents complete. Processing Steps 7-9:
✓ Finch — Steps 7-9 done
● Greenlight — Step 7 (critique) in progress
○ BusyKid — Pending
If the user prefers sequential processing (or if parallel agents are not available), fall back to processing one competitor at a time through the full 9-step pipeline. Order by NotebookLM source count (heaviest first to free slots early).
| Error | Response |
|---|---|
| NotebookLM auth expired | Invoke /vnc-service:run, then DISPLAY=:99 notebooklm login |
| Google AI Mode CAPTCHA | Invoke /vnc-service:run, retry with headless: false |
| MCP not available | Inform user to restart session (MCP initializes at session start) |
| Source fulltext fails | Log source ID, skip, note in Section 10 as "content unavailable" |
| Ambiguous competitor name | Always ask, never guess |
| Thin data | Write honestly. Flag: "Section {N} is thin — only {X} words" |
| Chrome singleton lock | Clear /path/to/chrome_profile/Singleton* and retry |
| Config missing | Auto-run /competitor-research setup |
npx claudepluginhub 3d-stories/competitor-research --plugin competitor-researchSearches live web via Nimble APIs to monitor competitors and produce structured intelligence briefings with dedup against previous findings.
Spawns parallel agent researchers for competitor deep-dives via web search, synthesizing positioning strategies, battle cards, and competitive intelligence.
Runs end-to-end competitor research by scraping public surfaces (site, blog, pricing, social, search rank, mentions, demand) via Firecrawl, HyperSEO, and Apify scrapers, diffs against prior runs, and synthesizes a brief. Use for battle cards, comparison pages, weekly digests, or answering 'what is [competitor] doing?'.