Deployment guide

Self-host Changedetection.io on a VPS: monitor any website

Deploy on a VPS Cloud →

Tutorial

Self-host Changedetection.io on a VPS: monitor any website

Self-hosting9 min read10 steps

Manually tracking competitor prices, restock alerts, public tenders, and contract updates is exhausting. Changedetection.io (Apache 2.0, 24k+ stars) does it automatically: it watches any URL and fires a notification the moment something changes — via email, Telegram, Slack, Discord, ntfy, or 80+ other channels. Here is how to deploy it on a ServOrbit VPS in minutes, and how to keep it updated without risking a regression.

Contents· Why self-host a website change detection tool1/7
  1. 01Why self-host a website change detection tool
  2. 02What you get with a self-hosted Changedetection.io
  3. 03Prerequisites
  4. 04Deploy Changedetection.io on your VPS
  5. 05Practical use cases for developers and SMBs
  6. 06Active regressions in v0.60.2 — what you need to know
  7. 07Updating Changedetection.io safely — and pinning a version

Why self-host a website change detection tool

SaaS change detection services charge per check, cap the number of monitored URLs, and route your watched content through their servers. Changedetection.io reverses the model: you run it on your VPS, monitor without limit URLs at any frequency, and all data stays on your infrastructure.

Because it relies on file-based storage with no external database, the overhead is minimal — the container uses under 256 MB of RAM at idle and starts in under 10 seconds. Snapshots of every watched page are stored locally in a Docker volume mounted at /datastore: your data never leaves your server, even for pages behind authentication.

Add a Playwright/Chromium sidecar for JavaScript-rendered pages and you get full-browser fidelity for SPAs, order counters, and dynamically loaded price elements — things a plain HTTP request can never see.

What you get with a self-hosted Changedetection.io

  • Monitor any number of URLs — product pages, tender portals, competitor sites, job boards — at any check interval.
  • CSS selector, XPath, and keyword filters — watch only the element you care about, not the whole page.
  • 80+ notification channels via Apprise: email (SMTP), Telegram, Slack, Discord, ntfy, Gotify, Matrix, webhooks, and more.
  • Optional Playwright/Chromium sidecar for JavaScript-rendered pages — rendered in a real browser, not a plain HTTP client.
  • Full diff viewer — see exactly what changed, highlighted in context, with a history of previous snapshots.
  • Scheduled checks with jitter — from every minute to every 24 hours; randomized timing avoids bot-detection heuristics.
  • Single Docker container, file-based storage, under 256 MB of RAM — no external dependencies.
  • Apache 2.0 license — no per-check fees, no cloud account, no telemetry.

Prerequisites

A ServOrbit VPS running Ubuntu 24.04 with at least 1 GB of RAM. Changedetection.io alone uses under 256 MB at idle; if you add the Playwright sidecar, plan for 2 GB total.

Docker and Docker Compose are provisioned automatically when you deploy via the ServOrbit marketplace. No domain name is required — the web interface is reachable directly on port 5000, but placing it behind an HTTPS reverse proxy is recommended for long-running deployments.

A note on which version to deploy. The latest tag follows the most recent published tag on GitHub. Since v0.60.2 shipped on 2 September 2026, two active regressions affect that tag (see the dedicated section below). If you are deploying today without having read the troubleshooting section, explicitly pin dgtlmoon/changedetection.io:0.55.8 in your docker-compose.yml until the patch lands.

Deploy Changedetection.io on your VPS

  1. One-click deployment from the ServOrbit marketplace

    Open your ServOrbit control panel, go to Marketplace → Monitoring & Observability → Changedetection.io, then click Deploy. Docker pulls dgtlmoon/changedetection.io:latest and starts the container. The web interface is available on port 5000 in under 10 seconds — no account creation, no initial configuration required.

  2. Add your first URL to monitor

    Go to http://<your-vps-ip>:5000. Click the blue + button in the top right, paste the URL you want to watch — a product page, job listing, public portal — then click Watch. Changedetection.io immediately fetches the page and saves it as the baseline. The next check is scheduled according to your default interval (minutes or hours).

  3. Add a filter to isolate the element you care about

    Without a filter, Changedetection.io detects any change on the page — including ad banners, timestamps, and navigation updates. To focus only on a price or stock field, open the watch settings (pencil icon), go to the Filters tab, and enter a CSS selector like .price, #stock-status, or span.availability. You can also use XPath expressions or a keyword trigger (alert only when the text "In stock" appears or disappears).

  4. Configure a notification channel

    Open watch settings → Notifications tab. Changedetection.io uses Apprise for notifications. To send a Telegram message, enter tgram://bottoken/chatid. For email, use mailto://user:[email protected]. For Slack, use the webhook URL format slack://tokenA/tokenB/tokenC. You can stack multiple channels — price drops, for example, can go to Telegram for instant mobile delivery and also be logged to a webhook for your monitoring dashboard.

  5. Enable Playwright for JavaScript-rendered pages (optional)

    If the page you want to monitor is a React or Vue SPA, or loads its price counter asynchronously, a plain HTTP request will only see an empty shell. To enable Playwright support, add a second container — browserless/chrome or playwright-stealth — alongside Changedetection.io in a Docker Compose file, and set the PLAYWRIGHT_DRIVER_URL environment variable to point to it. In the watch settings, switch the Fetch Backend to playwright. Changedetection.io will then launch a headless browser, wait for the page to render, and snapshot the live DOM.

  6. First login

    Changedetection.io opens directly on the watch list with no account or credentials: you can add your first URL right away. First thing to do next: open Settings → General and set a password.

Practical use cases for developers and SMBs

Changedetection.io covers a surprisingly wide range of automation needs beyond simple "restock alerts".

Competitive intelligence: watch a competitor's pricing page with a CSS selector targeting the price table. As soon as a column changes — monthly billing switching to annual, a new enterprise tier added — you are notified in real time, with no manual site visits.

Software version tracking: set up a watch on the GitHub Releases page of a tool you depend on. A keyword filter on v or Release and a Slack notification: you will never miss a critical security update again.

Public tenders and procurement: tender portals publish their awards at unpredictable times. Watching the results page with an hourly check saves multiple manual logins per day.

E-commerce restock alerts: a CSS filter on .in-stock, a 15-minute interval, and an ntfy notification on your phone — enough to catch any restock of an out-of-stock item.

Any URL, any element, any notification channel — the combination of CSS filters, keyword triggers, and Apprise's 80+ backends makes it a genuinely composable monitoring primitive.

Active regressions in v0.60.2 — what you need to know

Version 0.60.2, released on 2 September 2026, introduces two simultaneous regressions documented in the GitHub tracker:

Regression 1 — "Recheck" button returns HTTP 404 (issue #4369). A security hardening pass converted a GET endpoint to POST-only without creating the corresponding POST handler. The manual recheck button fails on every call. A workaround is available if you use Traefik as a reverse proxy: add the environment variable SOCKETIO_CORS_ORIGINS=https://<your-domain> to the container. A PR (#4370) was opened on the same day by the team; it had not been merged as of 5 September 2026.

Regression 2 — "Time Between Check" stops triggering after the update (issue #4368). The scheduled check interval no longer executes after upgrading to 0.60.2. Existing watches appear active in the UI but trigger no automatic checks. The manual Recheck button would be the only workaround — but it is itself broken by regression 1.

Recommendation: stay on v0.55.8 or roll back to it if you have already updated, until a 0.60.x patch that fixes both issues is released. The next section details the safe update procedure with version pinning.

Updating Changedetection.io safely — and pinning a version

  1. Never use the `latest` tag in production

    The latest tag automatically tracks the most recently published tag on Docker Hub. A silent update (Docker Watchtower, automatic pull on restart) can therefore introduce a regression without your knowledge. Always pin an explicit version in your docker-compose.yml:

    services:
      changedetection:
        image: dgtlmoon/changedetection.io:0.55.8

    Update the version manually and deliberately, after reviewing the GitHub changelog and the open issues for the target tag.

  2. Back up the datastore before any update

    All configuration and snapshot history lives in the volume mounted at /datastore. Before changing versions:

    docker compose stop changedetection
    cp -r /opt/changedetection/datastore /opt/changedetection/datastore.bak-$(date +%Y%m%d)

    This copy lets you roll back to the previous state in case of issues, without losing your watch rules or snapshot history.

  3. Update to a specific version

    Edit your docker-compose.yml to point to the new tag, then pull the image and restart:

    docker compose pull changedetection
    docker compose up -d changedetection

    Verify that the version shown in Settings → General matches the one you pinned. If something does not work — Recheck button broken, scheduled checks stopping — you have your backup to roll back immediately.

  4. Rolling back from v0.60.2 to v0.55.8

    If you have already updated to 0.60.2 and are observing the two regressions described above, here is the procedure:

    docker compose stop changedetection
    # edit image: to dgtlmoon/changedetection.io:0.55.8 in docker-compose.yml
    docker compose pull changedetection
    docker compose up -d changedetection

    The datastore is compatible between both versions: your watches, filters, and snapshot history are preserved.

Choose a longer check interval (30 to 60 minutes) for public websites to remain a polite web citizen and avoid rate-limiting or IP blocks. Enable the jitter option to spread checks across the entire interval window and avoid hitting the target server at exactly the same second every time. If a check must be frequent (every 5 minutes), prefer targeting a very specific element via a CSS selector rather than the whole page: the diff is faster to compute and produces fewer false positives.

Start monitoring websites — deploy Changedetection.io on your ServOrbit VPS

One-click install, under 256 MB RAM, 80+ notification channels.

Need help?

Browse our help center and FAQ, or reach our team — callback, WhatsApp or email. Support in French, English and Arabic.

Message us on WhatsAppopens in a new tab