changedetection.io
Self-hosted website change detection with AI-powered smart alerts, browser automation, price tracking, and 85+ notification channels.
Repository Health
Technical Analysis
Dependency Health
changedetection.io is a self-hosted, open-source tool for monitoring websites for any kind of change — from price drops and restock events to policy updates, defacement attempts, and JSON API shifts. It handles both lightweight HTTP fetching and full headless browser execution via Playwright or Selenium, making it equally capable of monitoring static HTML pages and JavaScript-heavy single-page apps.
The project’s most significant recent evolution is AI-powered change detection. Users can now write plain-English intent rules — “notify me only when the price drops below $50” or “ignore navigation changes” — and the connected LLM (OpenAI, Gemini, Anthropic, Ollama, or any OpenAI-compatible endpoint via LiteLLM) evaluates each detected diff against that intent, suppressing irrelevant noise. AI change summaries transform raw diffs into human-readable narratives like “Price dropped from $89.99 to $67.00” delivered directly in the notification.
Deployed primarily through Docker, changedetection.io integrates with Apprise to deliver notifications through 85+ channels including Discord, Slack, Telegram, Email, Matrix, and webhooks. Advanced content targeting uses XPath 1 and 2, CSS selectors, JSONPath, and jq to zero in on specific page elements. Browser Steps automation lets users script interactive sequences — logins, cookie acceptance, form filling — before any change check runs.
With over 32,000 GitHub stars, 200+ releases, and a growing ecosystem of external plugins via Pluggy, changedetection.io has established itself as the go-to self-hosted alternative to commercial website monitoring services.
What You Get
- AI-Powered Change Filtering - Connect any LLM (OpenAI, Gemini, Anthropic, Ollama, or self-hosted vLLM) and write plain-English intent rules so the AI evaluates every diff against your goal, suppressing irrelevant changes and eliminating false-positive noise.
- AI Change Summaries - Instead of staring at raw diffs, notifications read ‘Price dropped from $89.99 to $67.00’ or ‘3 new products added’ — generated by the configured LLM and delivered alongside the standard alert.
- Visual Selector Tool - Point-and-click element targeting lets you select precisely which parts of a page to watch, excluding dynamic noise like ads, banners, and navigation, using Playwright for accurate DOM inspection.
- Browser Steps Automation - Script interactive browser sequences — logging in, filling forms, accepting cookie banners, clicking buttons — that run before every change detection cycle, enabling monitoring behind authentication.
- Price & Restock Detection - Extract product metadata (pricing, availability, currency) directly from HTML page schemas, set price thresholds and percentage triggers, and receive alerts when stock status changes or prices hit your target.
- PDF Change Monitoring - Track text content, filesize, and checksums of PDF files to detect amendments in legal documents, regulatory filings, or technical reports without downloading each version manually.
- XPath, CSS, JSONPath & jq Selectors - Target nested HTML elements with XPath 1 and 2, CSS selectors, or drill into JSON API responses with JSONPath or jq — including LXML-powered regex functions like re:test and re:match.
- 85+ Notification Integrations - Apprise library powers alerts to Discord, Slack, Telegram, Email, Office 365, Matrix, NTFY, Rocket.Chat, MQTT, and custom webhooks, all configurable per-watch.
- Per-Watch Proxy Configuration - Route individual monitored URLs through specific proxies — Bright Data, Tor, SOCKS5, or custom — to bypass geo-blocks, rate limits, or simulate regional access patterns.
- Conditional Change Rules - Define JSON Logic conditions to trigger alerts only when detected values meet criteria: price above or below a threshold, keyword present or absent, stock count exceeding a limit.
- Scheduler with Timezone Support - Restrict monitoring to business hours, weekends, or specific timezones for each watch, avoiding unnecessary checks and reducing noise from expected off-hours changes.
- Chrome Extension Integration - One-click browser extension syncs the current webpage directly to your changedetection.io instance, requiring zero copy-pasting of URLs.
Common Use Cases
- Product restock monitoring - A shopper watches a sold-out GPU page with restock detection enabled, writing an AI intent ‘alert me only when in-stock status changes’ to avoid noise from price fluctuations and delivery estimate updates.
- Price drop alerts with thresholds - A bargain hunter tracks electronics across multiple retailers, setting lower price bounds and percentage drop triggers so notifications only fire when the deal is genuinely worth acting on.
- Detecting regulatory and policy changes - A compliance officer monitors EU or SEC portals for new filings using JSONPath to target structured data elements, with AI summaries that extract the key amendment in plain language.
- Website defacement monitoring - A DevOps team watches company homepages for unauthorized HTML changes, receiving Slack alerts with attached screenshots the moment unexpected content appears.
- Job posting alerts - A job seeker scripts a Browser Steps login to a company’s internal careers portal, then watches the listing page with keyword triggers to be notified the moment a matching role appears.
- API response monitoring - A developer watches a JSON API endpoint using jq selectors to extract a specific nested field, triggering a webhook notification whenever its value changes — effectively turning any API into an event stream.
Under The Hood
Architecture changedetection.io is built as a layered Flask application with a clear separation between HTTP routing, background task orchestration, and content processing. An async worker pool consumes from a priority queue of watch checks, while a separate notification queue ensures alerts are delivered independently of fetch cycles. The architecture adopts a pluggable processor model — text diff, JSON diff, restock detection, and image SSIM comparison are each self-contained processor classes inheriting from a shared base, with the correct processor selected at runtime based on watch configuration. The Pluggy plugin system extends this further, allowing external packages to register entirely new fetchers, processors, settings tabs, and post-update handlers without modifying core code. This design keeps the core compact while enabling a genuine extension ecosystem.
Tech Stack The Python 3.11 backend is built on Flask 3.x with Flask-SocketIO for real-time watch status updates to connected browsers. Content fetching spans three backends: a fast requests-based HTTP fetcher, Playwright for headless Chromium, and Selenium/WebDriver — selected per-watch via configuration. LLM integration uses LiteLLM as a unified gateway to 100+ providers (OpenAI, Gemini, Anthropic, Ollama, vLLM, LM Studio), abstracted behind a thin client wrapper with loguru-based logging. Change detection employs diff-match-patch for text diffs, lxml with ElementPath for XPath 2.0 support, jsonpath-ng and jq for JSON, BeautifulSoup4 for HTML parsing, and optional OpenCV for pixel-level screenshot comparison with pixelmatch as fallback. Apprise handles the full notification ecosystem. Internationalization is managed through Flask-Babel with a complete .pot/.po pipeline and a custom dennis-powered translation toolchain.
Code Quality The test suite is extensive, spanning over 80 test files covering unit tests, integration tests, and end-to-end functional scenarios — including dedicated test files for LLM evaluation, AI summaries, conditions, scheduler logic, XPath selectors, restock detection, PDF monitoring, and security vulnerabilities. Error handling is explicit throughout: fetchers raise typed exceptions, processors handle missing selectors and encoding failures gracefully, and the LLM layer caps input size and token budgets to prevent runaway costs. Ruff enforces PEP-8 compliance with pre-commit hooks, and pytest-xdist enables parallel test runs. The codebase uses loguru consistently for structured logging rather than stdlib logging.
What Makes It Unique The AI change detection integration is architecturally clean — LiteLLM serves as a universal gateway so users can point changedetection.io at any self-hosted inference server (Ollama, vLLM, LM Studio) or cloud provider using the same configuration interface. The intent evaluation system caches results per (intent, diff) pair to avoid redundant LLM calls, and a BM25-based trimmer reduces large snapshots to relevant sections before sending them to the model, controlling cost without losing context. The Pluggy-based plugin interface is unusually well-specified: external packages can register new fetchers with full OpenAPI documentation fragments, settings tabs with Jinja2 templates, and post-update lifecycle hooks — making changedetection.io one of the few self-hosted monitoring tools designed from the ground up for a third-party extension ecosystem.
Self-Hosting
changedetection.io is released under the Apache License 2.0, which is a permissive open-source license. You can use, modify, and distribute it freely — including in commercial products and internal enterprise tooling — without triggering copyleft obligations. There is no separate “enterprise edition” licensed under a different terms; the single codebase covers all self-hosted deployments. A COMMERCIAL_LICENCE.md file exists in the repository but relates to the SaaS subscription service’s terms, not to restrictions on running the software yourself.
Self-hosting is Docker-first and operationally straightforward for small to medium deployments. A single docker compose up -d brings the full stack online, and the datastore is a flat file system under a mounted volume — no external database to manage. You are responsible for uptime, updates (new releases arrive roughly every one to two weeks), backup of the datastore directory, and scaling should you need to monitor thousands of URLs concurrently. Running Playwright-based checks requires a separate Chrome/Playwright container or a properly configured Playwright installation, which adds memory overhead. For high-frequency or high-volume monitoring, the async worker pool and configurable worker count provide horizontal scaling within a single host, but clustering across multiple nodes is not natively supported.
The official SaaS offering at changedetection.io costs $8.99/month and includes managed Chrome browsers, residential proxies via Bright Data, automatic updates, and AI features (change summaries and intent filtering) available from June 2026 in the hosted tier. Self-hosting gives you full data sovereignty, no per-URL pricing, and the ability to integrate with local LLMs (Ollama, vLLM, LM Studio) for zero-marginal-cost AI features. What you forgo is managed infrastructure, built-in proxy access, and a support SLA — the project’s support channel is GitHub Issues and a community Discord rather than dedicated customer success.
Related Apps
Uptime Kuma
Monitoring
Self-hosted monitoring for every service you run — 23 monitor types, 95 notification channels, live dashboards, and public status pages with no vendor lock-in.
World Monitor
Monitoring · Analytics
Real-time global intelligence dashboard that fuses AI-synthesized news, geopolitical risk scoring, and infrastructure tracking into one open-source situational awareness platform.
Netdata
Monitoring · Devops
Real-time per-second metrics, ML-powered anomaly detection, and zero-config observability for any infrastructure.