Competitive Monitor
You scan a curated list of competitor, peer, and inspiration sites and surface meaningful changes. Read-only. Insight-first, dump-last.
Brand-config requirements
paths.competitor_targets — path to a markdown file listing target sites (default: competitive-targets.md at repo root)
review.channel — for RED/AMBER alerts
owner.timezone
- (optional)
competitive.scan_frequency — defaults to daily
- (optional)
competitive.target_count — defaults to 5–10
If paths.competitor_targets doesn't exist, the skill creates a starter file with example entries and asks the owner to fill it in.
What you read
The competitor-target list. Format:
# Competitive targets
## Tier 1 — direct competitors
- {Brand name} — {URL} — {one-line why we track}
Pages: /, /services, /pricing, /blog
## Tier 2 — peers / inspiration
- {Brand name} — {URL} — {one-line why we track}
Pages: /, /work
## Tier 3 — adjacent / aspirational
- {Brand name} — {URL} — {one-line why we track}
Pages: /
5–10 entries works best. More than 15 and the daily noise overwhelms the signal.
If RSS feeds are exposed for any target (most blogs do), include those for richer diffs.
What you do
For each target site:
- WebFetch the configured pages (homepage + /services + /blog or whatever's listed).
- Compare against yesterday's snapshot at
reports/competitive/{YYYY-MM-DD-1}-snapshot.json.
- Flag changes:
- 🔴 RED: pricing change, new offer, new positioning headline, executive announcement, fundraise, partnership announcement
- 🟠 AMBER: new blog post, new case study, new hire, content cadence shift, new public-facing page
- 🟢 GREEN: no material change
Output rules
Hard rules
- Read-only. Never click, fill forms, or interact with target sites.
- Respect robots.txt. If a target's robots.txt disallows the path, skip and log.
- Rate-limit yourself. 1 request per second per domain max. Spread the scan across 5+ minutes if needed.
- No scraping logged-in / paid content. Public, unauthenticated pages only.
- Don't store images, videos, full HTML. First 4096 chars of normalized text per page.
- Don't quote anything more than 30 words from a target page. Summarize the rest.
When to update this SKILL.md
- The target list grows past 15 — split into multiple targeted scans.
- A target consistently produces false positives (dynamic headers, A/B tests) — refine the normalization step.
- The brand wants the scan to focus on a specific signal (e.g., only pricing changes) — narrow Step 3.
Examples
Example 1 — daily 07:00 run, 5 targets, 1 AMBER
Pulled 14 pages across 5 targets
Diffed against yesterday's snapshot
Findings: 1 AMBER (Target #3 published a new case study)
Saved snapshot + changes file
Pinged review channel with the AMBER summary
Example 2 — daily run, all GREEN
Pulled 14 pages, no material changes
Saved snapshot
Stayed silent — no spam
1---2name: competitive-monitor3description: Daily scan of curated competitor / peer / inspiration sites for new posts, pricing changes, positioning shifts, and hiring signals. Diffs each fetch against the previous snapshot and surfaces material changes via the review channel. Compounds intel without manual checking. Triggers on 'competitive scan', 'check competitor changes', 'monitor [domain]', or as a scheduled daily run.4license: MIT5---67# Competitive Monitor89You scan a curated list of competitor, peer, and inspiration sites and surface meaningful changes. Read-only. Insight-first, dump-last.1011---1213## Brand-config requirements1415- `paths.competitor_targets` — path to a markdown file listing target sites (default: `competitive-targets.md` at repo root)16- `review.channel` — for RED/AMBER alerts17- `owner.timezone`18- (optional) `competitive.scan_frequency` — defaults to daily19- (optional) `competitive.target_count` — defaults to 5–102021If `paths.competitor_targets` doesn't exist, the skill creates a starter file with example entries and asks the owner to fill it in.2223---2425## What you read2627The competitor-target list. Format:2829```markdown30# Competitive targets3132## Tier 1 — direct competitors33- {Brand name} — {URL} — {one-line why we track}34 Pages: /, /services, /pricing, /blog3536## Tier 2 — peers / inspiration37- {Brand name} — {URL} — {one-line why we track}38 Pages: /, /work3940## Tier 3 — adjacent / aspirational41- {Brand name} — {URL} — {one-line why we track}42 Pages: /43```44455–10 entries works best. More than 15 and the daily noise overwhelms the signal.4647If RSS feeds are exposed for any target (most blogs do), include those for richer diffs.4849---5051## What you do5253For each target site:54551. WebFetch the configured pages (homepage + /services + /blog or whatever's listed).562. Compare against yesterday's snapshot at `reports/competitive/{YYYY-MM-DD-1}-snapshot.json`.573. Flag changes:58 - **🔴 RED**: pricing change, new offer, new positioning headline, executive announcement, fundraise, partnership announcement59 - **🟠 AMBER**: new blog post, new case study, new hire, content cadence shift, new public-facing page60 - **🟢 GREEN**: no material change6162---6364## Output rules6566- Save raw snapshot to `reports/competitive/{YYYY-MM-DD}-snapshot.json` (URL → first 4096 chars of fetched HTML, normalized — strip whitespace, comments, dynamic timestamps).67- Save changes summary to `reports/competitive/{YYYY-MM-DD}-changes.md` with:68 - One section per target with detected changes69 - Quote the changed text (before/after)70 - One-line implication for the brand's positioning71- Send `{{REVIEW_CHANNEL}}` if RED/AMBER changes detected:72 ```73 *Competitive intel — {YYYY-MM-DD}*7475 🔴 *{Target name}* — new pricing on services page76 Was: "$15K minimum"77 Now: "$10K starting"78 → Implication: pricing pressure in our segment.7980 🟠 *{Target name}* — published a 4000-word post on "voice AI for consulting"81 → Implication: angle to consider differentiating against.82 ```83- If nothing material: silent. No spam on GREEN-only days.8485---8687## Hard rules8889- **Read-only.** Never click, fill forms, or interact with target sites.90- **Respect robots.txt.** If a target's robots.txt disallows the path, skip and log.91- **Rate-limit yourself.** 1 request per second per domain max. Spread the scan across 5+ minutes if needed.92- **No scraping logged-in / paid content.** Public, unauthenticated pages only.93- **Don't store images, videos, full HTML.** First 4096 chars of normalized text per page.94- **Don't quote anything more than 30 words from a target page.** Summarize the rest.9596---9798## When to update this SKILL.md99100- The target list grows past 15 — split into multiple targeted scans.101- A target consistently produces false positives (dynamic headers, A/B tests) — refine the normalization step.102- The brand wants the scan to focus on a specific signal (e.g., only pricing changes) — narrow Step 3.103104---105106## Examples107108### Example 1 — daily 07:00 run, 5 targets, 1 AMBER109110```111Pulled 14 pages across 5 targets112Diffed against yesterday's snapshot113Findings: 1 AMBER (Target #3 published a new case study)114Saved snapshot + changes file115Pinged review channel with the AMBER summary116```117118### Example 2 — daily run, all GREEN119120```121Pulled 14 pages, no material changes122Saved snapshot123Stayed silent — no spam124```