From market-intelligence
Build, enrich, verify, and activate structured competitive intelligence in Obsidian vaults. ALWAYS use for: researching companies or markets, building prospect/competitor/people notes, deep-diving a vertical, finding companies that need a product, tracking founders or investors, verifying social handles are real and active, building outreach lists or HTML contact trackers, mapping relationships to find warm intro paths. Triggers on "market landscape", "competitive analysis", "research companies", "find competitors", "deep dive into X space", "prospect research", "verify these handles", "check if these profiles are real", "build an outreach list", "who should I reach out to", "map my contacts", "find warm intros", "relationship graph", "add to my vault", "enrich my knowledge base". Any domain: SaaS, AI, fintech, biotech, etc.
How this skill is triggered — by the user, by Claude, or both
Slash command
/market-intelligence:market-intelligenceThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Build, enrich, verify, and activate structured competitive intelligence — stored in Obsidian vaults,
Build, enrich, verify, and activate structured competitive intelligence — stored in Obsidian vaults, exported as interactive HTML, or mapped as relationship graphs. This skill is opinionated about structure (consistent frontmatter, semantic tagging, scored entities, verified contacts) but adapts to any domain, product, or research context.
| Reference | Load when |
|---|---|
references/note-schemas.md | Before creating ANY note |
references/research-playbook.md | When researching a new entity type |
references/vault-structure.md | Creating structure, canvas, or bases |
references/social-verification.md | Running Verify mode or checking handles |
references/outreach-list.md | Building outreach lists or HTML artifacts |
Only load what's needed — don't read all five for a simple enrichment task.
Determine which mode the user needs, then jump straight in. Don't ask unnecessary questions — infer from context. Multiple modes can be combined (e.g., Enrich → Verify → Outreach in one session).
| Mode | When to use | Core action |
|---|---|---|
| Bootstrap | Starting from scratch, no vault exists | Create structure → research initial entities in parallel |
| Enrich | Vault exists, adding or deepening notes | Research → write notes → update index |
| Deep Dive | "Go deep on X vertical / space" | Spawn parallel research agents → synthesize |
| Verify | "Check these handles", "are these people real", suspicious/stale contacts | Navigate to profiles → flag wrong/inactive → find replacements |
| Outreach | "Build me an outreach list", "who should I contact", export contacts | Pull vault people → rank → generate HTML artifact |
| Graph | "Map my relationships", "find warm intros", "who connects to who" | Scan wikilinks → build adjacency map → identify paths |
| Search | "Find companies that need X", "who are the players in Y" | Research → filter → ranked shortlist |
| Maintain | Rebuild canvas, update bases, refresh index | Structural updates without new research |
Starting a new intelligence vault from zero.
Don't ask for things you can infer. If someone says "I'm building a credential API for AI agents", you already know the domain, scoring lens, and ICP shape.
Step 1 — Create vault structure
{vault-root}/
├── Market Landscape/
│ ├── Prospects/ # Target companies / potential customers
│ ├── Competitors/ # Competing or adjacent companies
│ ├── People/ # Founders, investors, key influencers
│ ├── Investors/ # VC firms and angels active in the space
│ ├── ICPs/ # Ideal customer profiles
│ └── Intel/ # Thematic research, maps, signals
├── _Index.md # Master index (auto-maintained)
└── landscape.canvas # Visual map (build after notes exist)
Step 2 — Write _Index.md Domain overview, market signals, entity counts, key findings. Keep scannable — this is the vault entry point.
Step 3 — Define ICPs
Create 2–4 ICP notes in ICPs/. ICPs define who the ideal buyers/users are and guide prospect scoring. See schema in references/note-schemas.md.
Step 4 — Parallel company research For each seed company (and 10–20 more found via web search), spawn parallel research subagents. See Parallelization section below. Pass the note schema to every agent.
Step 5 — Build canvas and bases
After notes exist, generate landscape.canvas using scripts/build_canvas.py and create the four standard .base database views (see references/vault-structure.md).
Adding to an existing vault.
Step 1 — Audit (quick) Read 3–5 existing notes to understand: which properties are in use, what's already covered, schema conventions established.
Step 2 — Research and write For each new entity:
references/research-playbook.md for that entity typeStep 3 — Update structural files
After adding 5+ entities: update _Index.md. Offer to rebuild landscape.canvas and .base files.
Intensive focused research on a specific vertical.
Step 1 — Confirm scope One question if needed: which exact vertical or sub-domain?
Step 2 — Spawn parallel research agents For a full deep dive, spawn 4–6 subagents simultaneously:
Each agent writes notes directly to the vault and returns a summary.
Step 3 — Synthesize
Write Intel/[Vertical Name] Deep Dive.md:
Purpose: Ensure every contact in a list is real, active, and correctly attributed before any outreach. This is critical — hallucinated or stale handles waste outreach effort and embarrass the sender.
Read references/social-verification.md before starting this mode.
Step 1 — Triage the list Scan the contact list and flag anyone that looks uncertain:
Step 2 — Verify via browser (Chrome MCP preferred) For each contact, navigate to the profile and read page text:
Navigate to: https://x.com/{handle} (or linkedin.com/in/{handle})
Check: displayed name, bio keywords, employer mention, follower count
Use mcp__Claude_in_Chrome__navigate + mcp__Claude_in_Chrome__get_page_text.
If Chrome MCP is unavailable, use Playwright (playwright navigate, playwright get_visible_text).
Step 3 — Classify each contact
| Status | Meaning | Action |
|---|---|---|
| ✅ Verified | Name + bio match, account active | Keep as-is |
| ⚠️ Low confidence | Name matches but bio unclear, few followers | Web search to confirm |
| ❌ Wrong person | Name on profile ≠ expected contact | Find correct handle |
| ❌ Inactive | 0–50 followers, no posts, placeholder bio | Replace or mark stub |
| ❌ Doesn't exist | 404 / "account doesn't exist" | Find real handle or remove |
Step 4 — Find replacements For any contact that failed:
"[Full Name]" "[Company]" Twitter OR "X.com"handle_verified: false, note the gapStep 5 — Evaluate replacement quality Before adding a replacement or replacing a wrong person entirely:
Step 6 — Update notes and report
twitter, linkedin, or relevant handle field in the notehandle_verified: true and handle_verified_date: YYYY-MM-DD> Previously listed as [wrong name]. Corrected on [date].Produce a verification summary:
Verified: X/Y contacts
Fixed handles: [list]
Replaced contacts: [list with reason]
Unable to verify: [list with what was tried]
Purpose: Turn vault intelligence into an actionable, prioritized contact list — optionally with an interactive HTML artifact for search, filter, and tracking.
Read references/outreach-list.md before building a list.
Step 1 — Define scope Clarify (from context or one question):
Step 2 — Pull and rank contacts
Scan People/ and Prospects/ notes. For each contact:
Step 3 — Verify before exporting Run Verify mode on the contact list before finalizing. A single wrong handle destroys credibility.
Step 4 — Generate output
For a simple list: ranked markdown table with name, company, handle, one-line angle.
For an interactive HTML artifact: use scripts/gen_outreach_html.py or build programmatically.
See references/outreach-list.md for the full HTML structure and schema.
The HTML artifact should include:
Step 5 — Craft outreach angles For each person, the outreach angle is the most important field — one specific reason this person will respond. Draw from:
Generic angles ("I'd love to connect!") will be ignored. Specific angles get replies.
Purpose: Map the relationship network across vault entities, identify clusters, and find warm introduction paths.
Step 1 — Scan wikilinks
Parse all notes for [[wikilinks]]. Build an adjacency list:
Person A → works at → Company X
Company X → funded by → Investor Y
Investor Y → known partner → Person B
Step 2 — Build the adjacency map
Dictionary: {entity: [(connected_entity, relationship_type)]}.
Step 3 — Find intro paths For a target contact, run BFS to find chains:
You → [shared connection] → [target]
Surface paths of length 2 (one hop) and length 3 (two hops). Longer paths are rarely actionable.
Step 4 — Identify clusters Group entities: companies with shared investors, founders with shared backgrounds, YC batch cohorts. These are natural outreach communities — know one, get warm intros to the rest.
Step 5 — Export
scripts/build_canvas.py with relationship edges)Intel/Relationship Map.md with the full adjacency listFind companies matching criteria without necessarily adding them to the vault.
Structural updates only.
scripts/build_canvas.py → write to landscape.canvasobsidian:obsidian-bases skill for .base files_Index.mdUse subagents when researching 5+ companies or multiple verticals. Spawn all together in one message — never sequentially.
You are researching [Company Name] for a market intelligence vault about [domain/product context].
Task: Write a complete Obsidian note for this company.
Output file: [vault-path]/Market Landscape/[Prospects or Competitors]/[Company Name].md
Note schema (copy frontmatter exactly, fill in values):
[paste relevant schema from references/note-schemas.md]
Scoring criteria:
- fit_score: maximum = can't operate without it | high = strong near-term need | medium = eventual need | low = tangential
- priority: critical = reach out this week | high = this month | medium = this quarter | low = watch
Research requirements:
1. Product description (1–2 sentences)
2. Customer profile and scale
3. Funding (total, last round, investors, date)
4. Founders (names, backgrounds, Twitter/X handles, LinkedIn)
5. Why [our product] matters to them (specific mechanism)
6. Recent strategic signal (launch, pivot, partnership, hiring — dated)
Set research_status: needs-update if you cannot find enough to fill the note.
You are verifying a batch of [platform] handles for a market intelligence vault.
For each contact below, navigate to their profile and confirm:
1. Profile exists at the URL (not 404)
2. Displayed name matches the expected contact
3. Bio/employer mentions expected company
4. Account has posts and credible follower count (>100)
If a handle fails, search: "[Full Name]" "[Company]" site:twitter.com
Also check the company team page for correct handles.
Contacts to verify:
[list: name | company | handle | profile URL]
Return a verification report: verified / fixed / replaced / unable-to-verify for each.
Write handle corrections directly to Person notes at [vault-path].
Always assign real scores — vague notes are useless.
| Score | Meaning |
|---|---|
maximum | Can't operate without your product. Core to their business model, active pain, no workaround. |
high | Strong need, plausible near-term buyer. Clear use case, credible budget. |
medium | Would benefit but workarounds exist. Not urgent. |
low | Tangential use case. Edge scenarios only. |
| Score | Timeline |
|---|---|
critical | This week — high fit + recent trigger signal |
high | This month — high fit, no immediate trigger |
medium | This quarter — medium fit or early stage |
low | Watch and wait |
| Tier | Meaning |
|---|---|
1 | Direct threat — same customer, same problem |
1.5 | Adjacent platform that could expand into your space |
2 | Same buyer, different problem — could bundle or compete |
3 | Legacy incumbent — established but slow-moving |
| Tier | Meaning |
|---|---|
A | Reach out this week — high fit + verified active + strong angle |
B | Reach out this month — good fit, verified, angle available |
C | Warm up first — follow/engage before cold outreach |
D | Watch — worth tracking, not yet ready to contact |
Every company note must answer:
Never publish a sparse note. If info is missing, set research_status: needs-update.
Investors/ notesCompetitors/ notes[[Name]] syntax — exact filename matchCheck what exists before creating new notes to avoid duplicates.
Use semantic tags for cross-vault filtering. Examples:
ai-agent, browser-automation, mcp-ecosystem, dev-infra, fintechyc-w25, recently-funded, recently-launched, hiring-fastopen-to-dm, founder-led, active-on-x, thought-leaderwarm-intro-available, investor-overlaphandle-verified, handle-unverified, contact-replacedscripts/build_canvas.py — hand-coding at scale breaksFor Verify mode and real-time research, use tools in this order:
Chrome MCP (mcp__Claude_in_Chrome__*) — fastest for quick profile checks
navigate → go to profile URLget_page_text — extract visible text (name/bio/followers)Playwright MCP (if installed) — more powerful for complex workflows
WebSearch / WebFetch — fallback for finding handles when profiles are wrong
"[Full Name]" "[Company]" site:twitter.com OR site:x.comNever trust a handle found only via web search without navigating to the actual profile.
| File | Load when |
|---|---|
references/note-schemas.md | Before creating ANY note |
references/research-playbook.md | When researching a new entity type |
references/vault-structure.md | Creating structure, canvas, or bases |
references/social-verification.md | Running Verify mode, checking handles |
references/outreach-list.md | Building outreach lists or HTML artifacts |
scripts/build_canvas.py | Rebuilding the visual canvas map |
scripts/gen_outreach_html.py | Generating interactive HTML outreach tools |
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub punitarani/skills --plugin market-intelligence