v0.44
Some sites use JavaScript to create the content, for this you should use the Chrome/WebDriver Fetcher
You can use variables in the URL, perfect for inserting the current date and other logic, help and examples here
Current mode: Webpage Text/HTML, JSON and PDF changes.
Switch to re-stock detection mode.
Organisational tag/group name used in the main listing page
Currently using the default global settings, change to another value if you want to be specific.
Sends a notification when the filter can no longer be seen on the page, good for knowing when the page changed and your filter will not work anymore.

Use the Basic method (default) where your watched site doesn't need Javascript to render.

The Chrome/Javascript method requires a network connection to a running WebDriver+Chrome server, set by the ENV var 'WEBDRIVER_URL'.

Tip: Connect using BrightData Proxies, find out more here.
If you're having trouble waiting for the page to be fully rendered (text missing etc), try increasing the 'wait' time here.
This will wait n seconds before extracting the text.
Using the current global default settings
Run this code before performing change detection, handy for filling in fields and other actions More help and examples here
Request override is currently only used by the Basic fast Plaintext/HTTP Client method.
Headers can be also read from a file in your data-directory Read more here
(Not supported by Selenium browser)
Use system defaults
  • Use AppRise URLs for notification to just about any service! Please read the notification services wiki here for important configuration notes.
  • discord:// only supports a maximum 2,000 characters of notification text, including the title.
  • tgram:// bots cant send messages to other bots, so you should specify chat ID of non-bot user.
  • tgram:// only supports very limited HTML and can fail when extra tags are sent, read more here (or use plaintext/markdown format)
  • gets://, posts://, puts://, deletes:// for direct API calls (or omit the "s" for non-SSL ie get://)
  • Accepts the {{token}} placeholders listed below
Title for all notifications
Body for all notifications
Format for all notifications

You can use Jinja2 templating in the notification title, body and URL.

Token Description
{{base_url}} The URL of the changedetection.io instance you are running.
{{watch_url}} The URL being watched.
{{watch_uuid}} The UUID of the watch.
{{watch_title}} The title of the watch.
{{watch_tag}} The watch label / tag
{{preview_url}} The URL of the preview page generated by changedetection.io.
{{diff_url}} The URL of the diff output for the watch.
{{diff}} The diff output - only changes, additions, and removals
{{diff_added}} The diff output - only changes and additions
{{diff_removed}} The diff output - only changes and removals
{{diff_full}} The diff output - full difference output
{{current_snapshot}} The current snapshot value, useful when combined with JSON or CSS filters
{{triggered_text}} Text that tripped the trigger from filters

URLs generated by changedetection.io (such as {{diff_url}}) require the BASE_URL environment variable set.
Your BASE_URL var is currently ""
Warning: Contents of {{diff}}, {{diff_removed}}, and {{diff_added}} depend on how the difference algorithm perceives the change. For example, an addition or removal could be perceived as a change in some cases. More Here
Pro-tips:
  • Use the preview page to see your filters and triggers highlighted.
  • Some sites use JavaScript to create the content, for this you should use the Chrome/WebDriver Fetcher
One rule per line, any rules that matches will be used.
  • CSS - Limit text to this CSS rule, only text matching this CSS rule is included.
  • JSON - Limit text to this JSON rule, using either JSONPath or jq (if installed).
    • JSONPath: Prefix with json:, use json:$ to force re-formatting if required, test your JSONPath here.
    • jq: Prefix with jq: and test your jq here. Using jq allows for complex filtering and processing of JSON data with built-in functions, regex, filtering, and more. See examples and documentation here.
  • XPath - Limit text to this XPath rule, simply start with a forward-slash,
    • Example: //*[contains(@class, 'sametext')] or xpath://*[contains(@class, 'sametext')], test your XPath here
    • Example: Get all titles from an RSS feed //title/text()
Please be sure that you thoroughly understand how to write CSS, JSONPath, XPath, or jq selector rules before filing an issue on GitHub! here for more CSS selector help.
  • Remove HTML element(s) by CSS selector before text conversion.
  • Add multiple elements or CSS selectors per line to ignore multiple parts of the HTML.

Text filtering

Limit trigger/ignore/block/extract to;
Note: Depending on the length and similarity of the text on each line, the algorithm may consider an addition instead of replacement for example. So it's always better to select Added+Replaced when you're interested in new content.
When content is merely moved in a list, it will also trigger an addition, consider enabling Only trigger when unique lines appear
Good for websites that just move the content around, and you want to know when NEW content is added, compares new lines against all history for this watch.
  • Text to wait for before triggering a change/notification, all text and regex are tested case-insensitive.
  • Trigger text is processed from the result-text that comes out of any CSS/JSON Filters for this watch
  • Each line is processed separately (think of each line as "OR")
  • Note: Wrap in forward slash / to use regex example: /foo\d/
  • Each line processed separately, any line matching will be ignored (removed before creating the checksum)
  • Regular Expression support, wrap the entire line in forward slash /regex/
  • Changing this will affect the comparison checksum which may trigger an alert
  • Use the preview/show current tab to see ignores
  • Block change-detection while this text is on the page, all text and regex are tested case-insensitive, good for waiting for when a product is available again
  • Block text is processed from the result-text that comes out of any CSS/JSON Filters for this watch
  • All lines here must not exist (think of each line as "OR")
  • Note: Wrap in forward slash / to use regex example: /foo\d/
  • Extracts text in the final output (line by line) after other filters using regular expressions;
    • Regular expression ‐ example /reports.+?2022/i
    • Use //(?aiLmsux)) type flags (more information here)
    • Keyword example ‐ example Out of stock
    • Use groups to extract just that text ‐ example /reports.+?(\d+)/i returns a list of years only
  • One line per regular-expression/ string match

Sorry, this functionality only works with Playwright/Chrome enabled watches.

Enable the Playwright Chrome fetcher, or alternatively try our very affordable subscription based service.

This is because Selenium/WebDriver can not extract full page screenshots reliably.