Web Monitor

Monitor web pages for changes, price drops, stock availability, and custom conditions. Use when a user asks to watch/track/monitor a URL, get notified about...

MIT-0 · Free to use, modify, and redistribute. No attribution required.
4 · 1.2k · 11 current installs · 12 all-time installs
MIT-0
Security Scan
VirusTotalVirusTotal
Benign
View report →
OpenClawOpenClaw
Suspicious
medium confidence
Purpose & Capability
Name/description align with provided files and requirements. Requiring python3 and curl is appropriate for a CLI web monitoring tool. Optional Playwright/cloudscraper support is reasonable for JavaScript/Cloudflare-protected sites. Data stored under ~/.web-monitor is coherent with the stated behavior.
Instruction Scope
SKILL.md instructs the agent to run the included CLI (quickstart, watch, check, etc.) and to create/read data in ~/.web-monitor; that is within scope. However, the skill is explicitly designed to fetch arbitrary URLs and send webhook POSTs to supplied endpoints — this means the agent (or user-provided configs) can cause network requests to any host (including internal addresses) and forward scraped content externally. That capability is expected for a monitor but is a high-impact behavior the user should be aware of.
Install Mechanism
No install spec (instruction-only install) — the package contains a Python script run directly, which is low-risk compared to arbitrary downloads. The included code file means behavior is implemented in-bundle; there is no remote install URL to review.
Credentials
The skill declares no required environment credentials; it optionally respects WEB_MONITOR_DIR and NO_COLOR which are reasonable. There are no unexpected secret/env requests. Webhook targets and other endpoints are provided by the user/config and are not requested as hidden credentials.
Persistence & Privilege
always:false and normal autonomous invocation. The skill stores persistent data in the user's home directory (~/.web-monitor) and can create snapshots, diffs, and screenshots. This is proportionate to a monitoring tool, but persistent local storage increases the blast radius if local files contain sensitive content or if monitored content is forwarded via webhooks.
What to consider before installing
This skill appears to implement a local web-monitoring CLI and is largely coherent with its description, but review the following before installing: - Inspect fetch/post code paths: the script uses subprocess + curl and sends webhook POSTs. Confirm the fetch_url implementation safely constructs subprocess arguments (uses argument lists and shell=False) to avoid shell/command injection if attacker-controlled URLs or labels are used. - Be cautious with webhooks: any monitor that finds changes can POST content to webhook URLs you configure. Do not add webhook endpoints you do not control or that are public/unknown — they can be used to exfiltrate scraped page contents. - Avoid monitoring sensitive internal endpoints (http://localhost, 169.254.x.x, internal IPs) unless you trust the environment; the agent will make outbound requests to URLs you provide and could expose internal data if forwarded. - Run the tool in an isolated session/container initially (the cron example suggests sessionTarget 'isolated') and run quickstart to see which fetch engines are available before enabling browser automation (Playwright) or cloudscraper. - If you need higher assurance, request the full fetch_url and webhook implementation (the truncated file prevents full review). Check for safe subprocess usage, URL validation, and explicit user consent before sending any snapshot externally. Given code is included and parts are truncated, these unresolved implementation details justify a 'suspicious' rating with medium confidence; providing the full monitor.py (complete) or confirming safe subprocess usage would raise confidence toward benign.

Like a lobster shell, security has layers — review code before you run it.

Current versionv3.5.0
Download zip
latestvk97f2xbtkab02fwbmhak78tj3s816s80

License

MIT-0
Free to use, modify, and redistribute. No attribution required.

Runtime requirements

👁️ Clawdis
Binspython3, curl

SKILL.md

Web Monitor Pro

Watch any web page. Know when it changes.

Quick Start

python3 scripts/monitor.py quickstart                        # shows suggestions + engine status
python3 scripts/monitor.py watch "https://example.com/product"
python3 scripts/monitor.py check

First Run

Use quickstart on first run. It:

  1. Creates the data directory
  2. Checks which fetch engines are available (curl, cloudscraper, playwright)
  3. Returns suggestions for popular monitoring scenarios (price drops, restocks, page changes, sales)
  4. Lists available templates
  5. Shows tips for missing engines

The agent can use this info to ask the user what they want to monitor and set it up for them.

What It Does

  • Monitors web pages for content changes, price drops, and restocks
  • Smart change summaries ("Price dropped from $389 to $331, 15% off")
  • Visual side-by-side diffs showing exactly what changed
  • Price history tracking with trends and sparklines
  • Price comparison across multiple stores
  • Templates for common setups (price drop, restock, sale)
  • JS rendering via Playwright for dynamic sites
  • Webhooks to Slack, Discord, or any endpoint
  • Groups, notes, snapshots, exports
  • No API keys. Data in ~/.web-monitor/. Uses curl by default.

Smart Watch

The easiest way to start. Point it at a URL and it figures out the rest.

python3 scripts/monitor.py watch "https://example.com/product"

It detects whether it's a product page (sets up price monitoring), a stock page (watches availability), or a regular page (tracks content). No flags needed.

Add options if you want more control:

python3 scripts/monitor.py watch "https://example.com" --group wishlist
python3 scripts/monitor.py watch "https://example.com" --browser --webhook "https://hooks.slack.com/..."

Adding Monitors

When you want full control, use add:

python3 scripts/monitor.py add "https://example.com/product" \
  --label "Cool Gadget" \
  --condition "price below 500" \
  --interval 360 \
  --group "wishlist" \
  --priority high \
  --target 3000 \
  --browser \
  --webhook "https://hooks.slack.com/..."

All options (work with both add and watch):

  • --label/-l name for the monitor
  • --selector/-s CSS selector to focus on (#price, .stock-status)
  • --condition/-c when to alert (see Condition Syntax below)
  • --interval/-i check interval in minutes (default: 360)
  • --group/-g category name ("wishlist", "work")
  • --priority/-p high, medium, or low (default: medium)
  • --target/-t price target number
  • --browser/-b use Playwright for JS-rendered pages
  • --webhook/-w webhook URL, repeatable for multiple endpoints

Checking Monitors

python3 scripts/monitor.py check                # check all
python3 scripts/monitor.py check --id 3          # check one
python3 scripts/monitor.py check --verbose       # include content preview

Returns status (changed/unchanged), condition info, price data, and a human-readable change summary. Examples of what summaries look like:

  • "Price dropped from $389 to $331 (15% off). Lowest price in 30 days."
  • "Back in stock! Was out of stock for 3 days."
  • "New content: 'Breaking news: AI model achieves...'"

When changes are detected, an HTML diff is auto-generated. The path appears in the diff_path field.

Dashboard

Everything at a glance.

python3 scripts/monitor.py dashboard
python3 scripts/monitor.py dashboard --whatsapp

Shows status icons, last check time, days monitored, current prices, target progress, and browser/webhook config. Groups monitors by category.

Price Trends

python3 scripts/monitor.py trend 3
python3 scripts/monitor.py trend 3 --days 30

Shows direction (rising/dropping/stable), min/max/avg with dates, target progress, and a sparkline.

Price Comparison

Compare prices across stores in a group:

python3 scripts/monitor.py compare mygroup
python3 scripts/monitor.py compare --all

Shows cheapest to most expensive, price history, and the best deal as a percentage below average.

Add a competitor to an existing monitor:

python3 scripts/monitor.py add-competitor 3 "https://competitor.com/same-product"

Creates a new monitor in the same group with the same condition.

Templates

Pre-built setups for common patterns. Skip the manual config.

python3 scripts/monitor.py template list
python3 scripts/monitor.py template use price-drop "https://example.com/product"
python3 scripts/monitor.py template use restock "https://example.com/product"
python3 scripts/monitor.py template use sale "https://example.com/deals"

Available templates:

  • price-drop watches for price decreases, snapshots current price as baseline
  • restock looks for "in stock", "available", "add to cart"
  • content-update tracks page changes with smart diff
  • sale watches for "sale", "discount", "% off"
  • new-release watches for new items or versions

Each one pre-configures the condition, interval, and priority.

Managing Monitors

python3 scripts/monitor.py list                    # all monitors
python3 scripts/monitor.py list --group wishlist   # filter by group
python3 scripts/monitor.py pause 3                 # skip during checks
python3 scripts/monitor.py resume 3                # re-enable
python3 scripts/monitor.py remove 3                # delete

Notes and Snapshots

Attach notes to any monitor:

python3 scripts/monitor.py note 3 "waiting for Black Friday"
python3 scripts/monitor.py notes 3

Take a manual snapshot:

python3 scripts/monitor.py snapshot 3
python3 scripts/monitor.py snapshot 3 --note "price before sale"

View history:

python3 scripts/monitor.py history 3
python3 scripts/monitor.py history 3 --limit 10

Visual Diffs

Side-by-side HTML comparison. Old on the left, new on the right. Green for additions, red for removals, yellow for changes.

python3 scripts/monitor.py diff 3
python3 scripts/monitor.py screenshot 3

diff generates the comparison and opens it in your browser. screenshot saves the current content for future diffing.

Reports

Weekly summary, formatted for WhatsApp:

python3 scripts/monitor.py report

Groups

python3 scripts/monitor.py groups

Lists all groups with monitor counts.

Engines and Cloudflare Support

The monitor uses a fetch engine to grab page content. By default (--engine auto), it tries engines in order until one works:

  1. curl -- fast, no dependencies, works on most sites
  2. cloudscraper -- handles Cloudflare JS challenges without a full browser
  3. playwright -- full headless browser for JS-heavy SPAs

Check what's available on your system:

python3 scripts/monitor.py engines

Force a specific engine:

python3 scripts/monitor.py watch "https://example.com" --engine cloudscraper
python3 scripts/monitor.py add "https://example.com" --engine browser

Install cloudscraper (recommended for Cloudflare-protected e-commerce sites):

pip3 install cloudscraper

The engine preference is saved per monitor. You can mix engines across monitors.

JS Rendering

Sites like Amazon, Best Buy, and most SPAs load content with JavaScript. Default curl fetching won't see it. Add --browser to use Playwright's headless Chromium:

python3 scripts/monitor.py watch "https://amazon.com/dp/B0EXAMPLE" --browser

If Playwright isn't installed, it falls back to curl and warns you. Install with:

pip3 install playwright && python3 -m playwright install chromium

Webhooks

Fire a JSON POST when conditions are met or content changes:

python3 scripts/monitor.py add "https://example.com" --webhook "https://hooks.slack.com/services/..."

Use --webhook multiple times for multiple endpoints. The payload includes monitor_id, label, url, event details (status, condition_met, change_summary, current_price), and timestamp.

Webhooks fire during check whenever something triggers.

Export and Import

python3 scripts/monitor.py export > monitors.json
python3 scripts/monitor.py import monitors.json

Import skips duplicates by URL.

GUI Console

python3 scripts/monitor.py gui

Opens ~/.web-monitor/console.html in your browser. Single self-contained HTML file. Shows all monitors, price trends, alert history, groups, and templates. Dark/light mode, filtering, sorting, sparklines. No external dependencies.

Add --no-open to generate without launching.

Condition Syntax

  • price below 500 or price < 500 alerts when price drops below threshold
  • price above 1000 or price > 1000 alerts when price exceeds threshold
  • contains 'in stock' alerts when text appears on page
  • not contains 'out of stock' alerts when text disappears

Priority Levels

  • high fires an immediate alert
  • medium is the default
  • low gets batched into digests

Automation with Cron

Set up a cron job to check monitors regularly:

Task: Check all web monitors. Run: python3 <skill_dir>/scripts/monitor.py check
Report any monitors where status is "changed" or "condition_met" is true.
If nothing changed, stay silent.

Recommended schedule: every 6 hours (0 */6 * * *). For weekly reports, run report on Mondays.

Feedback

python3 scripts/monitor.py feedback "your message"
python3 scripts/monitor.py feedback --bug "something broke"
python3 scripts/monitor.py feedback --idea "wouldn't it be cool if..."
python3 scripts/monitor.py debug

Tips

  • watch is almost always the right starting point. Use add only when you need specific conditions.
  • --selector reduces noise. If you only care about the price, point it at #price instead of the whole page.
  • Group related monitors, then use compare to find the best deal across stores.
  • Up to 50 snapshots per monitor are kept. Content is capped at 10KB per snapshot.
  • Price targets show progress in both dashboard and check output.
  • snapshot --note before a sale event gives you a clean baseline to diff against.
  • For JS-heavy sites, --browser is not optional. It's required.
  • Combine webhooks with Slack or Discord for real-time alerts without polling.

Files

3 total
Select a file
Select a file to preview.

Comments

Loading comments…