LIVEReading: Monitor Any Website for Changes — Free & Self-HostedTotal time: 10 minSteps: 6Worked first time: 85% LIVEReading: Monitor Any Website for Changes — Free & Self-HostedTotal time: 10 minSteps: 6Worked first time: 85%
CBW
Monitor Any Website for Changes — Free & Self-Hosted
Easygithub.com/dgtlmoon/changedetection.io2026-06-22

Monitor Any Website for Changes — Free & Self-Hosted

Run changedetection.io on your own computer using Docker. Add any URL and get notified by email, Discord, Slack, or Telegram the moment that page changes.

// Build stats

  • Total time10 min
  • Number of steps6
  • DifficultyEasy
  • Worked first time85%
// Before you start

What you need

  • Docker Desktop installed and running (docker.com/products/docker-desktop)
  • A terminal / command prompt (PowerShell on Windows, Terminal on Mac/Linux)
  • A web browser
  • An email or messaging account for notifications (optional but recommended)
01
Step 1 of 6

Pull and start changedetection.io

3 min

This single command downloads the changedetection.io image and starts it in the background. Your watch data is saved in a folder called 'datastore' inside the current directory, so it survives restarts. Port 5000 is where the web UI will live.

Terminal · mac
$ docker run -d --restart unless-stopped -p 5000:5000 -v $(pwd)/datastore:/datastore --name changedetection dgtlmoon/changedetection.io
What you should see
A long container ID printed on one line, e.g. 3f8a2c1d9e... — no errors.
This might happen

On Windows PowerShell, $(pwd) may not expand correctly.

Replace $(pwd) with the full path, e.g. C:\Users\YourName\datastore — use forward slashes: C:/Users/YourName/datastore

02
Step 2 of 6

Open the web UI and set a password

2 min

Once the container is running, open your browser and go to the address below. The first thing you should do is set a password so no one else on your network can access your watch list. Click Settings → General → then set a password under 'Shared Secret / Password'.

Terminal · mac
$ http://localhost:5000
What you should see
The changedetection.io dashboard loads — a clean page with an 'Add a new watch' field at the top.
This might happen

Page refuses to load or shows 'connection refused'.

Run 'docker ps' and confirm the container status says 'Up'. If it says 'Exited', run 'docker logs changedetection' to see the error.

03
Step 3 of 6

Add your first URL to watch

2 min

Paste any public webpage URL into the 'Add a new watch' box at the top of the dashboard and click 'Watch'. changedetection.io will fetch the page immediately and store a baseline snapshot. Every future check is compared against this baseline — any difference triggers an alert.

Terminal · mac
$ Paste your URL into the 'Add a new watch' field, then click the blue Watch button.
What you should see
Your URL appears in the watch list with a status of 'Fetching...' then 'OK'. The 'Last checked' column updates within a minute.
This might happen

Status shows 'Error' or a red icon.

The site may block simple HTTP requests. Click the watch row → Edit → Fetching tab → switch Request method to 'Chrome/JS via Playwright' (requires the Playwright container — see Step 4).

04
Step 4 of 6

Add Playwright for JavaScript-heavy sites (optional)

5 min

Many modern sites load content via JavaScript, which the default fetcher cannot see. Adding the Playwright container gives changedetection.io a real Chrome browser to use. Stop the current container first, then run both containers together with Docker Compose. Create a file called docker-compose.yml with the content shown, then start it.

Terminal · mac
$ docker stop changedetection && docker rm changedetection
$
$ curl -o docker-compose.yml https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/docker-compose.yml
$
$ docker compose up -d
What you should see
'docker compose up -d' prints several lines ending with 'Started'. Running 'docker ps' shows two containers: changedetection and playwright-chrome.
This might happen

curl is not available on Windows.

Open the URL in your browser, save the file manually as docker-compose.yml in your current folder, then run 'docker compose up -d'.

05
Step 5 of 6

Set up notifications

5 min

Go to Settings → Notifications. changedetection.io uses the Apprise library, which supports 80+ services via a simple URL format. Paste one of the example URLs below, replacing the placeholders with your real credentials. You can add multiple notification URLs, one per line.

Terminal · mac
$ Discord: discord://webhook_id/webhook_token
$ Email: mailto://user:password@gmail.com?to=you@example.com
$ Slack: slack://TokenA/TokenB/TokenC/Channel
$ Telegram: tgram://bottoken/ChatID
$
$ Full Apprise URL list: https://github.com/caronc/apprise/wiki
What you should see
After saving, click 'Send test notification' — you should receive a test message in your chosen service within seconds.
This might happen

Gmail blocks the login and the test email never arrives.

Use an App Password (not your main Gmail password). Create one at myaccount.google.com → Security → App Passwords.

06
Step 6 of 6

Tune what counts as a change

3 min

By default, any text difference triggers an alert — including ads, timestamps, and cookie banners. Click a watch row → Edit → Filters & Triggers tab. Use 'CSS/xPath Selector' to target only the part of the page you care about (e.g. a price element), or add words to 'Ignore text' to suppress known noise. Set the check interval under the 'General' tab — the default is 24 hours.

Terminal · mac
$ No command needed — all done in the browser UI at http://localhost:5000
What you should see
After saving, the watch shows 'Recheck' and then 'OK'. Future alerts will only fire for the content you targeted.
This might happen

Not sure what CSS selector to use for a price or element.

In Chrome, right-click the element on the page → Inspect → right-click the highlighted HTML → Copy → Copy selector. Paste that into the CSS Selector field.

// Status

cooked. baked. worked.

A self-hosted dashboard at localhost:5000 that monitors any list of URLs, emails or messages you the moment something changes, and stores a full diff history you can browse any time.

// the honest bit

The honest part

changedetection.io runs on your machine, so it only checks pages while your computer (or server) is on. For 24/7 monitoring you need to run it on an always-on machine like a Raspberry Pi, a cheap VPS, or use their $8.99/month hosted plan. JavaScript-heavy sites (SPAs, login-walled pages) need the Playwright container and are harder to target precisely. AI-powered summaries (e.g. 'price dropped from $89 to $67') require connecting your own OpenAI/Gemini/Ollama API key in Settings → AI — this is not free. The hosted SaaS plan includes AI and Playwright out of the box.