# changedetection.io

Watches web pages for changes and sends alerts when the content differs.

- Replaces: [Visualping](https://openlogs.fyi/alternatives/visualping)
- Summary: Paid website change monitoring services, such as Visualping.
- Stack: Python (language)
- Deployment: docker_compose
- License: Apache-2.0 (osi) [source](https://github.com/dgtlmoon/changedetection.io/blob/be09f73c3af1bbc698d19a532ef6d3c9987e6370/LICENSE)
- Business model: unknown. The README at the pinned commit does not state a business model, so it stays unknown. ([source](https://github.com/dgtlmoon/changedetection.io/blob/be09f73c3af1bbc698d19a532ef6d3c9987e6370/README.md), read 2026-10-22)
- Difficulty: easy. 1 service, 1 volume mount, no env values to set, no elevated host access. Heuristic score 0 of 11: easy.
- Requirements: not stated
- Repository: [dgtlmoon/changedetection.io](https://github.com/dgtlmoon/changedetection.io)

## Install

1. Docker with the Compose plugin ([source](https://github.com/dgtlmoon/changedetection.io/blob/be09f73c3af1bbc698d19a532ef6d3c9987e6370/docker-compose.yml))

   ```text
   A host with Docker and the Docker Compose plugin. This entry runs from a compose file.
   ```

2. Save the compose file as docker-compose.yml ([source](https://github.com/dgtlmoon/changedetection.io/blob/be09f73c3af1bbc698d19a532ef6d3c9987e6370/docker-compose.yml))

   ```yaml
   services:
       changedetection:
         image: ghcr.io/dgtlmoon/changedetection.io
         container_name: changedetection
         hostname: changedetection
         volumes:
           - changedetection-data:/datastore
   # Configurable proxy list support, see https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration#proxy-list-support
   #        - ./proxies.json:/datastore/proxies.json
   
     #    environment:
     #        Default listening port, can also be changed with the -p option (not to be confused with ports: below)
     #      - PORT=5000
     #
     #        Log levels are in descending order. (TRACE is the most detailed one)
     #        Log output levels: TRACE, DEBUG(default), INFO, SUCCESS, WARNING, ERROR, CRITICAL
     #      - LOGGER_LEVEL=TRACE
     #
     #        Plugins! See https://changedetection.io/plugins for more plugins.
     #        Install additional Python packages (processor plugins, etc.)
     #        Example: Install the OSINT reconnaissance processor plugin
     #      - EXTRA_PACKAGES=changedetection.io-osint-processor
     #        Multiple packages can be installed by separating with spaces:
     #      - EXTRA_PACKAGES=changedetection.io-osint-processor another-plugin
     #
     #
     #       Uncomment below and the "sockpuppetbrowser" to use a real Chrome browser (It uses the "playwright" protocol)
     #      - PLAYWRIGHT_DRIVER_URL=ws://browser-sockpuppet-chrome:3000
     #      # Disable when the remote CDP implementation does not support `Page.setBypassCSP` - like with Obscura browser.
     #      - PLAYWRIGHT_BYPASS_CSP=false
     #
     #
     #       Alternative WebDriver/selenium URL, do not use "'s or 's! (old, deprecated, does not support screenshots very well, Can't handle custom headers etc)
     #      - WEBDRIVER_URL=http://browser-selenium-chrome:4444/wd/hub
     #
     #       WebDriver proxy settings webdriver_proxyType, webdriver_ftpProxy, webdriver_noProxy,
     #                                webdriver_proxyAutoconfigUrl, webdriver_autodetect,
     #                                webdriver_socksProxy, webdriver_socksUsername, webdriver_socksVersion, webdriver_socksPassword
     #
     #             https://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.common.proxy
     #
     #
     #       Playwright proxy settings playwright_proxy_server, playwright_proxy_bypass, playwright_proxy_username, playwright_proxy_password
     #
     #             https://playwright.dev/python/docs/api/class-browsertype#browser-type-launch-option-proxy
     #
     #        Plain requests - proxy support example.
     #      - HTTP_PROXY=socks5h://10.10.1.10:1080
     #      - HTTPS_PROXY=socks5h://10.10.1.10:1080
     #
     #        An exclude list (useful for notification URLs above) can be specified by with
     #      - NO_PROXY="localhost,192.168.0.0/24"
     #
     #        Base URL of your changedetection.io install (Added to the notification alert)
     #      - BASE_URL=https://mysite.com
     #        Respect proxy_pass type settings, `proxy_set_header Host "localhost";` and `proxy_set_header X-Forwarded-Prefix /app;`
     #        More here https://github.com/dgtlmoon/changedetection.io/wiki/Running-changedetection.io-behind-a-reverse-proxy
     #      - USE_X_SETTINGS=1
     #
     #        Hides the `Referer` header so that monitored websites can't see the changedetection.io hostname.
     #      - HIDE_REFERER=true
     #        
     #        Default number of parallel/concurrent fetchers
     #      - FETCH_WORKERS=10
     #
     #        Absolute minimum seconds to recheck, overrides any watch minimum, change to 0 to disable
     #      - MINIMUM_SECONDS_RECHECK_TIME=3
     #
     #        Cap the total number of watches this instance will hold - adding more (UI, API, import)
     #        is refused until one is deleted. Unset means unlimited.
     #      - PAGE_WATCH_LIMIT=100
     #
     #        If you want to watch local files file:///path/to/file.txt (careful! security implications!)
     #      - ALLOW_FILE_URI=False
     #
     #        Off by default - Private lan, local-only, testing/documentation, multicast, protocol infrastructure, and ranges intentionally not usable as normal public unicast IPs
     #      - ALLOW_IANA_RESTRICTED_ADDRESSES=true
     #
     #        For complete privacy if you don't want to use the 'check version' / telemetry service
     #      - DISABLE_VERSION_CHECK=true
     #
     #        Disable all LLM / AI features, prompts etc
     #      - LLM_FEATURES_DISABLED=true
     #
     #        How much of the page text the AI reads when finding the price/stock, default 15000 characters.
     #        Raise it if the price is missed (some shops put it far down the page).
     #        Using a local model (Ollama)? It may only read the first part unless you raise its context size
     #        (num_ctx) to about 8192 or more, otherwise it can miss the price.
     #        In Ollama: run `ollama run <model>` then `/set parameter num_ctx 8192`
     #      - LLM_RESTOCK_MAX_CONTENT_CHARS=15000
     #
     #        Fetch the latest LLM model pricing (used for the estimated cost counter) from GitHub, default false.
     #        When false the pricing list that ships with this version is used, so no outbound request is made. (Off by default for privacy)
     #      - LITELLM_FETCH_PRICING_FROM_GITHUB=false
     #
     #        A valid timezone name to run as (for scheduling watch checking) see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
     #      - TZ=America/Los_Angeles
     #
     #        Text processing locale, en_US.UTF-8 used by default unless defined as something else here, UTF-8 should cover 99.99% of cases.
     #      - LC_ALL=en_US.UTF-8
     #
     #        Maximum height of screenshots, default is 20000 px, screenshots will be clipped to this if exceeded.
     #        RAM usage will be higher if you increase this.
     #      - SCREENSHOT_MAX_HEIGHT=20000
     #
     #        HTTPS SSL Mode for webserver, unset both of these, you may need to volume mount these files also.
     #        ./cert.pem:/app/cert.pem and ./privkey.pem:/app/privkey.pem
     #      - SSL_CERT_FILE=cert.pem
     #      - SSL_PRIVKEY_FILE=privkey.pem
     #
     #        LISTEN_HOST / "host", Same as -h
     #      - LISTEN_HOST=::
     #      - LISTEN_HOST=0.0.0.0
   
     
         # Comment out ports: when using behind a reverse proxy , enable networks: etc.
         # Mac users! Use "127.0.0.1:5050:5000" (port 5050) so theres no conflict with Airplay etc. (https://github.com/dgtlmoon/changedetection.io/issues/3401)
         ports:
           - 127.0.0.1:5000:5000
         restart: unless-stopped
   
        # Used for fetching pages via WebDriver+Chrome where you need Javascript support.
        # Now working on arm64 (needs testing on rPi - tested on Oracle ARM instance)
        # replace image with seleniarm/standalone-chromium:4.0.0-20211213
        
        # If WEBDRIVER or PLAYWRIGHT are enabled, changedetection container depends on that
        # and must wait before starting (substitute "browser-chrome" with "playwright-chrome" if last one is used)
   #      depends_on:
   #          browser-sockpuppet-chrome:
   #              condition: service_started
   
   
        # Sockpuppetbrowser is basically chrome wrapped in an API for allowing fast fetching of web-pages.
        # RECOMMENDED FOR FETCHING PAGES WITH CHROME, be sure to enable the "PLAYWRIGHT_DRIVER_URL" env variable in the main changedetection container
   #    browser-sockpuppet-chrome:
   #        hostname: browser-sockpuppet-chrome
   #        image: dgtlmoon/sockpuppetbrowser:latest
   #        cap_add:
   #            - SYS_ADMIN
   ## SYS_ADMIN might be too much, but it can be needed on your platform https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md#running-puppeteer-on-gitlabci
   #        restart: unless-stopped
   #        environment:
   #            - SCREEN_WIDTH=1920
   #            - SCREEN_HEIGHT=1024
   #            - SCREEN_DEPTH=16
   #            - MAX_CONCURRENT_CHROME_PROCESSES=10
   
        # Used for fetching pages via Playwright+Chrome where you need Javascript support.
        # Note: Works well but is deprecated, does not fetch full page screenshots (doesnt work with Visual Selector)
        #       Does not report status codes (200, 404, 403) and other issues
   #    browser-selenium-chrome:
   #        hostname: browser-selenium-chrome
   #        image: selenium/standalone-chrome:4
   #        environment:
   #            - VNC_NO_PASSWORD=1
   #            - SCREEN_WIDTH=1920
   #            - SCREEN_HEIGHT=1080
   #            - SCREEN_DEPTH=24
   #          CHROME_OPTIONS: |
   #            --window-size=1280,1024
   #            --headless
   #            --disable-gpu
   #        volumes:
   #            # Workaround to avoid the browser crashing inside a docker container
   #            # See https://github.com/SeleniumHQ/docker-selenium#quick-start
   #            - /dev/shm:/dev/shm
   #        restart: unless-stopped
   
   volumes:
     changedetection-data:
   ```

3. Start it ([source](https://github.com/dgtlmoon/changedetection.io/blob/be09f73c3af1bbc698d19a532ef6d3c9987e6370/docker-compose.yml))

   ```bash
   docker compose up -d
   ```

4. Open the app ([source](https://github.com/dgtlmoon/changedetection.io/blob/be09f73c3af1bbc698d19a532ef6d3c9987e6370/docker-compose.yml))

   ```text
   Open http://localhost:5000. The compose file publishes host port 5000 for the changedetection service.
   ```

Compose file check: config_ok on 2026-10-22.

## Gotchas and maintenance

### Gotchas

- Some images use the latest tag or no tag: Images without a pinned version: changedetection: ghcr.io/dgtlmoon/changedetection.io (no tag). A later pull can get a different version. ([source](https://github.com/dgtlmoon/changedetection.io/blob/be09f73c3af1bbc698d19a532ef6d3c9987e6370/docker-compose.yml), checked 2026-10-22)
- The compose file publishes host ports: Host ports: 127.0.0.1:5000 (changedetection). ([source](https://github.com/dgtlmoon/changedetection.io/blob/be09f73c3af1bbc698d19a532ef6d3c9987e6370/docker-compose.yml), checked 2026-10-22)

### Signals

Computed from a GitHub snapshot taken 2026-10-22.

- Open issues and pull requests: 404
- Stars: 35202, forks: 2174
- Last push: 2026-10-19 (2 days ago)
- Latest release: 0.60.9 on 2026-10-12 (9 days ago)

## Sources

- [Repository: https://github.com/dgtlmoon/changedetection.io](https://github.com/dgtlmoon/changedetection.io)
- [License: https://github.com/dgtlmoon/changedetection.io/blob/be09f73c3af1bbc698d19a532ef6d3c9987e6370/LICENSE](https://github.com/dgtlmoon/changedetection.io/blob/be09f73c3af1bbc698d19a532ef6d3c9987e6370/LICENSE)
- [Business model: https://github.com/dgtlmoon/changedetection.io/blob/be09f73c3af1bbc698d19a532ef6d3c9987e6370/README.md](https://github.com/dgtlmoon/changedetection.io/blob/be09f73c3af1bbc698d19a532ef6d3c9987e6370/README.md)
- [Compose file: https://github.com/dgtlmoon/changedetection.io/blob/be09f73c3af1bbc698d19a532ef6d3c9987e6370/docker-compose.yml](https://github.com/dgtlmoon/changedetection.io/blob/be09f73c3af1bbc698d19a532ef6d3c9987e6370/docker-compose.yml)

---
Canonical: https://openlogs.fyi/tools/changedetection-io  
Last updated: 2026-10-22
