changedetection.io is a self-hosted website change detection and monitoring tool that alerts users when web content, prices, or PDFs change. Designed for bargain hunters, data journalists, and compliance officers, it solves the problem of manually checking websites for updates by automating detection with browser-based fetching and intelligent filters. It supports both lightweight HTTP fetching and full Chrome/Playwright execution for dynamic content.
Built with Python and Docker-first deployment, it integrates with Apprise for 85+ notification platforms and uses XPath, CSS selectors, JSONPath, and jq for precise content targeting. Users can self-host via Docker, pip, or Windows, or opt for a SaaS subscription with proxies, Chrome browsers, and cloud-based monitoring.
What You Get
- Visual Selector Tool - Click and select specific HTML elements to monitor, excluding noise like ads or navigation bars, ensuring alerts trigger only on meaningful content changes.
- Browser Steps Automation - Execute interactive browser actions like logging in, filling forms, clicking buttons, or accepting cookies before detecting changes, enabling monitoring behind authentication.
- Price & Restock Detection - Automatically extract product pricing and stock status from HTML, set thresholds for price drops or restock alerts, and trigger notifications when products become available or change price.
- PDF Change Monitoring - Track text content, filesize, and checksums of PDF files to detect updates in legal documents, reports, or policy changes without manual downloads.
- XPath, CSS, JSONPath & jq Support - Use advanced selectors to target nested elements, JSON API responses, or complex DOM structures with LXML regex functions like re:test and re:match.
- 85+ Notification Integrations - Receive alerts via Discord, Slack, Telegram, Email, Office 365, NTFY, Matrix, Rocket.Chat, and custom webhooks using the Apprise library for flexible alert routing.
- Chrome Extension Integration - Install the official Chrome extension to instantly add the current webpage to your watchlist with one click, syncing directly to your changedetection.io instance.
- Per-Site Scheduling & Timezone Support - Configure check intervals (5+ minutes), limit monitoring to business hours, weekends, or specific timezones to align with regional content updates.
- Proxy Configuration Per Watch - Route each monitored URL through a specific proxy (including Bright Data, Tor, or custom proxies) to bypass blocks or simulate regional access.
- Screenshot Notifications - Attach a visual screenshot of the page when a change is detected, providing immediate context without needing to visit the site.
Common Use Cases
- Tracking product restocks - A shopper monitors a sold-out PlayStation 5 page, receiving Discord alerts the moment it’s back in stock using price and inventory detection rules.
- Monitoring government policy updates - A journalist sets up a watch on a state agency’s website to get email alerts when new regulations are published as HTML or PDF changes.
- Detecting website defacement - A small business uses changedetection.io to monitor its homepage for unauthorized code changes, triggering Slack alerts and screenshots for immediate response.
- Job alert automation - A job seeker configures a watch on a company’s careers page to detect new postings using keyword filters and receives Telegram notifications when roles are added.
- Price drop alerts for electronics - A bargain hunter tracks Amazon or Best Buy product pages, setting thresholds to be notified only when prices drop below $200 or by more than 15%.
- Regulatory compliance monitoring - A compliance officer monitors SEC filings or EU regulatory portals using JSONPath to extract and alert on new filings or amendments in structured data.
Under The Hood
Architecture
- Flask-based application with clear separation of concerns between route handlers, service logic, and data models, following an MVC-like structure
- Modular plugin system enabled through environment-driven dynamic imports, allowing external processors to extend functionality without core modifications
- Dependency injection for browser automation backends (Selenium, Playwright, requests) via configuration, enabling flexible and environment-aware execution
- Asynchronous task processing with decoupled fetchers and notification queues, ensuring monitoring and alerting operate independently
- Docker multi-stage builds with conditional package installation and ARM support, providing lightweight, architecture-aware deployments
- Frontend and backend fully decoupled via a documented REST API, with schema generation handled through automated build pipelines
Tech Stack
- Python 3.11 backend powered by Flask, with Flask-Babel and Flask-Login for internationalization and session management
- Headless browser monitoring via Playwright and Selenium, enhanced with optional OpenCV for pixel-level change detection
- Dockerized deployment using slim base images and environment-configurable plugins for scalable, production-ready setups
- Babel and Jinja2 for comprehensive internationalization, supported by a full .pot/.po translation pipeline
- Ruff for strict PEP-8 compliance with pre-commit hooks enforcing code quality standards
- CI/CD-ready infrastructure with docker-compose, environment-driven configs, and built-in proxy/SSL tuning for production
Code Quality
- Extensive test suite covering unit, integration, and system-level scenarios, validating data persistence, change detection, and UI flows
- Robust error handling with graceful degradation for file I/O, missing configurations, and extraction failures
- Consistent naming conventions and descriptive test functions that directly reflect functionality under test
- Strong data integrity through structured JSON serialization, UUID-based file naming, and schema validation for backups
- Comprehensive linting and automated test execution with parallel runs and cleanup scripts ensuring reliability
What Makes It Unique
- Dynamic OpenAPI specification merging from plugin processors enables third-party extensions to auto-register API schemas and examples without touching core code
- Intelligent query parameter type conversion engine supports flexible URL-based imports by parsing OpenAPI 3.1 schemas, eliminating need for JSON payloads in simple cases
- Plugin-first architecture with per-processor API documentation files creates a true ecosystem for external module integration
- Background import thresholding automatically switches between sync and async processing based on payload size, preserving UI responsiveness
- Built-in system health monitoring with configurable grace periods for watch overdues, providing operational visibility without external tools