/competitor-monitor
Monitor competitor websites for changes. Visit a list of URLs, extract pricing, features, positioning, and key content, compare against previous snapshots stored locally, and generate a change report summarizing what's different. Use when the user says "check competitors", "what
$ npx -y skills add hanzili/hanzi-browse --skill competitor-monitor --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/competitor-monitor
Context preview
The summary Claude sees to decide when to auto-load this skill.
Monitor competitor websites for changes. Visit a list of URLs, extract pricing, features, positioning, and key content, compare against previous snapshots stored locally, and generate a change report summarizing what's different. Use when the user says "check competitors", "what
SKILL.md
competitor-monitor.SKILL.mdname: competitor-monitor
description: Monitor competitor websites for changes. Visit a list of URLs, extract pricing, features, positioning, and key content, compare against previous snapshots stored locally, and generate a change report summarizing what's different. Use when the user says "check competitors", "what changed on their site", "monitor these URLs", or wants periodic competitive intelligence. Requires the hanzi browser automation MCP server and Chrome extension.
category: marketing
Competitor Monitor
You monitor competitor websites and report what changed. You visit each URL, extract the important content (pricing, features, positioning, messaging), compare it against the last saved snapshot, and produce a clear change report.
Tool Selection Rule
- **Prefer existing tools first**: If a page is public and simple, try `WebFetch` or `curl` before opening a browser. Use Hanzi only when the page requires JavaScript rendering, authentication, or interactive elements (tabs, accordions, lazy-loaded sections).
- **Use filesystem tools** to read/write snapshots — never store snapshots in the browser.
- **If a site blocks or shows a CAPTCHA**, stop that URL and move to the next. Report the failure.
Before Starting — Preflight Check
Try calling `browser_status` to verify the browser extension is reachable. If the tool doesn't exist or returns an error:
> **Hanzi isn't set up yet.** This skill needs the hanzi browser extension running in Chrome. > > 1. Install from the Chrome Web Store: https://chromewebstore.google.com/detail/hanzi-browse/iklpkemlmbhemkiojndpbhoakgikpmcd > 2. The extension will walk you through setup (~1 minute) > 3. Then come back and run this again
---
What You Need From the User
1. **URLs** — list of competitor pages to monitor (pricing pages, feature pages, landing pages, etc.) 2. **Focus areas** (optional) — what to pay attention to: pricing, features, positioning, team size, integrations, messaging, or "everything" 3. **Label** (optional) — a name for this monitoring set (e.g., "competitor-pricing", "market-landscape"). Defaults to "default".
Optional:
- Specific sections or elements to watch (e.g., "only the pricing table", "the hero section tagline")
- Whether to take screenshots for visual comparison
- Authentication details if any pages require login
---
Phase 1: Prepare the Monitoring Run
1a. Load Previous Snapshots
Snapshots are stored in `~/.hanzi-browse/competitor-monitor/{label}/`. Each URL gets a file named by its sanitized hostname + path.
mkdir -p ~/.hanzi-browse/competitor-monitor/{label}
ls ~/.hanzi-browse/competitor-monitor/{label}/ 2>/dev/null || echo "NO_PREVIOUS_SNAPSHOTS"For each URL, check if a previous snapshot exists:
cat ~/.hanzi-browse/competitor-monitor/{label}/{sanitized_filename}.json 2>/dev/null || echo "NO_SNAPSHOT"If no previous snapshots exist, this is a **baseline run** — you'll capture the initial state without generating a diff.
1b. Plan the Extraction
For each URL, determine what to extract based on the page type and user's focus areas:
| Page Type | What to Extract | |-----------|----------------| | **Pricing page** | Plan names, prices, billing periods, feature lists per tier, CTAs, free tier details, enterprise contact options | | **Features page** | Feature names, descriptions, categories, "new" or "coming soon" badges, comparison tables | | **Landing/home page** | Hero headline, subheadline, value propositions, social proof (logos, testimonials, stats), CTAs | | **About/team page** | Team size, key hires, office locations, funding mentions | | **Blog/changelog** | Latest 3-5 post titles, dates, and summaries | | **Integrations page** | List of integrations, categories, "new" badges | | **Docs/API page** | Navigation structure, new sections, deprecation notices |
Present the plan: "I'll visit these N URLs and extract [focus areas]. Previous snapshots: [found/not found]. Ready to proceed?"
**Wait for user confirmation before visiting any URLs.**
---
Phase 2: Visit and Extract (browser via Hanzi)
Visit each URL using `browser_start`. Run up to 3 URLs **in parallel** — each gets its own browser window.
For each URL:
browser_start({
task: "Visit this page and extract all [focus areas]. Read the full page content including any sections behind tabs, accordions, or 'show more' buttons. Return structured data with: page_title, extraction_date, and each content section with its heading and text.",
url: "{competitor_url}",
context: "Focus areas: {focus_areas}. Extract exact text — do not paraphrase. Include prices with currency symbols. Expand any collapsed sections."
})After `browser_start` returns: 1. Parse the result to extract structured content 2. If the user requested screenshots, call `browser_screenshot` for each page 3. Call `browser_stop` with `remove: true` to clean up
Extraction Format
Structure the extracted data consistently:
{
"url": "https://competitor.com/pricing",
"extracted_at": "2026-04-02T10:30:00Z",
"page_title": "Pricing - Competitor",
"sections": [
{
"name": "Plans",
"content": [
{
"plan": "Starter",
"price": "$9/mo",
"billing": "billed annually",
"features": ["Feature A", "Feature B", "5 users"]
}
]
},
{
"name": "Hero",
"headline": "The fastest way to do X",
"subheadline": "Used by 10,000+ teams"
}
]
}Error Handling
- **Page blocked / CAPTCHA**: Skip, note in report, move to next URL
- **Page not found (404)**: Record as "page removed" — this itself is a significant change
- **Timeout**: Call `browser_screenshot` to capture current state, then `browser_stop`. Retry once. If it fails again, skip.
- **Login required**: Stop and ask the user for credentials. Pass via `context` field, never in `task`.
---
Phase 3: Compare Against Previous Snapshots (no browser)
For ea
Read more
name: competitor-monitor description: Monitor competitor websites for changes. Visit a list of URLs, extract pricing, features, positioning, and key content, compare against previous snapshots stored locally, and generate a change report summarizing what's different. Use when the user says "check competitors", "what changed on their site", "monitor these URLs", or wants periodic competitive intelligence. Requires the hanzi browser automation MCP server and Chrome extension. category: marketing
Competitor Monitor
You monitor competitor websites and report what changed. You visit each URL, extract the important content (pricing, features, positioning, messaging), compare it against the last saved snapshot, and produce a clear change report.
Tool Selection Rule
- **Prefer existing tools first**: If a page is public and simple, try `WebFetch` or `curl` before opening a browser. Use Hanzi only when the page requires JavaScript rendering, authentication, or interactive elements (tabs, accordions, lazy-loaded sections).
- **Use filesystem tools** to read/write snapshots — never store snapshots in the browser.
- **If a site blocks or shows a CAPTCHA**, stop that URL and move to the next. Report the failure.
Before Starting — Preflight Check
Try calling `browser_status` to verify the browser extension is reachable. If the tool doesn't exist or returns an error:
> **Hanzi isn't set up yet.** This skill needs the hanzi browser extension running in Chrome. > > 1. Install from the Chrome Web Store: https://chromewebstore.google.com/detail/hanzi-browse/iklpkemlmbhemkiojndpbhoakgikpmcd > 2. The extension will walk you through setup (~1 minute) > 3. Then come back and run this again
---
What You Need From the User
1. **URLs** — list of competitor pages to monitor (pricing pages, feature pages, landing pages, etc.) 2. **Focus areas** (optional) — what to pay attention to: pricing, features, positioning, team size, integrations, messaging, or "everything" 3. **Label** (optional) — a name for this monitoring set (e.g., "competitor-pricing", "market-landscape"). Defaults to "default".
Optional:
- Specific sections or elements to watch (e.g., "only the pricing table", "the hero section tagline")
- Whether to take screenshots for visual comparison
- Authentication details if any pages require login
---
Phase 1: Prepare the Monitoring Run
1a. Load Previous Snapshots
Snapshots are stored in `~/.hanzi-browse/competitor-monitor/{label}/`. Each URL gets a file named by its sanitized hostname + path.
mkdir -p ~/.hanzi-browse/competitor-monitor/{label}
ls ~/.hanzi-browse/competitor-monitor/{label}/ 2>/dev/null || echo "NO_PREVIOUS_SNAPSHOTS"For each URL, check if a previous snapshot exists:
cat ~/.hanzi-browse/competitor-monitor/{label}/{sanitized_filename}.json 2>/dev/null || echo "NO_SNAPSHOT"If no previous snapshots exist, this is a **baseline run** — you'll capture the initial state without generating a diff.
1b. Plan the Extraction
For each URL, determine what to extract based on the page type and user's focus areas:
| Page Type | What to Extract | |-----------|----------------| | **Pricing page** | Plan names, prices, billing periods, feature lists per tier, CTAs, free tier details, enterprise contact options | | **Features page** | Feature names, descriptions, categories, "new" or "coming soon" badges, comparison tables | | **Landing/home page** | Hero headline, subheadline, value propositions, social proof (logos, testimonials, stats), CTAs | | **About/team page** | Team size, key hires, office locations, funding mentions | | **Blog/changelog** | Latest 3-5 post titles, dates, and summaries | | **Integrations page** | List of integrations, categories, "new" badges | | **Docs/API page** | Navigation structure, new sections, deprecation notices |
Present the plan: "I'll visit these N URLs and extract [focus areas]. Previous snapshots: [found/not found]. Ready to proceed?"
**Wait for user confirmation before visiting any URLs.**
---
Phase 2: Visit and Extract (browser via Hanzi)
Visit each URL using `browser_start`. Run up to 3 URLs **in parallel** — each gets its own browser window.
For each URL:
browser_start({
task: "Visit this page and extract all [focus areas]. Read the full page content including any sections behind tabs, accordions, or 'show more' buttons. Return structured data with: page_title, extraction_date, and each content section with its heading and text.",
url: "{competitor_url}",
context: "Focus areas: {focus_areas}. Extract exact text — do not paraphrase. Include prices with currency symbols. Expand any collapsed sections."
})After `browser_start` returns: 1. Parse the result to extract structured content 2. If the user requested screenshots, call `browser_screenshot` for each page 3. Call `browser_stop` with `remove: true` to clean up
Extraction Format
Structure the extracted data consistently:
{
"url": "https://competitor.com/pricing",
"extracted_at": "2026-04-02T10:30:00Z",
"page_title": "Pricing - Competitor",
"sections": [
{
"name": "Plans",
"content": [
{
"plan": "Starter",
"price": "$9/mo",
"billing": "billed annually",
"features": ["Feature A", "Feature B", "5 users"]
}
]
},
{
"name": "Hero",
"headline": "The fastest way to do X",
"subheadline": "Used by 10,000+ teams"
}
]
}Error Handling
- **Page blocked / CAPTCHA**: Skip, note in report, move to next URL
- **Page not found (404)**: Record as "page removed" — this itself is a significant change
- **Timeout**: Call `browser_screenshot` to capture current state, then `browser_stop`. Retry once. If it fails again, skip.
- **Login required**: Stop and ask the user for credentials. Pass via `context` field, never in `task`.
---
Phase 3: Compare Against Previous Snapshots (no browser)
For ea
The context layer for browsing agents. Your browsing agent keeps failing on real sites — X uses Draft.js, LinkedIn hides the connect button, Gmail needs keyboard shortcuts.
Repo: hanzili/hanzi-browse
Other skills on hanzi-browse.
- /a11y-auditor
Audit web pages for accessibility issues in a real browser. Checks contrast, font sizes, focus indicators, keyboard navigation, ARIA labels, and semantic HTML against WCAG 2.1 AA. Reports findings with screenshots and specific remediation steps. Requires the hanzi browser
Open skill - /apartment-finder
Search for apartments across multiple real estate platforms, compare listings side by side, and help submit inquiries or applications. Use when the user wants to find a place to rent — searching Zillow, Apartments.com, Craigslist, and similar sites with their real signed-in
Open skill - /competitor-researcher
Research SaaS and AI-tool competitors in a real browser. Visit competitor sites, pricing pages, feature pages, and review platforms to extract pricing, features, positioning, and customer sentiment, then return a structured comparison report. Use when the user wants competitor
Open skill - /data-extractor
Extract structured data from websites into CSV or JSON. Use when the user wants to scrape a list, table, directory, or repeated elements from one or more pages — especially pages that require login, handle CAPTCHAs, or load content dynamically. Examples: "pull all company names
Open skill - /e2e-tester
Test a web app like a QA person — open it in a real browser, click through flows, and report what's broken with screenshots and code references. Works on localhost. Use when the user wants to test their app, verify a flow works, check for visual bugs, or validate changes before
Open skill - /hanzi-browse
Delegates a browsing task to a sub-agent running in the USER'S OWN Chrome — the browser they have open right now, already signed into everything. Give it a task in natural language ("check my LinkedIn DMs", "post this reply on X", "test signup on localhost:3000") and watch the
Open skill

