Monitor Any Web Page for Changes Without Giving Up Your Data
Most web monitoring services charge monthly fees, log your watched URLs, and impose limits on how many pages you can track. Changedetection.io sidesteps all of that by running entirely on your own infrastructure – a self-hosted container that watches any page you point it at and notifies you the moment something changes.

What Changedetection.io Actually Does
At its core, Changedetection.io is a web scraping monitor. You give it a URL, set a check interval, and it fetches that page on a schedule, compares the new content to the last saved version, and alerts you to any difference. That can be a price dropping on a product listing, a government page updating its regulations, a job posting going live, or a competitor quietly changing their pricing page. The use cases are broad enough that this tool earns a permanent slot in any self-hoster’s stack.
Where Changedetection.io goes beyond basic page diffing is in its filtering options. You can scope monitoring to a specific CSS selector or XPath expression, which means you ignore nav menus, footers, and ad banners that change constantly and focus only on the content that matters. This cuts down on false alerts dramatically. You can also configure it to use a JavaScript-rendering browser backend, which handles single-page applications and React-heavy sites that would otherwise return an empty shell to a standard HTTP fetch.
Notifications work through a wide range of services: email, Telegram, Slack, Discord, Gotify, Ntfy, and more, all powered by Apprise under the hood. You define a notification URL once, assign it to one or many watches, and alerts arrive wherever you prefer. The notification payload can be customized with templating, so you can include the changed text, the diff, or just a link back to the watch in your Changedetection.io dashboard.
The project is actively maintained on GitHub under the MIT license. There are no paywalled features, no telemetry, and no account required. Everything runs locally, which also means your watched URLs – some of which might be sensitive internal pages, private listings, or authenticated portals – never leave your network.

Deploying It With Docker Compose
The fastest path to a working install is Docker Compose. Create a project directory, drop in a docker-compose.yml file, and you have a running instance in under two minutes. The base setup requires only the Changedetection.io image itself, but if you want JavaScript rendering, you add a Playwright or Selenium container alongside it and point Changedetection.io at it via an environment variable.
Start with this minimal compose file. It runs the core service on port 5000, mounts a local volume so your data persists between container restarts, and sets a basic timezone:
- Create the file at ~/changedetection/docker-compose.yml
- Paste in the following service definition:
services:
changedetection:
image: ghcr.io/dgtlmoon/changedetection.io
container_name: changedetection
restart: unless-stopped
ports:
– “5000:5000”
volumes:
– ./datastore:/datastore
environment:
– TZ=America/New_York
To add JavaScript rendering, append a Playwright container and link them together. Changedetection.io checks for a PLAYWRIGHT_DRIVER_URL environment variable. Set it to the WebSocket URL your Playwright container exposes – typically ws://playwright-chrome:3000 – and the app will automatically route JS-heavy URLs through that browser rather than a simple HTTP fetch. This is essential for monitoring e-commerce sites, news paywalls, or any dashboard behind a login that uses JavaScript to render content.
Once your compose file is ready, run docker compose up -d from the project directory. Browse to http://your-server-ip:5000 and you will land on the main watch list, which is empty by default. Before adding any watches, head to Settings > Notifications and configure at least one alert channel. Paste in your Apprise-compatible notification URL – for Telegram that looks like tgram://bottoken/chatid, for Discord it is a standard webhook URL prefixed with discord://. Save it, then send a test notification to confirm the pipeline works before you rely on it.
Adding your first watch takes about thirty seconds. Click Add New URL, paste the page address, and optionally drop into the Filters & Triggers tab to add a CSS selector. A product price sitting inside a span.price element? Enter that selector and Changedetection.io ignores everything else on the page. Set your check interval – anywhere from five minutes to weekly – and save. The first fetch establishes a baseline snapshot. Any subsequent fetch that differs from that snapshot triggers your configured notification. If you run other self-hosted infrastructure monitoring tools like Beszel, Changedetection.io fits naturally alongside them, watching the public-facing layer while your server metrics tool handles what’s happening underneath.
Locking It Down and Keeping It Running
By default the interface has no authentication. On a home server behind a firewall that may be acceptable, but if you expose the dashboard through a reverse proxy, add HTTP basic auth at the proxy level or enable the built-in password protection under Settings > Application. The setting is a single password field – not multi-user, but enough to keep the dashboard from being an open door if your subdomain is publicly reachable. Pair this with an SSL certificate from Let’s Encrypt through Caddy or Nginx Proxy Manager and the setup is solid for personal use.

Backups reduce to copying the ./datastore directory. That folder contains your watch list, snapshots, notification config, and history. Restore means copying it back and restarting the container. Watch your disk usage over time – each check stores a snapshot, and if you are monitoring dozens of pages at short intervals the datastore can grow. The Settings > Application panel lets you cap how many history entries to keep per watch, which controls storage growth without losing the ability to browse recent diffs. One underused feature worth enabling is the Restock & Price Detection mode, which applies heuristics specifically tuned for e-commerce pages, reducing the noise from currency symbol formatting changes and irrelevant DOM shifts that would otherwise trigger alerts on busy product pages.
Frequently Asked Questions
Does Changedetection.io work on pages that require JavaScript to load content?
Yes. You can connect a Playwright or Selenium container and configure Changedetection.io to route specific watches through that browser backend for full JS rendering.
How do I get notified when a page changes?
Changedetection.io uses Apprise to support dozens of notification services including Telegram, Discord, Slack, email, and Ntfy. You configure the notification URL once in Settings.





