
Page Monitoring
Set up change detection and uptime checks on competitor pages, policy docs, or story sources when RSS is missing or content might disappear.
Overview
Page Monitoring is an agent skill most often used in Operate (also Launch distribution, Grow content) that documents web change detection and uptime workflows across hosted and self-hosted tools.
Install
npx skills add https://github.com/jamditis/claude-skills-journalism --skill page-monitoringWhat is this skill?
- Compares Visualping, ChangeTower, Distill.io, UptimeRobot, changedetection.io, urlwatch, and Wachete with free-tier cave
- Covers visual vs element-level diffs, alert latency, and history retention for journalism archiving
- Self-hosted DIY paths for privacy-sensitive source monitoring
- Methodology for preserving pages before deletion and feeds without RSS
- Comparison table covers 8 monitoring approaches including self-hosted options
- Notes UptimeRobot free tier at 50 monitors with 5-minute intervals
- Distill.io free tier cited as ~5 monitors with 7-day history (verify at pricing page)
Adoption & trust: 512 installs on skills.sh; 252 GitHub stars; 2/3 security scanners passed (skills.sh audits).
What problem does it solve?
You need to know when a critical URL changes or goes down but the site offers no RSS and ad-hoc manual refreshes miss updates.
Who is it for?
Indie journalists, newsletter operators, and solo SaaS founders tracking competitor pricing, legal pages, or unreliable primary sources.
Skip if: Teams that only need synthetic API health checks inside their own app—use application APM instead of page-diff services.
When should I use this skill?
Tracking content changes, detecting when pages go down, monitoring for updates, preserving content before deletion, or generating feeds for pages without RSS.
What do I get? / Deliverables
You pick a monitoring stack with realistic free limits, configure alerts and retention, and can snapshot content before it is removed.
- Monitoring service selection with alert and retention settings
- Runbook for archival snapshots before expected removals
Recommended Skills
Journey fit
Spans multiple journey phases - primary shelf plus alternate fits below.
Canonical shelf is Operate because the skill centers on ongoing page health and change alerts after sites are live. Monitoring subphase matches availability tracking, diff alerts, and archival before takedowns—not one-off research.
Where it fits
Watch rival feature pages weekly to spot positioning shifts before you commit to a niche.
Alert when a partner changelog updates so launch messaging stays accurate.
Monitor citation sources for edits that invalidate published explainers.
Run uptime plus diff monitors on ToS and status pages you are contractually bound to track.
How it compares
Use for external web page diffing and archival triggers, not in-repo CI uptime or log-based error monitoring.
Common Questions / FAQ
Who is page-monitoring for?
Solo builders and small editorial teams who depend on third-party web pages as sources of truth and cannot rely on RSS alone.
When should I use page-monitoring?
During launch competitor watches, grow-phase content sourcing, and operate-phase policy or availability surveillance—or whenever you must preserve a page before likely deletion.
Is page-monitoring safe to install?
It is procedural documentation; review the Security Audits panel on this catalog page before pointing agents at credentials for login-protected monitors like Wachete.
SKILL.md
READMESKILL.md - Page Monitoring
# Page monitoring methodology Patterns for tracking web page changes, detecting content removal, and preserving important pages before they disappear. ## Monitoring service comparison Free-tier limits and retention windows shift annually — verify at the service's pricing page before relying on a specific number. The columns below reflect a 2026 snapshot. | Service | Free Tier | Best For | History | Alert Speed | |---------|-----------|----------|---------|-------------| | **Visualping** | A few daily checks (free plan tightened in recent years) | Visual changes | Standard | Minutes | | **ChangeTower** | Yes (verify current limits) | Compliance, archiving | Multi-year on paid plans | Minutes | | **Distill.io** | ~5 monitors with 7-day history | Element-level tracking | Limited on free tier | Seconds | | **Wachete** | Limited | Login-protected pages | 12 months | Minutes | | **UptimeRobot** | 50 monitors at 5-minute intervals (free SMS removed) | Uptime only | 60 days | 5-min checks | | **changedetection.io** | Self-hosted; free | Privacy / DIY | Disk space | Configurable | | **urlwatch** | Self-hosted; free | Cron-driven CLI | Configurable | Configurable | ## Quick-start: Monitor a page ### Distill.io element monitoring ```javascript // Distill.io allows CSS/XPath selectors for precise monitoring // Example selectors for common use cases: // Monitor news article headlines const newsSelector = '.article-headline, h1.title, .story-title'; // Monitor price changes const priceSelector = '.price, .product-price, [data-price]'; // Monitor stock/availability const availabilitySelector = '.in-stock, .availability, .stock-status'; // Monitor specific paragraph or section const sectionSelector = '#main-content p:first-child'; // Monitor table data const tableSelector = 'table.data-table tbody tr'; ``` ### Python monitoring script ```python import requests import hashlib import json import smtplib from email.mime.text import MIMEText from datetime import datetime from pathlib import Path from typing import Optional from bs4 import BeautifulSoup class PageMonitor: """Simple page change monitor with local storage.""" def __init__(self, storage_dir: Path): self.storage_dir = storage_dir self.storage_dir.mkdir(parents=True, exist_ok=True) self.state_file = storage_dir / 'monitor_state.json' self.state = self._load_state() def _load_state(self) -> dict: if self.state_file.exists(): return json.loads(self.state_file.read_text()) return {'pages': {}} def _save_state(self): self.state_file.write_text(json.dumps(self.state, indent=2)) def _get_page_hash(self, url: str, selector: Optional[str] = None) -> tuple[str, str]: """Get content hash and content for a page or element.""" response = requests.get(url, timeout=30, headers={ 'User-Agent': 'Mozilla/5.0 (PageMonitor/1.0)' }) response.raise_for_status() if selector: soup = BeautifulSoup(response.text, 'html.parser') element = soup.select_one(selector) content = element.get_text(strip=True) if element else '' else: content = response.text content_hash = hashlib.sha256(content.encode()).hexdigest() return content_hash, content def add_page(self, url: str, name: str, selector: Optional[str] = None): """Add a page to monitor.""" content_hash, content = self._get_page_hash(url, selector) self.state['pages'][url] = { 'name': name, 'selector': selector, 'la