Monitor Any Web Page Without Giving Up Your Data
Most web monitoring services run on someone else’s infrastructure, which means your watched URLs, alert configurations, and check history all live on servers you do not control. Changedetection.io flips that model entirely. It is an open-source web page change detection tool you can run on your own hardware, giving you full visibility into any page you want to track – product prices, government notices, job listings, competitor pages – without a subscription or a third-party server ever seeing your data.
The setup is straightforward if you are comfortable with Docker, and the interface is clean enough that you do not need any coding knowledge to use it day-to-day. This guide walks through getting Changedetection.io running on a self-hosted Linux server, configuring your first watches, and wiring up notifications so you actually hear about changes when they happen.

What You Need Before You Start
You need a Linux server or VPS with Docker and Docker Compose installed. Any modern Debian or Ubuntu-based machine works fine. The application itself is lightweight – it can run comfortably on a small VPS with 1 GB of RAM alongside other services. If you are already running a homelab stack, this drops in cleanly next to whatever else you have going.
You will also want a persistent storage location on your host machine for Changedetection.io’s data directory. All your watch configurations, snapshots, and change history get written there. Without a mapped volume, a container restart wipes everything. Pick a path you back up regularly – something like /opt/changedetection/data works well.
Optionally, decide upfront how you want to receive notifications. Changedetection.io uses the Apprise notification library under the hood, which supports dozens of services including email, Telegram, Slack, Discord, and Matrix. If you want push notifications on a self-hosted stack, pairing it with Gotify for lightweight self-hosted push notifications is a natural fit – Apprise supports Gotify natively with a simple URL format.
Installing With Docker Compose
Create a directory for your deployment and add a docker-compose.yml file. The base configuration is minimal:
- Define a service named changedetection using the image ghcr.io/dgtlmoon/changedetection.io
- Map port 5000 on the host to port 5000 in the container
- Mount your data directory: /opt/changedetection/data:/datastore
- Set the restart policy to unless-stopped
- Optionally add a BASE_URL environment variable pointing to your domain or IP, which Changedetection.io uses when generating notification links
Run docker compose up -d from that directory. The image pulls and the container starts within a minute. Navigate to http://your-server-ip:5000 in a browser and you will land on the main dashboard. If you plan to expose this to the internet, put it behind a reverse proxy with authentication – the application has no built-in login by default, though you can enable HTTP basic auth through an environment variable (USE_X_SETTINGS=1 combined with a USERNAME and PASSWORD variable).

Adding Watches and Configuring Checks
The core workflow is simple: paste a URL into the add field at the top of the dashboard and click Watch. Changedetection.io fetches the page immediately, stores a baseline snapshot, and begins checking it on whatever interval you set globally or per-watch. The default global interval is 24 hours, but you can tighten it to minutes for time-sensitive pages. Be reasonable with check frequency on sites you do not own – aggressive polling can look like a crawl from the server’s perspective.
Each watch has a Filters and Triggers tab where the real power lives. By default, the tool diffs the entire visible page text, which generates a lot of noise on pages with ads, timestamps, or rotating content. You can scope the comparison to a specific CSS selector – for example, targeting a price element, a stock status container, or a specific article body. XPath selectors work too. Setting a good filter here is the difference between useful alerts and a flood of meaningless notifications every check cycle.
The Restock and Price detection modes deserve a mention. These are pre-built modes that specifically handle e-commerce patterns – detecting when an out-of-stock item comes back, or when a price drops below a threshold you set. You switch modes in the Watch Settings panel. If you are tracking a product page, these modes handle the structured data parsing better than a raw text diff would.
For pages that require JavaScript rendering – single-page applications, dynamic product pages, anything that loads content after the initial HTML is served – Changedetection.io supports Playwright and Puppeteer via an optional browser container. Add the browserless/chrome or playwright-stealth container to your Compose file and point to it in Settings under the Playwright/Chrome section. The PLAYWRIGHT_DRIVER_URL environment variable tells Changedetection.io where to find the browser instance. Without this, JavaScript-heavy pages may show empty or incomplete content in the diff view.

Notifications, Snapshots, and Long-Term Use
To set up notifications, go to Settings then Notifications and paste an Apprise-compatible URL. For Gotify, the format is gotify://your-server/your-app-token. For Telegram, it follows the pattern tgram://bot-token/chat-id. You can add multiple notification targets and test them directly from the settings page before relying on them for real alerts. Notifications fire per-watch or globally, depending on how you configure each entry.
One thing worth understanding about Changedetection.io’s storage behavior: every detected change saves a full snapshot of the page content at that moment. Over time, on active watches, this accumulates. The data directory can grow meaningfully if you are watching many pages at short intervals. There is no automatic pruning built into the current stable release, so occasional manual cleanup or a cron job targeting old snapshot files in the datastore is worth planning for.
The history view per watch is genuinely useful – it shows a visual diff between any two snapshots, highlighting added text in green and removed text in red. If you missed an alert or want to audit what changed over the past week on a particular page, this view makes it readable without any extra tooling. The diff engine handles both text and source mode comparisons, so you can drop down to raw HTML if the rendered text view is losing context you care about.
Whether Changedetection.io replaces a paid monitoring service depends entirely on what you were paying for. If the answer was “alerts when a page changes,” this handles it completely. If you needed uptime monitoring, response time tracking, or multi-step synthetic checks, that is a different category of tool – and something like Beszel for self-hosted server monitoring covers server-side visibility while Changedetection.io handles the content layer. Running both gives you a reasonably complete picture of what is happening across your infrastructure and the pages you care about, without routing that data through any external platform.





