kit·intermediate·updated 2026-07-10

SiteWatch – Website Change Detection Kit

Monitor any website. Get alerted the second it changes.

PythonFlaskDocker

A self-hosted fork of changedetection.io — track page content with a visual selector, run scheduled or on-demand checks, and get notified over Discord, Slack, Telegram, email, or 100+ other channels the moment something moves.

Install

~60 seconds
terminal
bash
git clone https://github.com/yashthakur1/Change_Detection_14.git sitewatch
cd sitewatch
docker compose up -d
~/ what's inside

Already wired, so you can skip to features.

Visual selector tool

Point-and-click in the browser to pick exactly which element on a page to watch — no manual CSS/XPath needed.

AI-powered change summaries

Optional LLM integration (OpenAI, Gemini, Anthropic, Ollama) summarizes what actually changed instead of a raw diff.

Multi-channel notifications

Discord, Slack, Telegram, email, webhooks, and 100+ more via Apprise, with Jinja2-templated messages.

Browser automation steps

Script logins, form fills, and clicks before a check runs, so gated or interactive pages can be monitored too.

~/ the stack behind it

Every dependency has a reason.

  • Python (Flask)
    Core app, web UI, and scheduler in one process — no separate frontend to deploy.
  • Docker
    One `docker compose up -d` gets a running instance with persistent storage.
  • Playwright / Selenium
    Optional headless browser fetching for JS-heavy pages a plain HTTP GET can't see.
  • Apprise
    Notification fan-out to 100+ services (Discord, Slack, Telegram, email, webhooks) from one config.
~/ environment

Here's every env var, labeled.

Copy to .env.local. The included first-run script refuses to boot if any of them are missing — you'll know immediately.

.env.example
dotenv
PORT=5000
BASE_URL=http://localhost:5000
LOGGER_LEVEL=INFO
# Optional — headless browser fetching for JS-heavy pages
PLAYWRIGHT_DRIVER_URL=ws://sockpuppetbrowser:3000
# Optional — outbound proxy
HTTP_PROXY=
HTTPS_PROXY=
~/ walkthrough

Zero to first deploy.

This is the exact sequence we'd run from a blank directory. Steps are reproducible — if one fails, we want to know.

  1. 1. Start it with Docker

    Clone the repo and bring up the bundled docker-compose.yml — it maps the UI to 127.0.0.1:5000 and persists state in a named volume.

    docker compose up -d
  2. 2. Or run it directly with Python

    No Docker? Install the requirements and run the entry point directly, pointing -d at a local data folder.

    pip3 install -r requirements.txt
    python3 changedetection.py -d ./data -p 5000 -C
  3. 3. Add your first watch

    Open http://127.0.0.1:5000, paste a URL, and use the visual selector to pick the element to track. Set a check interval and you're monitoring.

  4. 4. Wire up notifications

    Add a notification URL under Settings (Apprise syntax) for Discord/Slack/Telegram/email/webhooks, and customize the alert text with Jinja2.

~/ known gotchas

The stuff that ate our afternoons.

Things we'd have wanted a heads-up on. Logged as we hit them.

  • !JS-heavy pages need the Playwright/Selenium browser service enabled (commented out by default in docker-compose.yml) — plain HTTP fetching won't render them.
  • !Data persists in a Docker named volume — back it up before `docker compose down -v` or you'll lose every configured watch.
  • !AI-powered change summaries require your own LLM API key (OpenAI/Gemini/Anthropic/Ollama); the feature is disabled without one.
  • !Respect target sites' terms of service and robots.txt — this can trivially be pointed at pages you don't have permission to poll on a schedule.
when not

If you need uptime/availability or response-time monitoring, this isn't it — it only detects content changes, not whether a site is up. Use a dedicated uptime monitor for that.

license: Custom (community edition + separate commercial license — see LICENSE.md)·star on github →

Got stuck, or want this shipped end-to-end for you? bitroot.club builds custom products for founders. →