Changedetection.io
Changedetection.io is a free, open-source web page monitoring tool that watches any web page and tells you the moment something changes: a price drop, a restocked product, a new line in a changelog, or a single word buried in a wall of text. It runs as a single Docker container, keeps every version it has ever seen, and can diff plain HTML, JSON API responses, PDFs, and RSS/Atom feeds, not just what a human would call “a webpage.” It’s the closest thing the self-hosted world has to Visualping or Distill.io, minus the monthly seat price.
License: Changedetection.io’s source code is licensed under the Apache License 2.0, confirmed directly from the LICENSE file in the dgtlmoon/changedetection.io GitHub repo. Read the dedicated section further down, though: the same repository also ships a separate COMMERCIAL_LICENCE.md file that adds contractual restrictions on reselling or hosting the software for third parties, and the two documents don’t fully agree with each other.
Quick facts: Official site changedetection.io · GitHub dgtlmoon/changedetection.io, 32,000+ stars · Current release 0.55.7 · Official Docker image ghcr.io/dgtlmoon/changedetection.io · built by Web Technologies s.r.o., which also runs a paid, cloud-hosted version from $8.99/month.
What Changedetection.io actually does
At its core, changedetection.io is a scheduled fetch-and-diff engine, exactly the kind of web page monitoring tool people usually pay a SaaS subscription for. Add a URL, set a check interval, and it fetches that page on a schedule, five minutes at its fastest, then compares the new version against the last one it stored. When the two differ, by as little as a single word if you want that precision, it fires a notification and keeps a full history to scroll back through. That’s the same loop behind Visualping and Distill.io, except every check runs on your own hardware, with no cap beyond what your server can handle.
Key features
- Visual Selector: click the exact element on a rendered page, a price, a stock badge, instead of writing a CSS selector by hand
- Text and visual diffing: word-level, line-level, or full-page screenshot comparison, old and new shown side by side
- CSS/XPath filters, Trigger Text, and Ignore Text rules, so pages with rotating ads or timestamps don’t fire false alerts
- Restock and price-drop detection, plus conditional actions that only alert once a value crosses a threshold you set
- Browser Steps: scripted clicks, logins, and form fills before a page is checked, for content behind a login wall or a “load more” button
- A headless Chrome browser via Playwright (the project’s own dgtlmoon/sockpuppetbrowser image is the recommended sidecar) for JavaScript-heavy pages a plain fetch can’t render
- 85+ notification services through Apprise: Discord, Slack, Telegram, ntfy, Matrix, email, and more, unlimited alerts
- Beyond plain HTML: JSON API endpoints, RSS/Atom feeds, and PDF documents can be watched the same way as a webpage
- A full REST API for adding and querying watches programmatically instead of clicking through the UI
Installing Changedetection.io with Docker
The project’s own docker-compose.yml ships mostly commented-out, since Playwright and proxy support are optional. A working setup with the recommended headless browser sidecar for JavaScript-heavy pages looks like this:
services:
changedetection:
image: ghcr.io/dgtlmoon/changedetection.io
container_name: changedetection
hostname: changedetection
restart: unless-stopped
ports:
- 127.0.0.1:5000:5000
environment:
- PLAYWRIGHT_DRIVER_URL=ws://browser-sockpuppet-chrome:3000
volumes:
- changedetection-data:/datastore
depends_on:
- browser-sockpuppet-chrome
browser-sockpuppet-chrome:
hostname: browser-sockpuppet-chrome
image: dgtlmoon/sockpuppetbrowser:latest
cap_add:
- SYS_ADMIN
restart: unless-stopped
environment:
- MAX_CONCURRENT_CHROME_PROCESSES=10
volumes:
changedetection-data:
docker compose up -d
- Save the compose file above and run
docker compose up -d; the first start pulls both images and can take a minute. - Open
http://your-server-ip:5000and add a watch: paste a URL, then use Visual Selector to click the exact element you care about instead of the whole page. - Switch that watch’s fetch method to “Playwright” if the page relies on JavaScript, routing it through the sockpuppetbrowser sidecar.
- Under Settings → Notifications, add an Apprise URL for at least one channel before you actually need an alert.
- Set a realistic recheck interval; the UI’s 3-minute minimum is overkill for most watches, 15-60 minutes is friendlier to your server and the site you’re watching.
Hardware: The core changedetection container is light, SQLite-backed, and a Raspberry Pi or old mini PC handles dozens of plain HTTP watches without strain. The sockpuppetbrowser sidecar is what actually costs RAM, a real Chrome instance per concurrent Playwright fetch, so JavaScript-heavy watches push resource needs closer to a spare core and 1-2GB of RAM. Still deciding what to run it on? Our homelab setup guide for beginners covers the trade-offs.
License: Apache-2.0 code, with a commercial-hosting catch
This one’s worth reading carefully rather than trusting a badge. The LICENSE file at the root of the repo is a plain, unmodified Apache License 2.0, a standard OSI-approved permissive license that allows commercial use, modification, and hosting with no royalty owed to anyone.
But the same repository also carries a COMMERCIAL_LICENCE.md file that reads like a separate contract: it says any commercial “hosting” activity, broadly defined as making the software available to third parties as a service, reselling it, or folding it into a paid product, requires a paid commercial license from Web Technologies s.r.o., the company behind the project. Read literally, that conflicts with Apache-2.0, which already grants hosting and resale rights unconditionally. Users have flagged the contradiction directly to the maintainer on GitHub (issue #4237, still open as of mid-2026), suggesting a source-available license like Elastic License 2.0 would state the intent more cleanly. None of this touches a normal self-hosted homelab install, the kind covered here: you’re running your own instance for yourself, not reselling or hosting it for third parties, so Apache-2.0 applies without reservation. The friction only shows up if you plan to resell changedetection.io or host it as a service for others.
Changedetection.io: pros and cons
- Free and Apache-2.0 licensed for self-hosted use, no watch cap beyond your own hardware
- Goes well beyond plain HTML: JSON APIs, RSS/Atom feeds, and PDFs are all fair game
- Visual Selector and Browser Steps make precise, JavaScript-aware monitoring approachable without writing a scraper
- 85+ notification integrations via Apprise, plus a full REST API for automation
- JavaScript-heavy pages need the Playwright/sockpuppetbrowser sidecar, a second container and real RAM overhead, not just the core image
- The COMMERCIAL_LICENCE.md file makes the licensing story more confusing than a single MIT or Apache badge would suggest
- Aggressive check intervals against sites that don’t want to be scraped can get an IP rate-limited or blocked
- No native mobile app; notifications go through third-party services rather than a dedicated client
Alternatives worth knowing about
Visualping and Distill.io are the obvious cloud alternatives if running a server just to watch a few pages feels like overkill; both offer free tiers with limited checks, at the cost of your watched URLs living on someone else’s infrastructure. On the self-hosted side, urlwatch is a lighter, config-file-driven CLI tool with no web dashboard, worth a look if a YAML file suits you better than a browser UI. For monitoring whether a service is up rather than whether its content changed, Uptime Kuma solves a related but different problem: one tells you a site is reachable, the other tells you what changed on it.
FAQ
Is Changedetection.io really free?
Yes, self-hosting it is free under Apache-2.0, with full source on GitHub and no watch limit beyond your own hardware. An optional cloud-hosted version exists from $8.99/month for people who’d rather not run a server, but the self-hosted software isn’t crippled to push you toward it.
Do I need the Playwright sidecar for every watch?
No. Plain HTTP fetching, the default, works fine for most static or server-rendered pages and is lighter on resources. The Playwright/sockpuppetbrowser sidecar is only needed for pages that build their content with client-side JavaScript.
Is it legal to monitor any website I want?
The tool doesn’t check a site’s terms of service for you. Monitoring a public page at a reasonable interval is broadly accepted, the same category as a human refreshing a page, but scraping behind a login wall, ignoring robots.txt, or hammering a small site with aggressive intervals can cross into territory its terms of service will object to. When in doubt, prefer an official API or RSS feed over scraping HTML.
Changedetection.io earns its spot in a homelab the same way Uptime Kuma does: a small, single-purpose container that answers one question well, in this case “did this page actually change.” Pair a restock alert with n8n to turn a Discord ping into a full workflow. Our homelab setup guide for beginners covers the Docker basics it depends on, and the Monitoring category rounds out the rest of the tooling here.