Changedetection.io on a VPS: Monitor Web Pages for Changes and Get Instant Alerts
Changedetection.io is a self-hosted web page monitoring tool — it checks web pages on a schedule, detects when content changes, and sends alerts via email, Telegram, Slack, Discord, or webhooks. Use cases: monitoring competitor pricing, tracking government regulation updates, watching for product restocks, alerting on news site updates, or monitoring your own site for unexpected changes. Self-hosted means no per-URL limits, no privacy concerns about what pages you monitor.
Step 1: Docker Compose Setup
<code">mkdir -p /opt/changedetection && cd /opt/changedetection nano docker-compose.yml
<code">version: '3.8'
services:
changedetection:
image: ghcr.io/dgtlmoon/changedetection.io:latest
container_name: changedetection
restart: always
ports:
- "127.0.0.1:5000:5000"
environment:
BASE_URL: https://monitor.yourdomain.com
FETCH_WORKERS: 10 # Number of parallel page fetchers
volumes:
- changedetection_data:/datastore
depends_on:
playwright-chrome:
condition: service_started
# Playwright/Chrome for JavaScript-rendered pages
playwright-chrome:
image: browserless/chrome:latest
restart: always
environment:
SCREEN_WIDTH: 1920
SCREEN_HEIGHT: 1080
CONNECTION_TIMEOUT: 300000
MAX_CONCURRENT_SESSIONS: 5
ports:
- "127.0.0.1:3000:3000"
volumes:
changedetection_data:
<code">docker compose up -d
Step 2: Nginx Reverse Proxy
<code">sudo nano /etc/nginx/sites-available/changedetection
<code">server {
listen 443 ssl http2;
server_name monitor.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/monitor.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/monitor.yourdomain.com/privkey.pem;
# Add basic auth to protect the monitoring panel
auth_basic "Change Detection";
auth_basic_user_file /etc/nginx/.changedetection_htpasswd;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
<code">sudo htpasswd -c /etc/nginx/.changedetection_htpasswd admin sudo certbot --nginx -d monitor.yourdomain.com sudo systemctl reload nginx
Step 3: Add URLs to Monitor
<code"># In Changedetection UI: # + Add new URL → enter URL → configure check interval # Examples: # Price monitoring: https://store.example.com/product-abc # News monitoring: https://tech.example.com/blog/ # Competitor pricing: https://competitor.com/pricing # CSS Selectors (monitor specific elements only): # Settings → CSS Filter: .product-price # .price, #current-price, [data-price] # Only alerts when the SELECTED element changes # Prevents alerts from ads/navigation/footers changing # JavaScript-rendered pages: # Fetch Type → Playwright (uses Chrome) # Slower but handles React/Vue/Angular pages # Check frequency: # Every 5 minutes, hourly, daily, weekly # Set based on urgency and page update frequency
Step 4: Configure Notifications
<code"># Settings → Notification → Test # Telegram notification: # URL: tgram://BOT_TOKEN/CHAT_ID # Example: tgram://1234567890:ABC.../0987654321 # Slack notification: # URL: slack://tokenA/tokenB/tokenC/channel # Email (SMTP): # URL: mailto://user:[email protected]:587 # Webhook (any HTTP endpoint): # URL: https://your-app.com/webhook # Method: POST # Payload template: {"url": "{{watch_url}}", "diff": "{{diff}}"}
Step 5: Advanced Monitoring with Filters
<code"># Text filters — only alert if specific text appears/disappears: # Settings → "Trigger / Ignore" → Trigger on text: # "In Stock" (alert when product becomes available) # "Price: $" followed by number decrease # Ignore text — prevent false alerts on dynamic content: # Ignore: "Updated X minutes ago" # Ignore: "visitors online" # Ignore regex: \d+ (page counter changes) # Visual difference mode: # Capture screenshots and alert on visual changes # Useful for UI monitoring or layout changes # JSON path filtering (for API endpoints): # URL: https://api.example.com/product/123 # CSS Filter (JSON path): $.price # Monitors only the price field in a JSON response
Step 6: API Usage
<code"># Changedetection has a REST API for programmatic management
API_KEY="your_api_key" # From Settings → API
# Add a watch:
curl -X POST https://monitor.yourdomain.com/api/v1/watch \
-H "x-api-key: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://store.example.com/product/laptop",
"tag": "price-monitoring",
"time_between_check": {"minutes": 30},
"css_filter": ".product-price"
}'
# Get all watches:
curl https://monitor.yourdomain.com/api/v1/watch \
-H "x-api-key: $API_KEY"
# Get snapshot (current page content):
curl https://monitor.yourdomain.com/api/v1/watch/WATCH_UUID/snapshot \
-H "x-api-key: $API_KEY"
Getting Started
Changedetection.io with Playwright Chrome uses 300–500 MB RAM. A 1 GB Ubuntu VPS at VPS.DO comfortably handles monitoring 50–100 URLs. For monitoring many JavaScript-heavy pages simultaneously, a 2 GB VPS provides headroom for more concurrent Chrome sessions. The self-hosted approach has no URL limits — monitor thousands of pages without per-URL pricing.
Conclusion
Self-hosted Changedetection.io monitors web pages for changes and sends alerts — price drops on products, regulatory updates on government sites, competitor feature releases, or unexpected changes to your own web properties. CSS selectors focus alerts on specific page elements rather than noisy full-page diffs. For competitive intelligence, procurement monitoring, or operational awareness, self-hosted change detection provides private, unlimited page monitoring at VPS cost.
EveryGenAI
October 30, 2026Focusing on Self-hosted means no per-URL limits, no privacy concerns about what pages you monitor clarifies the trade-off better than a vague summary. Separately, if you want a short break, everygenai.live is a AI video/image effects tool with no download.