English
Get started

← All templates · Analytics and monitoring

Deploy changedetection.io in one click

Watches web pages and tells you when they change: prices, restocks, news

A self-hosted alternative to Visualping and Distill.io.

What is changedetection.io?

changedetection.io watches web pages and tells you when they change. People use it for price drops and products back in stock, job openings, government notices, release notes and documents that change without a word, in place of Visualping or Distill.io. Each watch checks its page on a schedule, every three hours unless you set another, and shows what changed word by word, line by line or character by character.

It can watch only the part of a page that matters, picked by a CSS selector, XPath or, for JSON, JSONPath or jq, and trigger on a text, ignore another, or follow a product’s price and stock. It reads PDF files too. Alerts go to more than 85 services through Apprise, such as email, Telegram, Discord, Slack and ntfy, and every change is also in an RSS feed.

This template runs changedetection.io with its plain, fast fetcher, its data in a volume and the password you give from the first start, so its page is never open to anyone. It fetches pages as they are sent: the Visual Selector, Browser Steps and pages whose text is drawn by JavaScript need a Chrome fetcher, which the template leaves out to stay light.

Hosting changedetection.io on Pethost

  1. You sign in to Pethost with a passkey, GitHub or Google. No machine yet? You pick a plan, and the link waits until it is ready.
  2. New project opens at changedetection.io. You fill in what it asks for and click Create project: Password.
  3. In a minute or two changedetection.io is live at its own address with HTTPS. Its secrets are made at random, and its data is in the nightly backup.
  4. It is a project like any other: you or your agent can change it, roll it back or restore it.

Questions about changedetection.io

Is changedetection.io free?

Yes. changedetection.io is open source under the Apache 2.0 license, and running it yourself costs only the server. Its makers also sell a hosted version for $8.99 a month, with Chrome and proxies included.

How do I get alerts on Telegram, Discord or email?

Add a notification URL under Settings → Notifications: changedetection.io sends through Apprise, which knows more than 85 services, written as URLs such as tgram://, discord:// or mailto://. A watch can have its own URLs too, in its Notifications tab.

Can changedetection.io track prices and restocks?

Yes. Choose Re-stock & Price detection when you add a product page: it reads the price and stock from the page’s data and alerts you when the price goes under or over a limit, changes by a share you set, or the product is back in stock.

Why does a page come through empty or without its content?

Some pages draw their text with JavaScript after they load, and this template fetches pages as the server sends them. Watch the site’s RSS feed, JSON API or a page that holds the text instead, or add a Chrome fetcher such as sockpuppetbrowser to the compose file and point PLAYWRIGHT_DRIVER_URL at it.

How do I watch only one part of a page?

In the watch’s Edit page, under Filters & Triggers, give a CSS selector or an XPath for the part you care about, and lines of text to ignore. Only changes inside it count, so a clock or an advert elsewhere on the page sets nothing off.

How much memory and disk does changedetection.io need?

changedetection.io is light: about 60 MB of memory, and each watch keeps a compressed copy of the page each time it changes, so its data grows by kilobytes a check that finds a change. On Pethost the Starter plan is enough for it, with room for other apps beside it.

changedetection.io Docker Compose file

The template is this compose.yaml and the variables written into the project’s .env as it is created. Pethost runs the file as it is written.

Containers: changedetection (dgtlmoon/changedetection.io:0.60).

Volumes, in the nightly backup: datastore.

services:
  changedetection:
    image: dgtlmoon/changedetection.io:0.60
    restart: unless-stopped
    environment:
      BASE_URL: ${URL}
      ADMIN_PASSWORD: ${ADMIN_PASSWORD}
      # The sites watched do not see this address as the referrer of each check.
      HIDE_REFERER: "true"
    # changedetection.io has one password and none at first, so its page would be open to anyone
    # until it is set. SALTED_PASS gives it the password from the first start, salted and hashed as
    # changedetection.io stores one; its settings cannot remove it.
    command:
      - sh
      - -c
      - |
        SALTED_PASS=$$(python3 -c '
        import base64, hashlib, os
        salt = os.urandom(32)
        key = hashlib.pbkdf2_hmac("sha256", os.environ["ADMIN_PASSWORD"].encode(), salt, 100000)
        print(base64.b64encode(salt + key).decode())
        ') || exit 1
        export SALTED_PASS
        unset ADMIN_PASSWORD
        exec python ./changedetection.py -d /datastore
    volumes:
      - datastore:/datastore

volumes:
  datastore:

More in Analytics and monitoring