← All articles
MONITORING Self-Hosting Changedetection.io: Monitor Any Website... 2026-02-08 · changedetection · website-monitoring · notifications

Self-Hosting Changedetection.io: Monitor Any Website for Changes

Monitoring 2026-02-08 changedetection website-monitoring notifications automation monitoring

You're watching a product page for a price drop. Or monitoring a government website for policy updates. Or waiting for a job posting to appear. You could check manually every day — or you could let a self-hosted tool do it.

Changedetection.io monitors web pages and notifies you when something changes. It's like a personal web scraper that watches pages for you and sends alerts via email, Slack, Discord, Telegram, or dozens of other channels.

What Changedetection.io Does

At its core, changedetection.io:

  1. Fetches a web page at regular intervals
  2. Compares the current version to the previous version
  3. Highlights what changed (additions, removals, modifications)
  4. Sends you a notification if something changed

It handles the complexity that makes this harder than it sounds:

Changedetection.io vs. Alternatives

Feature Changedetection.io Visualping Distill.io
Self-hosted Yes No No (browser ext.)
Free tier Unlimited (self-hosted) 5 pages 25 checks/month
JavaScript support Yes (via Playwright) Yes Yes
Visual diff Yes Yes Limited
CSS/XPath filters Yes No Yes
Notification channels 90+ (via Apprise) Email, Slack Email, SMS
API Yes Yes No
Check frequency Any (1 min+) 5 min+ (paid) 5 min+
Cost Free + hardware $10+/mo $15+/mo

Why self-host

The free tiers on commercial services are extremely limited. Changedetection.io lets you monitor unlimited pages at any frequency you want, with no restrictions.

Self-Hosting Changedetection.io: Setup

Server requirements

Docker Compose setup

Basic setup (HTML pages only):

version: "3.8"

services:
  changedetection:
    container_name: changedetection
    image: ghcr.io/dgtlmoon/changedetection.io:latest
    ports:
      - "5000:5000"
    volumes:
      - changedetection-data:/datastore
    environment:
      BASE_URL: "http://your-server:5000"
    restart: always

volumes:
  changedetection-data:

Full setup (with JavaScript rendering via Playwright):

version: "3.8"

services:
  changedetection:
    container_name: changedetection
    image: ghcr.io/dgtlmoon/changedetection.io:latest
    ports:
      - "5000:5000"
    volumes:
      - changedetection-data:/datastore
    environment:
      PLAYWRIGHT_DRIVER_URL: "ws://playwright-chrome:3000"
      BASE_URL: "http://your-server:5000"
    depends_on:
      - playwright-chrome
    restart: always

  playwright-chrome:
    container_name: playwright-chrome
    image: browserless/chrome:latest
    restart: always
    environment:
      SCREEN_WIDTH: 1920
      SCREEN_HEIGHT: 1080
      MAX_CONCURRENT_SESSIONS: 5

volumes:
  changedetection-data:

Starting the service

docker compose up -d

Access the web interface at http://your-server:5000.

Adding Your First Watch

  1. Click Add Watch in the top-right
  2. Enter the URL you want to monitor
  3. Set the check interval (e.g., every 30 minutes)
  4. Click Save

Changedetection.io will fetch the page immediately and set it as the baseline. On subsequent checks, it compares the new version against the previous and flags changes.

Filtering with CSS selectors

Most pages have headers, footers, ads, and other noise that changes constantly. Use CSS selectors to watch only what matters:

Set the CSS filter in the watch settings under Filters & TriggersCSS/JSON/XPath Filter.

XPath filtering

For more precise targeting:

//div[@class="price"]/span
//table[@id="results"]//tr
//*[contains(@class, "status")]

Text filtering

You can also filter by text content:

Notification Setup

Changedetection.io uses Apprise for notifications, which supports 90+ services out of the box.

Common notification URLs

Email (SMTP):

mailto://user:[email protected][email protected]

Slack:

slack://tokenA/tokenB/tokenC/#channel

Discord:

discord://webhook_id/webhook_token

Telegram:

tgram://bot_token/chat_id

Gotify:

gotify://your-server:8080/app_token

ntfy:

ntfy://your-server/topic

Set notifications globally (for all watches) in SettingsNotification URL, or per-watch for targeted alerts.

Notification content

Notifications include:

Practical Use Cases

Price monitoring

Watch product pages for price drops:

  1. Add the product URL
  2. Set a CSS filter for the price element (e.g., span.price)
  3. Set check frequency to every hour
  4. Optionally set a trigger — only notify if the price contains a specific pattern

Job board monitoring

Watch company career pages:

  1. Add the careers/jobs page URL
  2. Filter to the job listings container
  3. Check every 30 minutes
  4. Get notified when new positions appear

Government and regulatory changes

Monitor government websites for policy updates, license status changes, or filing confirmations:

  1. Add the relevant page URL
  2. Use JavaScript fetching if the page requires it
  3. Filter to the status/content area
  4. Check every few hours

Competitor monitoring

Track changes on competitor websites:

Stock and availability

Monitor product availability:

  1. Add the product page
  2. Filter to the "add to cart" or availability status element
  3. Set high-frequency checks (every 5-15 minutes)
  4. Get notified when it changes from "out of stock" to "available"

Advanced Features

Visual diffing

For pages where text extraction doesn't capture the changes well:

  1. Enable Visual Diff in watch settings
  2. Changedetection.io takes screenshots and compares them pixel-by-pixel
  3. Changed regions are highlighted in the diff view

This requires the Playwright browser and uses more resources.

JSON API monitoring

Changedetection.io can monitor JSON APIs directly:

  1. Set the fetch method to the API URL
  2. Use JSONPath filters (e.g., $.data.price or $.results[0].status)
  3. Get notified when specific JSON values change

This is useful for monitoring APIs that serve data you care about.

Triggers and conditions

Instead of notifying on every change, set conditions:

Proxies

For pages that block frequent automated access:

environment:
  HTTP_PROXY: "http://proxy:8080"
  HTTPS_PROXY: "http://proxy:8080"

Or configure per-watch proxies in the settings.

Reverse Proxy Setup

Caddy:

changes.yourdomain.com {
    reverse_proxy localhost:5000
}

Nginx:

server {
    server_name changes.yourdomain.com;

    location / {
        proxy_pass http://localhost:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Authentication

Changedetection.io has built-in password protection:

  1. Go to SettingsGeneral
  2. Set a password
  3. All access to the web interface will require the password

For additional security behind a reverse proxy, add HTTP basic auth or use an auth provider like Authelia.

Resource Management

Managing check frequency

Be considerate with check frequency:

Cleaning up history

Over time, change history accumulates. Manage it in Settings:

Honest Trade-offs

Changedetection.io is great if you:

Consider commercial alternatives if you:

Consider writing custom scripts if you:

The bottom line: Changedetection.io solves a common problem — "tell me when this page changes" — with a clean UI and impressive flexibility. The Playwright integration handles JavaScript-heavy sites that simpler tools can't, and the Apprise notification system means you can get alerts wherever you want them. For personal and small-team use, it's the best self-hosted option available.