
The Competitor Intel skill, open-sourced
By Mark Cohen
After a recent post where I mentioned an agent that watches our competitors every week, I had many people reaching out, interested in the agent itself. People asked if I could share it. The answer at the time was "not so easily", because what I'd built was wired into my own setup (using Claude and Hermes), with specific product names baked into the prompts and a competitor list that only made sense to me. To make it shareable, I rebuilt it as something anyone can install into Claude and point at their own market, on whatever schedule suits them. It's MIT licensed and on GitHub at github.com/markc0909/competitor-intel-skill.
What it does
The original ran daily, but this is designed to run weekly. It could be changed back to daily, easily.
Claude reads a plain Markdown file that lists your products and the competitors for each one. It searches for anything material that happened since the last run, throws away the noise, and hands back a short report where every item cites its source and names the product of yours it affects. If the only explanation of why something matters is "well, they're a competitor", it doesn't make the grade. A quiet week produces a one-line note saying nothing material happened, because - as I've mentioned before - padding a report to prove the job ran is how people learn to stop reading it.
The design still splits the work in two.
Claude does the parts that need judgement: reading sources, deciding whether multiple articles about one topic are a single event, classifying it, and writing what it means for you.
A small Python script does the parts that stay deterministic: planning the searches, fingerprinting each event so it's never reported twice, validating the report and remembering where each competitor's last search ended. If a search fails for one competitor, that competitor's window stays open and next week picks up the gap, so nothing silently falls through.
Watching the right movers and shakers
It's futile to try watch every activity across the market. We want to watch the two or three main movers that can shake our positions. Direct rivals for each product get product-specific searches. Standing "group watches" cover the tectonic shifts: a merger, a private equity roll-up, a portal selling off its software arm... Anything that can move several of your products in one go. Listicles, review sites and SEO comparison pages are generally more noise than signal. They're counted so you can see the volume, but they never reach the report.
The tactician's notes from yesterday's run are also only a starting point, because the course moves. That turned out to be the most useful thing the skill did on its first run (course-correct through self-analysis).
The first run corrected my own map
In August I compiled a detailed competitor map for my portfolio, tracking 18 products - each with its own rivals, how they compete and the search terms to watch. When I ported it into the new skill and ran it live, the plan came to 74 product-competitor matchups and 167 searches. The report itself was short, with one valuable output being a list of corrections to the map. Two brands I had filed under one vendor belong to a different company that actively markets against it. A rival I had marked as adjacent, with a note to watch for a move into CRM, had made that move a year earlier. And one "competitor" on my list turned out to be a product we acquired in 2023.
These errors may well have been missed in a slide review, because nobody questions a map once it looks finished and the sheer volume of data makes it easy to miss a small detail. The skill never edits your products or competitors on its own. It writes suggested changes into the file, with the evidence, and you decide.
How to customise it after you install it
1. Install. In Claude Code, run:
/plugin marketplace add markc0909/competitor-intel-skill
/plugin install competitor-intel@competitor-intelOr ask Claude to clone the repo, read install.sh and run it. The repo includes a testing guide with an offline smoke test that takes about a minute.
2. Describe your market, or hand over the map you already have. Say "set up a competitor watch for my company" and describe your products and main rivals in a sentence or two. If you already keep a competitor map in a document or spreadsheet, give Claude that instead: product sections become products, competitor rows become matchups, ownership notes become parent companies and merger notes become group watches. Claude drafts the watchlist at ~/.competitor-intel/<your-watch>/watchlist.md, shows you the products, competitors and sample searches, and asks you to confirm before anything runs.
3. Understand the watchlist, section by section. It's ordinary Markdown, so anyone can read it and you can diff it over time.
Our Products: One ### heading per product, with a one-line description. Set priority: high or low to steer what gets cut on a busy week. Set lifecycle: sunsetting on a product you're retiring and the skill treats competitor migration offers aimed at its customers as top-tier alerts, because that is a live churn window. List your own sibling products under siblings so a rival's search never reports them as competition.
Matchups: Under each product, one #### vs <Competitor> block per real rival. type is direct, adjacent or internal. how is one line on how they actually compete with that product, which is the lens Claude uses to write "why it matters". For adjacent rivals, watch_for names the move that would make them direct. Keywords live on the matchup, so the same competitor gets different searches per product: "Rival migration" under the product you're sunsetting, "Rival New Zealand" under your NZ product.
Competitors: Facts about a company that hold everywhere: its domain, its parent (news about the owner flows to every product its brands touch) and ambiguous: yes with a verify note when the name is a common word or collides with another company.
Group Watches: Cross-product themes with the products they affect and their own search terms. Anything found here lands in a Cross-portfolio section at the top of the report.
Market Watches: Category-level searches for new entrants you haven't named yet.
Noise Terms and Global Exclusions: This is the one people get wrong. Put listicle phrasing like "top 10" under Noise Terms, and it's negated in every search. Put your own brand under Global Exclusions, which are checked after the search rather than negated in it. Negating your own name in a search hides exactly the stories where a competitor wins one of your customers.
Settings: Cadence, how far back the first run looks, the cap on items per report, whether the report groups by product or by tier, and where results go (deliver_to can be local files, an email address, a Slack or Teams channel, or a Notion page). Listing a destination there is your standing permission for scheduled runs to send to it, and nowhere else. I used a teams web hook to post cards into the channel.
A matchup looks like this:
### Acme Ledger
- status: active
- priority: high
#### vs Rival Books
- type: direct
- how: Default choice for mid-market firms leaving desktop accounting.
- keywords: "Rival Books" mid-market, "Rival Books" AI4. Change it by asking. You rarely need to open the file. You can prompt, for example: "Add Keyhook as a competitor to Palace." "Pause the legacy product." "X just acquired Y, track it." Claude makes the smallest edit that does the job and checks that the file still validates. Each change also gets a line in the change log, so six months from now you can see why something is being watched.
5. Review the suggestions. Each run can propose new competitors, renamed brands or keywords that would have caught something it missed. They sit in a Suggestions section and nothing there is searched until you accept it. Say "review the watchlist suggestions" and Claude walks you through them, verifying the shaky ones first.
6. Schedule it. In the Claude desktop app, say "schedule the competitor watch every Monday at 7am". The skill also documents running it from cron with claude -p, or as a cloud routine with the watch folder kept in a git repo. Every run attaches the HTML report to its response, quiet weeks included, and keeps a copy of each run under runs/ so the archive builds itself.
A competitor map is out of date the day you finish it. Mine was wrong in three places within two months, and I'd built it myself from careful research. Running this every week means the map gets corrected by evidence as it arrives, rather than by whoever last found time to update a slide. This competitor map is obviously also useful as a date source for other contexts.
If you install it, tell me what you changed. The best improvements come from people asking for things I hadn't thought of.