Overview
This guide will take you from zero to your first working monitor with notifications in just a few minutes. By the end, you’ll have changedetection.io monitoring a website and sending you alerts when changes occur.Installation
Choose the installation method that works best for you:- Docker (Recommended)
- Docker Compose
- Python pip
The fastest way to get started with changedetection.io:
Mac users: Use port
5050 instead to avoid conflicts with AirPlay:Verify Installation
Once running, access the web interface:The default installation uses the
:latest tag for stable releases. Use :dev for bleeding-edge features from the master branch.Create Your First Watch
Now let’s set up your first website monitor:Add a new watch
Click the ”+ Watch” button or “Add” in the top navigation.Enter a URL to monitor, for example:
Configure basic settings
On the watch edit page, you can configure:Essential Settings:
- URL: The webpage to monitor
- Title: A friendly name for this watch (optional, auto-detected from page title)
- Check Interval: How often to check for changes
Run first check
Back on the watch list:
- Find your newly created watch
- Click the “Check Now” button (play icon)
- Wait a few seconds for the first check to complete
Add Content Filtering
Monitor only specific parts of a page to avoid false positives:- CSS Selectors (Simple)
- Visual Selector (Advanced)
- XPath (Powerful)
Edit your watch and add CSS selectors to the “CSS/JSONPath/JQ Filter” field:
Set Up Notifications
Get alerted when changes are detected:Configure notification endpoint
Edit your watch and scroll to the “Notifications” section.Add one or more notification URLs using the Apprise format:
Customize notification content (optional)
Use Jinja2 templates to customize your alerts:Title:Body:Available variables:
{{watch_url}}: The monitored URL{{watch.title}}: Watch title{{diff}}: HTML/text diff of changes{{current_timestamp}}: Check timestamp{{preview_url}}: Link to view the change
Trigger Detection
Control when notifications are sent:- Trigger on Text
- Block on Text
- Ignore Text
Only get notified when specific text appears:Add these to the “Trigger/wait for text” field. Supports regex:
Advanced: Monitor Prices
For product monitoring, use the specialized restock processor:Set price thresholds
Configure optional price alerts:
- Above price: Alert if price exceeds this amount
- Below price: Alert if price drops below this amount
- Percentage change: Alert on % price change
The restock processor extracts pricing data from standard e-commerce meta tags (schema.org, Open Graph) found on most product pages.
Schedule Monitoring
Control when checks run:- Check Interval
- Time Scheduling
Set how often the page is checked:
- Every 5 minutes (frequent)
- Every hour (moderate)
- Once per day (light monitoring)
- Custom: Specify weeks, days, hours, minutes, seconds
Common Patterns
Monitor job postings
Monitor job postings
Track price drops
Track price drops
Monitor API responses
Monitor API responses
Government announcements
Government announcements
Next Steps
Visual Selector
Learn to precisely target page elements
Browser Steps
Automate login, clicks, and form fills
JSON Filtering
Monitor and filter JSON API responses
Proxy Setup
Route requests through proxies
Troubleshooting
Changes detected on every check
Changes detected on every check
Problem: Dynamic content (timestamps, ads, counters) triggers false positives.Solutions:
- Use CSS/XPath selectors to monitor only relevant content
- Add dynamic text to the “Ignore text” field
- Use the Visual Selector to exclude changing elements
Notifications not sending
Notifications not sending
Checklist:
- Test notification URL using “Send test notification” button
- Check notification URL format matches Apprise syntax
- Verify network connectivity to notification service
- Check changedetection.io logs for error messages
JavaScript-heavy sites not loading
JavaScript-heavy sites not loading
Problem: Content loaded by JavaScript doesn’t appear.Solution: Enable Playwright fetcher:
- Uncomment browser service in
docker-compose.yml - Set
PLAYWRIGHT_DRIVER_URLenvironment variable - Change watch fetch method to “Playwright Chrome/Javascript”
Port 5000 already in use (Mac)
Port 5000 already in use (Mac)
Problem: macOS AirPlay uses port 5000.Solution: Use port 5050: