Running a website change monitor in Docker, and when to stop
Starting the changedetection.io container takes one command. Keeping it useful takes backups, proxies, a browser service and selector repairs.
By ClaudeGPT Si Newsroom, Editorial team
3 min read
Search for a website change monitor docker image and you land on changedetection.io almost every time. It is the most popular open source option, and its container is easy to start. This guide covers what running it in Docker actually involves, what keeps costing you time after day one, and when a hosted monitor like AyeWatch is the better call.
Getting the container up
The project publishes images on Docker Hub (dgtlmoon/changedetection.io) and on GitHub's registry. There are two common ways to run it.
With Docker Compose, clone the repository and run:
docker compose up -d
Or as a single container:
docker run -d --restart always -p "127.0.0.1:5000:5000" -v datastore-volume:/datastore --name changedetection.io dgtlmoon/changedetection.io
That binds the web UI to port 5000 on localhost and keeps your watches in a named volume. Open the UI, paste a URL, and the basic monitor is working within minutes.
Adding a browser for JavaScript pages
Plain fetches miss content that a page builds with JavaScript. For those, the Compose file includes a browser service, sockpuppetbrowser, that you uncomment. Once it is running, you get the Visual Selector for picking elements by clicking, and Browser Steps for logging in, filling fields or pressing buttons before the check. The same browser setting is where you adjust the viewport size if a site serves a different layout to small screens.
Updating it
Updates are a pull and a restart:
docker compose pull && docker compose up -d
Simple enough, but it is on you to remember, and on you to read the changelog when a release changes behaviour.
The work that does not show up in the README
The container is the easy part. The ongoing cost lives elsewhere:
- Exposure. The example binds to 127.0.0.1 for a reason. If you want to reach the UI from your phone, you now need a reverse proxy, TLS and some form of login in front of it.
- Backups. Your watch history lives in that volume. If the host dies without a backup, so does the history.
- Proxies. Some sites block data centre addresses. changedetection.io supports a proxy per watch, but sourcing and paying for those proxies is your job.
- Selectors. When a watched site redesigns, the CSS or XPath you wrote stops matching, and the watch goes quiet or noisy until you notice.
- Noise. Timestamps, view counters and rotating content need their own ignore rules. You can connect an LLM to filter changes by intent, but that is another key or local model to run.
None of this is hard. It is just recurring, and recurring chores are exactly what a monitoring tool was supposed to remove.
When to stop running the container
There are good reasons to keep self-hosting. If watch data must stay on your own hardware, or you depend on Browser Steps to get past a login, the container earns its place. The project's own hosted plan, $8.99 a month for up to 5,000 URLs with a Chrome browser and proxies included, is also a sensible middle step.
If what you really want is to know when a page changes in a way you care about, AyeWatch is the cleaner answer. There is nothing to deploy. You paste one or more URLs into a monitor and write the change you care about as a sentence, for example "tell me when a new release is tagged or the install instructions change". AyeWatch reads each new version of the page, checks it against that sentence, and sends a short summary only when it matches. Selectors and ignore lists go away, so a redesign does not break the watch.
For developers, paid plans include a REST API, HMAC-signed webhooks and an MCP server, so you can create monitors from a script or from your coding assistant. Alerts can go to Slack, Discord, email or push on iOS and Android.
Paid plans start at $9 a month, and a Free Preview with three runs lets you test it without a card.
A practical split
Many developers keep a small container for the few logged-in pages that need Browser Steps and move everything public to AyeWatch. The comparison of the two tools is a quick way to decide which of your watches belong where.